public class DicSex extends BaseDic {
static String male;
static String female;
}public class BaseDic {
static{
如何得到子类的类名?
我的目的:通过反射给子类的static赋值
作用: 给项目的数据字典赋值
}
}请问以我样的思路如何解决,另外有没有别的什么比较常用的给字典赋值的方法?
static String male;
static String female;
}public class BaseDic {
static{
如何得到子类的类名?
我的目的:通过反射给子类的static赋值
作用: 给项目的数据字典赋值
}
}请问以我样的思路如何解决,另外有没有别的什么比较常用的给字典赋值的方法?
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();
}
}
为什么一定要在静态块中呢? 这样不是可以达到你的需求的
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); }
}
而且,都是在静态代码块和静态属性中根据JVM加载类的原理,在获取class文件产生Class对象后,会首先加载类的静态代码块和给静态属性赋值,如果有父类,则首先加载父类的静态代码块和给静态属性赋值,然后是子类的静态初始化动作,再是父类的构造方法,然后执行子类的构造方法..当你在父类的静态初始化动作中 通过反射获取了子类的静态属性 并赋值后,当执行到子类的静态属性后,它还是会被重新被静态初始化为在子类中的赋值(没有初始化值则按照默认的赋值处理)。。到最后你还是没有赋值成功呀? 否则你永远不使用子类,一旦使用,上面的执行流程就会进行,总是得不到你想要的结果吧。。楼主提出这样蹩脚的需求时,就应该重新考虑下你的系统的设计了。也许设计模式 可以给你帮助。
在开发过程中会用到很多数据字典,比如说性别
我不知道成熟的开发过程中是如何使用的,我的想法是,
一个类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块放到父类中去.而每个字典的属性都不一样,就想到了用反射,
于是就有了一楼这样的问题.
不一定要用我这样的作法,只要能实现上面红色部分就行了
可是在实际应用中有些是不可取的,
我感觉还是lz的设计有问题,
既然都是从数据库中取值,为什么一定要在静态方法中做呢?
可以写个工具类,想要取值的时候传进去参数,之后过方法返回你想要的结果就可以了。
lz和static干上了
首先,我觉得,你第一种想法完全可行,没有什么不便于维护的。JDK里面也用到了很多这种方法,例如最常见的Integer.MAX_VALUE。他也并不是随配置变化,就是硬编码。因为这类信息相当于你程序里的标准,没有必要放在数据库。其次,如果你真的想动态读配置,那么第二个想法也可以,包括从db或者从xml里面读取都行。我的意见是,如果是male,female这种显而易见的分类,大可以直接写死。可能会发生需求变化的部分,则由配置文件指定。而第三个就大可不必了。
首先,你将所有static放在父类中本身就是不现实的,这才真正的是难维护。因为你不可能遇见将来所有你需要的static字段,那每当你需要新的static字段时,都返回来修改父类?OO设计的精髓在于方便扩展,即不需要改动现有代码(但可以添加新的代码)的前提下适合新的需求,而不是一有新的需求就修改父类。其次,我们继承父类的时候用的是什么关键字?extends吧,也就是说子类本身就是父类的一种扩充延伸。而在第三个设计中,将所有子类的信息集中放在父类里面,那继承该父类的子类怎么可能仅仅持有一部分父类的字段?当然,按照你的描述,如果反射行的通的话,确实有可能通过封装来屏蔽一些属性,这我没试过不敢妄言,不过感觉不太现实。不过即便可以实现,你觉得真的是一个好的设计吗?这样有多少个子类,你就需要在你的父类里添加相应的代码最后,最关键的一点,你这个设计的目的是什么?
减少如SexDic这种子类的数量?如果是这个目的的话,这个设计并没有起到任何作用。因为你还是有很多子类去继承父类。实际上的数目一点都没减少。
为了不把static块分散到每个子类中?实际上毫无整理的放在一起更不方便管理。另外提一下,这种类似功能通过枚举也可以实现。