public class DicSex extends BaseDic {
  static String male;
  static String female;
}public class BaseDic {
  static{
    如何得到子类的类名?
    我的目的:通过反射给子类的static赋值
    作用: 给项目的数据字典赋值
  }
}请问以我样的思路如何解决,另外有没有别的什么比较常用的给字典赋值的方法?

解决方案 »

  1.   

    在父类构造函数中做的话,DicSex.male是取不到值的.好像是因为DicSex.male的时候不有执行父类的构造函数
      

  2.   

    你的想法应该可以实现的,好像类似于EJB 3.0通过接口访问类,说道底也就是反射机制的应用
      

  3.   


    package test;public class father {    public father(){
            System.out.println(this.getClass().getName());
        }
    }package test;public class child extends father {
        
        public static void main(String[] args){
            child c1 = new child();
        }
    }
    为什么一定要在静态块中呢? 这样不是可以达到你的需求的
      

  4.   

    package test;public class father {
        static {
           
        }
        public father(){
            通过反射给male和femle赋值.    
        }
    }package test;public class child extends father {
       static String male;
       static String female;
    }public class Test {
       public static void main(String[] args){
            // 下面是取不到值的.因为father的构造函数没有执行.
            // 但是会执行father的static块,所以我想在static块中通过反射赋值,但不知道怎么
             // 取到Child的类名 
            System.out.println(Child.male);    }
    }
      

  5.   

    我很不明白为什么楼主要在父类中访问子类  而且还是给静态的赋值? 那你为什么要继承呢?
    而且,都是在静态代码块和静态属性中根据JVM加载类的原理,在获取class文件产生Class对象后,会首先加载类的静态代码块和给静态属性赋值,如果有父类,则首先加载父类的静态代码块和给静态属性赋值,然后是子类的静态初始化动作,再是父类的构造方法,然后执行子类的构造方法..当你在父类的静态初始化动作中 通过反射获取了子类的静态属性 并赋值后,当执行到子类的静态属性后,它还是会被重新被静态初始化为在子类中的赋值(没有初始化值则按照默认的赋值处理)。。到最后你还是没有赋值成功呀?  否则你永远不使用子类,一旦使用,上面的执行流程就会进行,总是得不到你想要的结果吧。。楼主提出这样蹩脚的需求时,就应该重新考虑下你的系统的设计了。也许设计模式 可以给你帮助。
      

  6.   

    你的需求对么? static 块 会优先于 父类的构造函数执行,但子类的实例化是需要首先实例化他的父类,父类的实例化又需要调用自身的构造函数,也就是说在你子类还没有创建的时候你就想去给子类属性赋值,我认为通过反射也是不可以的,因为子类根本没构建完成。再者说,如果有10个子类,你是如何判断是哪个子类?
      

  7.   

    谢谢大家的关注.说说的我想实现的东西吧
    在开发过程中会用到很多数据字典,比如说性别
    我不知道成熟的开发过程中是如何使用的,我的想法是,
    一个类DicSex,它有两个final属性一个male(001),一个female(002).
    当我在编码时,要用到"女"时,DicSex.female就能得到女所对应的编码002.
    当然最简单的办法就是public static final String female = "002"这样硬编码.但这不便于维护. 
    比较好的方法是:DB中有一个表叫dic_sex,该表有两条记录001 男| 002 女对于单个类DicSex,可在其中加一个static块,在该块中读DB,再为两个属性赋值.
    但这样的字典一般会很多(如:单位,职位,课程...),在每个类中都写一样的static块不是很方便,
    所以我希望通过继承一个父类,把这些重复的static块放到父类中去.而每个字典的属性都不一样,就想到了用反射,
    于是就有了一楼这样的问题.
    不一定要用我这样的作法,只要能实现上面红色部分就行了
      

  8.   

    lz的想法是好的
    可是在实际应用中有些是不可取的,
    我感觉还是lz的设计有问题,
    既然都是从数据库中取值,为什么一定要在静态方法中做呢?
    可以写个工具类,想要取值的时候传进去参数,之后过方法返回你想要的结果就可以了。
    lz和static干上了
      

  9.   

    BaseDic 的static根本不知道什么子类,所以你的设计就是错的,不可能实现.把你的需求说清楚点,讨论哈.
      

  10.   


    首先,我觉得,你第一种想法完全可行,没有什么不便于维护的。JDK里面也用到了很多这种方法,例如最常见的Integer.MAX_VALUE。他也并不是随配置变化,就是硬编码。因为这类信息相当于你程序里的标准,没有必要放在数据库。其次,如果你真的想动态读配置,那么第二个想法也可以,包括从db或者从xml里面读取都行。我的意见是,如果是male,female这种显而易见的分类,大可以直接写死。可能会发生需求变化的部分,则由配置文件指定。而第三个就大可不必了。
    首先,你将所有static放在父类中本身就是不现实的,这才真正的是难维护。因为你不可能遇见将来所有你需要的static字段,那每当你需要新的static字段时,都返回来修改父类?OO设计的精髓在于方便扩展,即不需要改动现有代码(但可以添加新的代码)的前提下适合新的需求,而不是一有新的需求就修改父类。其次,我们继承父类的时候用的是什么关键字?extends吧,也就是说子类本身就是父类的一种扩充延伸。而在第三个设计中,将所有子类的信息集中放在父类里面,那继承该父类的子类怎么可能仅仅持有一部分父类的字段?当然,按照你的描述,如果反射行的通的话,确实有可能通过封装来屏蔽一些属性,这我没试过不敢妄言,不过感觉不太现实。不过即便可以实现,你觉得真的是一个好的设计吗?这样有多少个子类,你就需要在你的父类里添加相应的代码最后,最关键的一点,你这个设计的目的是什么?
    减少如SexDic这种子类的数量?如果是这个目的的话,这个设计并没有起到任何作用。因为你还是有很多子类去继承父类。实际上的数目一点都没减少。
    为了不把static块分散到每个子类中?实际上毫无整理的放在一起更不方便管理。另外提一下,这种类似功能通过枚举也可以实现。