Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取子类中的超级父类方法名称层次结构_Java_String_Inheritance_Multiple Inheritance_Core - Fatal编程技术网

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无法做到这一点。