2011-02-03 51 views
2

使用反射可以获得几乎与某个类相关的所有内容。你可以获得所有声明的方法,字段和类(甚至可能更多),但是我找不到方法来反思某个方法,所以我可以找出该方法可能使用的类。反映方法范围变量的Java

本质上我想找出给定类所具有的其他类的所有依赖关系。

举例: 考虑下面的代码:

import com.yada.yada.yada.SomeClass 

public class MyClass 
{ 
    public MyClass 
    { 
    new SomeClass(); 
    } 
} 

我怎样才能找出MyClass的是它的构造函数使用SomeClass的?

我试图想到一种方式来获取在类文件中定义的所有导入语句,但我找不到任何方式。但是,假设有一种方法可以挖掘类文件中定义的所有导入语句,那么如何找到在同一个包中定义的类,这些类不需要导入语句?

编辑:

情景:我们的目标是这个类(MyClass的)的字节码发送到另一个进程。然后这个其他进程接受字节码并使用类加载器加载类(MyClass),依此类推。问题是,当我尝试在另一个进程中创建并运行MyClass的实例时,它失败了,因为它找不到SomeClass的定义。

如果SomeClass是MyClass的成员,它不会是一个问题,但由于唯一的引用是在一个方法中,没有办法通过反射来获得它?

回答

2

我认为最接近你可以得到所有类的依赖关系是通过挂钩类加载器机制,并记录当你正在检查的类被实例化并调用其方法时所加载的类。对于你而言,你还可以通过间接间接获得所有类,但取决于你想要对信息做什么,这可能是你实际需要的。

但是对于所有情况都是不可能的(想象一下在每次调用时使用Class.forName()来请求随机类名的方法)。

如何将一个了解在同一个包

这实际上是不可能的,一般做定义的类,因为类加载器的概念真的只允许要求一个完全合格的类名,要么获得该课程或ClassNotFoundException。类可以从web服务器(在小应用程序的情况下)加载或者随时生成,因此除了通过询问外,您无法知道特定的类是否存在。

+0

如果在这个过程中从未实例化该类(参见上次编辑,场景位),该怎么办? – JHollanti 2011-02-03 09:37:04

2

你不能(除非你反编译字节码)。局部变量不与任何类实例绑定,并且在类的大部分生命周期或其实例中都不存在,因此无法通过反射访问它。

你想达到什么目的?也许如果你告诉我们你的实际问题,而不是一个可感知的解决方案,我们就能够更好地提供帮助。

+0

编辑了这个问题。 – JHollanti 2011-02-03 09:34:32

1

反射不帮你在这里。我能想到的唯一方法就是通过像asm这样的字节码工具来实现这一点。

创建ClassVisitor

  • 类声明集依赖
  • 注解
  • 局部变量声明
  • 域声明
  • 方法声明
  • 方法调用
  • (我忘了什么?)