在Java中,可以编写如下代码来查询堆栈:
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement frame : stack) {
System.out.println(frame.getClassName() + "." + frame.getMethodName());
}
是否有可能获得堆栈的反射视图,而不仅仅是获取类和方法的名称,而是获取Class和Method实例?如果一个类中的两个方法共享一个名称(具有不同的参数),我可以在堆栈上区分它们吗?
答案 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源代码。如果这样做,就不可能将这些方法与栈跟踪中的信息区分开来。 。)