获取子类中的超级父类方法名层次结构

问题描述 投票:0回答:3

我有以下程序,

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()

java string inheritance multiple-inheritance
3个回答
1
投票

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();
  }
}

0
投票

您必须使用

java.lang.StackTraceElement
来获取方法名称。

根据Java文档:

堆栈跟踪中的元素,由 Throwable.getStackTrace() 返回。每个元素代表一个堆栈帧。除了堆栈顶部的堆栈帧之外的所有堆栈帧都表示方法调用。堆栈顶部的帧表示生成堆栈跟踪的执行点。通常,这是创建与堆栈跟踪相对应的可抛出对象的点。

StackTraceElement 有

getMethodName()
。使用这个函数,你必须追溯到你正在寻找的方法。


0
投票

首先,这是我从您的代码中注意到的几件事: 1. 无法理解
2. 禁止调用(主要方法)
3. 必须承担控制流程

基本上你的代码可读性真的很差。
现在来谈谈真正的问题:

this.getClass().getName();

1.This 指的是传递给方法的隐式对象,即调用该方法的对象。
2.getClass() 正如方法名称所示,为您提供对象类的“Class”类型的对象。
3.getName() 为您提供类的名称。

java命名约定在这里很容易理解。也就是说,如果该方法说 getClass() 那么您为什么期待该方法??

© www.soinside.com 2019 - 2024. All rights reserved.