使用反射,您几乎可以获得与类相关的所有内容。您可以获得所有声明的方法、字段和类(甚至可能更多),但我找不到反射(reflect)方法的方法,因此我可以找出该方法可能使用的类。
本质上我想找出给定类所具有的对其他类的所有依赖关系。
示例: 给出以下代码:
import com.yada.yada.yada.SomeClass
public class MyClass
{
public MyClass
{
new SomeClass();
}
}
我如何知道 MyClass 在其构造函数中使用 SomeClass?
我试图想出一种方法来获取类文件中定义的所有导入语句,但我也找不到任何这种方式。但是,假设有一种方法可以以某种方式挖掘类文件中定义的所有导入语句,那么如何找到同一包中定义的不需要导入语句的类呢?
编辑:
场景:目标是将此类(MyClass)的字节码发送到另一个进程。然后,另一个进程接收字节码并使用类加载器加载类 (MyClass),依此类推。问题是,当我尝试在另一个进程中创建并运行 MyClass 的实例时,它会失败,因为它找不到 SomeClass 的定义。
如果 SomeClass 是 MyClass 的成员,那不会有问题,但由于对它的唯一引用位于方法中,因此无法通过反射访问它?
最佳答案
我认为最接近获取类的所有依赖项的方法是 Hook 类加载器机制并记录当您正在检查的类被实例化并调用其方法时加载哪些类。其中,您还可以传递地获得它间接依赖的所有类,但是根据您想要如何处理这些信息,这可能是您实际需要的。
但这不可能适用于所有情况(试想一下,有一个方法每次调用时都使用 Class.forName()
来请求随机类名)。
how would one find out about classes defined in the same package
这实际上是不可能的,因为类加载器概念实际上只允许请求完全限定的类名,并且要么获取该类,要么获取 ClassNotFoundException
。类可以从网络服务器加载(对于小程序)或动态生成,因此您无法知道特定类是否存在,除非询问它。
关于Java 反射(reflect)方法作用域变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884221/