如何在父类的static块中,得到子类的ClassName

charmw 2010-03-26 12:00:41
public class DicSex extends BaseDic {
static String male;
static String female;
}

public class BaseDic {
static{
如何得到子类的类名?
我的目的:通过反射给子类的static赋值
作用: 给项目的数据字典赋值
}
}

请问以我样的思路如何解决,另外有没有别的什么比较常用的给字典赋值的方法?
...全文
467 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2010-03-29
  • 打赏
  • 举报
回复
你定义这种东西 不是说需要哪个去查询哪个 一开始初始化的时候你全查出来 谁用谁调用不就完了
hjh811 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 brave_lxx 的回复:]
引用 11 楼 charmw 的回复:

谢谢大家的关注.说说的我想实现的东西吧
在开发过程中会用到很多数据字典,比如说性别
我不知道成熟的开发过程中是如何使用的,我的想法是,
一个类DicSex,它有两个final属性一个male(001),一个female(002).
当我在编码时,要用到"女"时,DicSex.female就能得到女所对应的编码002.
当然最简单的办法就是pu……
[/Quote]分析得很周详
chenliuyang 2010-03-28
  • 打赏
  • 举报
回复
楼主你别妄想了。 你都还没生出来怎么能知道你孩子呢
Brave_lxx 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 charmw 的回复:]

谢谢大家的关注.说说的我想实现的东西吧
在开发过程中会用到很多数据字典,比如说性别
我不知道成熟的开发过程中是如何使用的,我的想法是,
一个类DicSex,它有两个final属性一个male(001),一个female(002).
当我在编码时,要用到"女"时,DicSex.female就能得到女所对应的编码002.
当然最简单的办法就是public static final Stri……
[/Quote]

首先,我觉得,你第一种想法完全可行,没有什么不便于维护的。JDK里面也用到了很多这种方法,例如最常见的Integer.MAX_VALUE。他也并不是随配置变化,就是硬编码。因为这类信息相当于你程序里的标准,没有必要放在数据库。

其次,如果你真的想动态读配置,那么第二个想法也可以,包括从db或者从xml里面读取都行。我的意见是,如果是male,female这种显而易见的分类,大可以直接写死。可能会发生需求变化的部分,则由配置文件指定。

而第三个就大可不必了。
首先,你将所有static放在父类中本身就是不现实的,这才真正的是难维护。因为你不可能遇见将来所有你需要的static字段,那每当你需要新的static字段时,都返回来修改父类?OO设计的精髓在于方便扩展,即不需要改动现有代码(但可以添加新的代码)的前提下适合新的需求,而不是一有新的需求就修改父类。

其次,我们继承父类的时候用的是什么关键字?extends吧,也就是说子类本身就是父类的一种扩充延伸。而在第三个设计中,将所有子类的信息集中放在父类里面,那继承该父类的子类怎么可能仅仅持有一部分父类的字段?当然,按照你的描述,如果反射行的通的话,确实有可能通过封装来屏蔽一些属性,这我没试过不敢妄言,不过感觉不太现实。不过即便可以实现,你觉得真的是一个好的设计吗?这样有多少个子类,你就需要在你的父类里添加相应的代码

最后,最关键的一点,你这个设计的目的是什么?
减少如SexDic这种子类的数量?如果是这个目的的话,这个设计并没有起到任何作用。因为你还是有很多子类去继承父类。实际上的数目一点都没减少。
为了不把static块分散到每个子类中?实际上毫无整理的放在一起更不方便管理。

另外提一下,这种类似功能通过枚举也可以实现。
Mybeautiful 2010-03-27
  • 打赏
  • 举报
回复
BaseDic 的static根本不知道什么子类,所以你的设计就是错的,不可能实现.

把你的需求说清楚点,讨论哈.
justchenjie 2010-03-26
  • 打赏
  • 举报
回复
你的想法应该可以实现的,好像类似于EJB 3.0通过接口访问类,说道底也就是反射机制的应用
guoyueshan 2010-03-26
  • 打赏
  • 举报
回复
不能吧,父类怎么知道有哪个子类继承它,有几个子类呢
本末倒置了吧
ifrancis 2010-03-26
  • 打赏
  • 举报
回复
Class.forName() 可以吗
charmw 2010-03-26
  • 打赏
  • 举报
回复
在父类构造函数中做的话,DicSex.male是取不到值的.好像是因为DicSex.male的时候不有执行父类的构造函数
friendmine 2010-03-26
  • 打赏
  • 举报
回复
我觉得可以在构造函数里解决吧.
得当前类的所有成员变量就可以了.
为什么要这么做呢?
还有,这种东西,一般在构造函数里给吧.
没必要这么做.
这样从设计的角度来看真的别扭
方便面 2010-03-26
  • 打赏
  • 举报
回复
lz的想法是好的
可是在实际应用中有些是不可取的,
我感觉还是lz的设计有问题,
既然都是从数据库中取值,为什么一定要在静态方法中做呢?
可以写个工具类,想要取值的时候传进去参数,之后过方法返回你想要的结果就可以了。
lz和static干上了。。。
java_new_comer 2010-03-26
  • 打赏
  • 举报
回复
可以考虑instanceof 不?
charmw 2010-03-26
  • 打赏
  • 举报
回复
谢谢大家的关注.说说的我想实现的东西吧
在开发过程中会用到很多数据字典,比如说性别
我不知道成熟的开发过程中是如何使用的,我的想法是,
一个类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块放到父类中去.而每个字典的属性都不一样,就想到了用反射,
于是就有了一楼这样的问题.
不一定要用我这样的作法,只要能实现上面红色部分就行了
magicluo 2010-03-26
  • 打赏
  • 举报
回复
根据我的理解,是无法通过一个父类使用反射获取到这个类的所有子类的吧?

因为,理论上来说,只要可能,子类是可以无穷多个的,无限继承的..

重新进行你的系统设计吧。

libo_java 2010-03-26
  • 打赏
  • 举报
回复
你的需求对么? static 块 会优先于 父类的构造函数执行,但子类的实例化是需要首先实例化他的父类,父类的实例化又需要调用自身的构造函数,也就是说在你子类还没有创建的时候你就想去给子类属性赋值,我认为通过反射也是不可以的,因为子类根本没构建完成。再者说,如果有10个子类,你是如何判断是哪个子类?
magicluo 2010-03-26
  • 打赏
  • 举报
回复
我很不明白为什么楼主要在父类中访问子类 而且还是给静态的赋值? 那你为什么要继承呢?


而且,都是在静态代码块和静态属性中

根据JVM加载类的原理,在获取class文件产生Class对象后,会首先加载类的静态代码块和给静态属性赋值,如果有父类,则首先加载父类的静态代码块和给静态属性赋值,然后是子类的静态初始化动作,再是父类的构造方法,然后执行子类的构造方法..

当你在父类的静态初始化动作中 通过反射获取了子类的静态属性 并赋值后,当执行到子类的静态属性后,它还是会被重新被静态初始化为在子类中的赋值(没有初始化值则按照默认的赋值处理)。。

到最后你还是没有赋值成功呀? 否则你永远不使用子类,一旦使用,上面的执行流程就会进行,总是得不到你想要的结果吧。。

楼主提出这样蹩脚的需求时,就应该重新考虑下你的系统的设计了。也许设计模式 可以给你帮助。
charmw 2010-03-26
  • 打赏
  • 举报
回复
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);

}
}
libo_java 2010-03-26
  • 打赏
  • 举报
回复

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();
}
}




为什么一定要在静态块中呢? 这样不是可以达到你的需求的

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧