使用反射,您可以获得与课程相关的所有内容。你可以获得所有声明的方法,字段和类(甚至可能更多),但我找不到一种方法来反映一个方法,所以我可以找出该方法可能使用的类。
基本上我想找出给定类具有的其他类的所有依赖项。
实施例: 给出以下代码:
import com.yada.yada.yada.SomeClass
public class MyClass
{
public MyClass
{
new SomeClass();
}
}
我如何才能发现MyClass在其构造函数中使用SomeClass?
我试图想出一种方法来获取在类文件中定义的所有import语句,但我也找不到任何方式。但是,假设有一种方法可以以某种方式挖掘类文件中定义的所有import语句,那么如何找到在同一个包中定义的类,这些类不需要import语句?
编辑:
场景:目标是将此类(MyClass)的字节码发送到另一个进程。然后,这个其他进程接受字节码并使用类加载器加载类(MyClass),依此类推。问题是,当我尝试在另一个进程中创建并运行MyClass的实例时,它失败了,因为它无法找到SomeClass的定义。
如果SomeClass是MyClass的成员,那么这不会有问题,但由于对它的唯一引用在于一个方法,所以没有办法通过反射来实现它?
答案 0 :(得分:2)
你不能(除非你反编译字节码)。局部变量不与任何类实例绑定,并且在类或其实例的大部分生命周期内甚至不存在,因此您无法通过反射访问它。
你想要达到什么目的?也许如果你告诉我们你的实际问题,而不是一个感知的解决方案,我们就能更好地提供帮助。
答案 1 :(得分:2)
我认为最接近获得所有类的依赖关系的方法是通过挂钩类加载器机制并记录当您正在检查的类被实例化并调用其方法时加载的类。在yourse中,你也可以传递它间接所依赖的所有类,但是根据你想要对信息做什么,这可能是你真正需要的。
但是对于所有情况都不可能做到(想象一下每次调用时都会使用Class.forName()
来请求随机类名的方法。)
如何找到在同一个包中定义的类
一般来说这实际上是不可能的,因为类加载器概念实际上只允许要求一个完全限定的类名,并且要么获得该类或ClassNotFoundException
。可以从Web服务器(在applet的情况下)加载类或者动态生成类,因此除了要求它之外,您无法知道特定的类是否存在。
答案 2 :(得分:1)
反思对你没有帮助。我能想到的唯一方法就是通过像asm这样的字节码工具。
创建一个从
收集依赖关系的ClassVisitor