【问题标题】:Java reflecting on method scope variablesJava 反映方法范围变量
【发布时间】:2011-02-03 18:08:20
【问题描述】:

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

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

示例: 给定以下代码:

import com.yada.yada.yada.SomeClass 

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

我怎样才能知道 MyClass 在其构造函数中使用 SomeClass ?

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

编辑:

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

如果 SomeClass 是 MyClass 的成员,这不会有问题,但是由于对它的唯一引用在于方法,所以没有办法通过反射来获取它?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    我认为最接近于获取类的所有依赖项的方法是挂钩到类加载器机制并记录当您正在检查的类被实例化并调用其方法时加载了哪些类。其中,您还可以传递地获得它间接依赖的所有类,但取决于您想要对这些信息做什么,这可能是您真正需要的。

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

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

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

    【讨论】:

    • 如果有问题的类在此过程中从未实例化怎么办(参见最后的编辑,场景位)。
    • @JHollanti:那么如果它使用反射,你就完全不走运了。虽然你可以通过检查字节码得到直接依赖,但仍然存在间接依赖的问题。
    • 这太糟糕了。那么,回到绘图板。感谢您的帮助。
    • @JHollanti:您可能想调查(或直接使用)en.wikipedia.org/wiki/Jini,它已经解决了这些问题。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      创建一个 ClassVisitor 来收集依赖项

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多