gpt4 book ai didi

Java反射(reflect)方法范围变量

转载 作者:行者123 更新时间:2023-11-30 06:36:24 25 4
gpt4 key购买 nike

使用反射你可以获得与类相关的几乎所有内容。您可以获得所有已声明的方法、字段和类(甚至可能更多),但我找不到反射(reflect)方法的方法,因此我无法找出该方法可能使用的类。

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

例子:给定以下代码:

import com.yada.yada.yada.SomeClass 

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

我如何才能发现 MyClass 在其构造函数中使用了 SomeClass?

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

编辑:

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

如果 SomeClass 是 MyClass 的成员,那将不是问题,但由于对它的唯一引用位于方法中,所以无法通过反射访问它吗?

最佳答案

我认为最接近获取一个类的所有依赖项的方法是挂接到类加载器机制,并记录在您正在检查的类被实例化并调用其方法时加载了哪些类。对于您自己,您也可以传递地获得它间接 依赖的所有类,但根据您想要对信息执行的操作,这可能是您实际需要的。

但不可能对所有情况都这样做(想象一下使用 Class.forName() 的方法每次调用时都要求随机类名)。

how would one find out about classes defined in the same package

这在一般情况下实际上是不可能做到的,因为类加载器的概念实际上只允许请求一个完全限定的类名,然后获取该类或 ClassNotFoundException。类可以从网络服务器加载(在小程序的情况下)或动态生成,因此除非询问,否则您无法知道特定类是否存在。

关于Java反射(reflect)方法范围变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com