2011-11-03 54 views
1

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

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

Reflections库可以处理相当多的。

根据“参与创建的内容”,您需要将其从字节码中提取出来。有几个库可以帮助解决这个问题,比如ASM和BCEL。如果你只需要全部依赖关系,DepFind可能就足够了。

如果您需要将自己限制为您所说的“创建过程中涉及的内容”,那么您只需要ctor调用的类和ctor调用的方法。

如果一个类使用任何的反映,但是,所有的赌注都关闭 - 这些类型的依赖关系是很难跟踪,这是难以/无法确定什么是用于实际上

+0

ASM或BCEL可以帮助在上面的例子中获得到'Integer'和'Foo'的链接? – yegor256

+0

@ yegor256是;你会询问方法来提取所有使用的完全合格的类名。也就是说,我不清楚你是否需要手动执行此操作,或者是否已经使用DepFind或类似操作。 –

1

当然,你可以使用反射。 obj.getClass()返回你自己的类,obj.getClass().getParent()返回它的父类。然后您可以拨打getParent(),直到您到达Object

接口,字段,方法,注释也是如此。请不要忘记,您应该拨打getDeclaredMethods()getDeclaredFields()以获取包括私人在内的所有方法和字段。你必须致电setAccessible(true)与私人成员打交道。

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

+0

在上面的例子中反射不会给我'整数'和'Foo',因为它可以处理静态字节码结构,我还需要找到运行时对象的链接 – yegor256

相关问题