通过堆栈跟踪进行Java反射

时间:2012-10-05 02:55:49

标签: java reflection stack-trace

在Java中,可以编写如下代码来查询堆栈:

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement frame : stack) {
    System.out.println(frame.getClassName() + "." + frame.getMethodName());
}

是否有可能获得堆栈的反射视图,而不仅仅是获取类和方法的名称,而是获取Class和Method实例?如果一个类中的两个方法共享一个名称(具有不同的参数),我可以在堆栈上区分它们吗?

2 个答案:

答案 0 :(得分:2)

Class位很容易。使用Class.forName(String)

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement frame : stack) {
    String fqcn = frame.getClassName();
    Class<?> clazz = Class.forName(fqcn);
}
  

如果一个类中的两个方法共享一个名称(具有不同的参数),我可以在堆栈中区分它们吗?

我不这么认为,因为StackTraceElement#getMethodName()返回的方法名称不包含参数编号&amp;类型信息,这是您需要区分具有相同名称的方法。

答案 1 :(得分:2)

  

是否有可能获得堆栈的反射视图,而不仅仅是获取类和方法的名称,而是获取Class和Method实例?

您可以通过在类字符串上调用Class来获取Class.forName个实例;见Matt Ball的回答。 (嵌套/内部/匿名类可能有点棘手......)

  

如果一个类中的两个方法共享一个名称(具有不同的参数),我可以在堆栈中区分它们吗?

只有拥有源代码,您的应用程序才会使用调试信息进行编译,并且能够解析它以确定哪些行号对应于哪个方法重载。最后一项工作要付出很多,而且计算成本也很高。

(这种方法也存在理论上的问题。可以在一行上编写带有多个方法重载的Java源代码。如果这样做,就不可能将这些方法与栈跟踪中的信息区分开来。 。)