Java 反射(reflect)方法作用域变量

标签 java reflection

使用反射,您几乎可以获得与类相关的所有内容。您可以获得所有声明的方法、字段和类(甚至可能更多),但我找不到反射(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/

相关文章:

c# - 为什么我的 .NET 属性不执行操作?

java - Spring MVC thymeleaf 随机崩溃

Golang 反射(reflect)在 slice 中获取结构成员

javascript - 作为参数传递的函数参数

java - JPA findBy 字段忽略大小写

c# - 在 C# 中,是否有任何神奇的方法可以在不将代码粘贴到各处的情况下从 ~1000 个测试用例函数中检查+提前返回?

c# - 从对象创建动态 Func<T, TResult>

java - 为类编写简单的电子表格处理器。 Location 类的方法未通过单元测试。有什么帮助吗?

java - 使用 Spring Security 的静态方法获取当前用户详细信息

Java 两个集合包含任意