1

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

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

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

4

2 回答 2

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()不包含参数编号和类型信息,这是您需要区分具有相同名称的方法的内容。

于 2012-10-05T02:58:01.430 回答
2

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

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

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

仅当您拥有源代码时,您的应用程序才会使用调试信息进行编译,并且它能够解析它以找出哪些行号对应于哪些方法重载。最后一个需要大量的工作来实现,而且计算成本很高。

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

于 2012-10-05T03:06:35.360 回答