如何获取一个基类的多个继承类中的最外层继承类?

THEBEST 2011-08-17 02:35:41

class Base;

class Extend extends Base;

class SubExtend extends Extend;

我现在找到Base的所有子类包括Extend, SubExtend

但我如何定位到SubExtend就是最外层的子类呢?

即我要实现这样的方法 Class findOuterExtend(List extendsClass);
...全文
177 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2011-08-18
  • 打赏
  • 举报
回复
....刚才百度了下 发现无耻的人是我

http://topic.csdn.net/u/20100504/16/9e1f6b81-63e3-4b4b-b37f-e1a3f064f4c2.html

函数有待优化...
BearKin 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 thebest 的回复:]

class Base;

class Extend extends Base;

class SubExtend extends Extend;

我现在找到Base的所有子类包括Extend, SubExtend

但我如何定位到SubExtend就是最外层的子类呢?

即我要实现这样的方法 Class findOuterExtend(List extendsClas……
[/Quote]

利用ClassLoader加载所有的class文件然后逐个用instanceof比较
不过我记得曾经有人问过这个问题 回复的人用一个非常无耻的方式解决了 忘记在哪了
lost_guy_in_scut 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zl3450341 的回复:]

如果是获取所有的超类,是可行的。但是获取所有的子类,不现实
[/Quote]
恩恩
神经斌 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 spiniper 的回复:]
我擦,这还不简单,获得当前类的Class对象,然后循环获得父类Class对象,直到这个类的对象指向的是java.lang.Object类(这个是所有类的顶层类),然后取它前面的那个类就是你所定义的那个所谓的最外层类了。
[/Quote]

人家要的是叶子上的类,你带人往树根上走,还后退一步?
softroad 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 spiniper 的回复:]

我擦,这还不简单,获得当前类的Class对象,然后循环获得父类Class对象,直到这个类的对象指向的是java.lang.Object类(这个是所有类的顶层类),然后取它前面的那个类就是你所定义的那个所谓的最外层类了。
[/Quote]

你想的真简单
  • 打赏
  • 举报
回复
是不是要用到递归呀
树成 2011-08-17
  • 打赏
  • 举报
回复
我擦,这还不简单,获得当前类的Class对象,然后循环获得父类Class对象,直到这个类的对象指向的是java.lang.Object类(这个是所有类的顶层类),然后取它前面的那个类就是你所定义的那个所谓的最外层类了。
luohuijun619 2011-08-17
  • 打赏
  • 举报
回复
找子类好像不行
qybao 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zl3450341 的回复:]
宝哥,你这个也不行撒。。

你这是在已知有那些类型的情况下,相当于在一个集合中选取T 的甩的子类。。。
[/Quote]

所以我说这个前提是在参数的list中查找,至于没被加载的,那就没办法了。
看LZ的问题描述和代码,感觉LZ是在已经类型的前提下查找的,即已知类型都保存在List中。
zl3450341 2011-08-17
  • 打赏
  • 举报
回复
宝哥,你这个也不行撒。。

你这是在已知有那些类型的情况下,相当于在一个集合中选取T 的甩的子类。。。

qybao 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qybao 的回复:]
for example

Java code

public class Test {
public static void main(String[] args) {
List<Class<? extends A>> list = new ArrayList<Class<? extends A>>();
list.add(A.class);
……
[/Quote]

前提是在参数的list中查找最外层,没有加载的就没办法了。
qybao 2011-08-17
  • 打赏
  • 举报
回复
for example
public class Test {
public static void main(String[] args) {
List<Class<? extends A>> list = new ArrayList<Class<? extends A>>();
list.add(A.class);
list.add(C.class);
list.add(B.class);
Class<? extends A> cls = findOuterClass(list);
System.out.println(cls);
}

public static <T> Class<? extends T> findOuterClass(List<Class<? extends T>> list) {
if (list == null || list.size() == 0)
return null;

Class<? extends T> outerClass = list.get(0);
for (int i=0; i<list.size(); ) {
try {
Class<? extends T> cls = list.get(i);
cls = outerClass.asSubclass(cls);
i++;
} catch (Exception e) {
outerClass = list.get(i);
}
}
return outerClass;
}
}

class A {

}

class B extends A {

}

class C extends B {

}
shuwei003 2011-08-17
  • 打赏
  • 举报
回复
5楼说的对
zl3450341 2011-08-17
  • 打赏
  • 举报
回复
如果是获取所有的超类,是可行的。但是获取所有的子类,不现实
龙四 2011-08-17
  • 打赏
  • 举报
回复
我想是做不到的,一个类,只有用到了的时候才会加载到内存,如果存在一个类,但这个类暂时还没用到(后续可能会用到),就不会存在于内存中,怎么找?
softroad 2011-08-17
  • 打赏
  • 举报
回复
extendsClass参数是怎么来的?
THEBEST 2011-08-17
  • 打赏
  • 举报
回复
用反射??

我自己写了一个方法:

public static Class<?> getOuterExtendClass(List<Class<?>> extendsClass) {
if (extendsClass == null)
return null;

Class<?> outerClass = extendsClass.get(0);

for (int i = 1; i < extendsClass.size(); i++) {
Class cls = extendsClass.get(i);
if (outerClass.isAssignableFrom(cls))
outerClass = cls;
}
return outerClass;
}
风尘中国 2011-08-17
  • 打赏
  • 举报
回复
你这个想法需要用java的反射来实现,在apache提供的common-beans组件里面提供了对JavaBean的一些处理可以借鉴下

62,614

社区成员

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

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