反映方法范围变量的Java

使用reflection,您可以获得与课程相关的所有内容。 你可以获得所有声明的方法,字段和类(甚至可能更多),但我找不到一种方法来反映一个方法,所以我可以找出该方法可能使用的类。

基本上我想找出给定类具有的其他类的所有依赖项。

示例:给出以下代码:

import com.yada.yada.yada.SomeClass public class MyClass { public MyClass { new SomeClass(); } } 

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

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

编辑:

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

如果SomeClass是MyClass的成员,那么这不会是一个问题,但由于对它的唯一引用存在于一个方法中,所以没有办法通过reflection来实现它?

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

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

如何找到在同一个包中定义的类

实际上这通常是不可能的,因为类加载器概念实际上只允许请求一个完全限定的类名,并且获取该类或ClassNotFoundException 。 可以从Web服务器(在applet的情况下)加载类或在运行时生成类,因此除了要求它之外,您无法知道特定类是否存在。

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

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

反思对你没有帮助。 我能想到的唯一方法就是通过像asm这样的字节码工具。

创建一个ClassVisitor收集依赖关系的ClassVisitor

  • 类声明
  • 注释
  • 局部变量声明
  • 现场声明
  • 方法声明
  • 方法调用
  • (我忘了什么吗?)