我有以下程序,
class A
{
int i;
B b_obj = new B();
public void classAMethodStart()
{
system.out.println("class a method");
b_obj.classBMethod();
}
}
class B extends Class C
{
public void classBMethod()
{
methodInClassC();
}
}
class C
{
public void methodInClassC()
{
//.. to do stuff
//I want to get the ClassA method name here
this.getClass().getName();
}
}
当我尝试以下
this.getClass().getName()
时,它给出的输出为
java.lang.ClassB
我想要打印的预期输出是:
classAMethodStart()
this.getClass().getName()
做什么它获取被调用的对象,并获取其类的名称,因为您的实例是 B 的实例,所以它输出
java.lang.ClassB
您需要获取线程的堆栈跟踪并返回它以获取调用方法的详细信息:
class A {
B b_obj = new B();
public void classAMethodStart() {
System.out.println("class a method");
b_obj.classBMethod();
}
}
class B extends C {
public void classBMethod() {
methodInClassC();
}
}
class C {
public void methodInClassC() {
final StackTraceElement[] trace = Thread.currentThread().getStackTrace();
System.out.println(trace[3].getMethodName());
}
}
class Runner {
public static void main(final String... args) {
new A().classAMethodStart();
}
}
您必须使用
java.lang.StackTraceElement
来获取方法名称。
根据Java文档:
堆栈跟踪中的元素,由 Throwable.getStackTrace() 返回。每个元素代表一个堆栈帧。除了堆栈顶部的堆栈帧之外的所有堆栈帧都表示方法调用。堆栈顶部的帧表示生成堆栈跟踪的执行点。通常,这是创建与堆栈跟踪相对应的可抛出对象的点。
StackTraceElement 有
getMethodName()
。使用这个函数,你必须追溯到你正在寻找的方法。
首先,这是我从您的代码中注意到的几件事:
1. 无法理解
2. 禁止调用(主要方法)
3. 必须承担控制流程
基本上你的代码可读性真的很差。
现在来谈谈真正的问题:
this.getClass().getName();
1.This 指的是传递给方法的隐式对象,即调用该方法的对象。
2.getClass() 正如方法名称所示,为您提供对象类的“Class”类型的对象。
3.getName() 为您提供类的名称。
java命名约定在这里很容易理解。也就是说,如果该方法说 getClass() 那么您为什么期待该方法??