Java 获取子类中的超级父类方法名称层次结构
我有下面的节目,Java 获取子类中的超级父类方法名称层次结构,java,string,inheritance,multiple-inheritance,core,Java,String,Inheritance,Multiple Inheritance,Core,我有下面的节目, 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() {
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
如何获取调用方法的详细信息
您需要获取线程的stacktrace,然后向上走,以获取调用方法的详细信息:
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.StackTraceeElement
获取方法名
根据Java文档:
堆栈跟踪中的元素,由Throwable.getStackTrace()返回。每个元素表示一个堆栈帧。除了位于堆栈顶部的堆栈帧之外,所有堆栈帧都表示方法调用。堆栈顶部的帧表示生成堆栈跟踪的执行点。通常,这是创建与堆栈跟踪对应的throwable的点
StackTraceeElement具有
getMethodName()
。使用此函数,您必须追溯到您正在寻找的方法。首先,我从您的代码中注意到以下几点:
1.不可理解2.无调用(主方法)
3.必须假设控制流
基本上,您的代码在可读性方面非常差。
现在来看真正的问题:
this.getClass().getName()
1.这是指传递给方法的隐式对象,即调用方法的对象。
2.getClass()方法名建议您使用object类的“Class”类型的对象。
3.getName()提供类的名称
java命名约定在这里很容易理解。也就是说,如果该方法说getClass(),那么您为什么期望该方法???您可以包含对您添加的
this.getClass().getName()
的调用吗?类A不是B或C的父类/超类。从类C的角度来看,classAMethodStart
是调用方方法的调用方方法,而且没有完全可靠的方法来获得它。你所能做的就是。这不是多重继承。这涉及到扩展的两个类,Java无法做到这一点。