如何获得“参与”给定对象的所有类?

时间:2011-11-03 14:06:06

标签: java reflection

我有一个java对象,类Object的一个实例 - 这就是我所知道的。现在我需要创建一个参与其创建的Class - es列表,包括它自己的类,所有父类,所有类的属性和方法。例如:

List obj = new ArrayList();
obj.add(new Integer(4));
obj.add(new Foo());
System.out.println(allRelatedClasses(obj));

应输出如下内容:

Object, List, Collection, Iterable, Serializable, Cloneable, RandomAccess, 
ArrayList, Integer, Foo

有可能吗?

2 个答案:

答案 0 :(得分:2)

Reflections库可以处理相当多的内容。

就“参与其创作的内容”而言,您需要将其从字节码中拉出来。有几个库可以帮助解决这个问题,比如ASM和BCEL。如果您只需要所有依赖项,DepFind可能就足够了。

如果你需要限制自己所说的“创作所涉及的内容”,那么你只需要ctor所调用的类和方法所涉及的类。

如果一个类使用任何反射,但是所有的注意都被关闭 - 这些类型的依赖关系难以追踪,并且很难/不可能确定实际使用的内容。

答案 1 :(得分:1)

当然,你可以用反射来做。 obj.getClass()返回您自己的类,obj.getClass().getParent()返回其父级。然后,您可以循环拨打getParent(),直到您到达Object

接口,字段,方法,注释也是如此。不要忘记,您应该致电getDeclaredMethods()getDeclaredFields()以获取所有方法和字段,包括私有。你必须致电setAccessible(true)来处理私人会员。

1小时的工作,你就完成了。走!祝你好运。