2017-09-13 130 views
-2

我有以下程序,獲取超父類的方法名稱層次的子類

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

+0

你可以包含對'this.getClass()。getName()'的調用嗎? – jrtapsell

+0

A類是*不是* B或C的父類/超類。從類C的角度來看,'classAMethodStart'是調用者方法的調用者方法,並且沒有完全可靠的方法來獲取它。你可以做的最好的是['new Throwable().getStackTrace();'](https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html#getStackTrace--) 。 – Boann

+0

這不是'多重繼承'。這涉及擴展兩個類,Java不能這樣做。 –

回答

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()返回。每個元素表示一個單獨的堆棧幀。除堆棧頂部的堆棧外,所有堆棧都表示方法調用。堆棧頂部的框架表示生成堆棧跟蹤的執行點。通常,這是創建與堆棧跟蹤對應的throwable的點。

StackTraceElement有getMethodName()。使用這個功能,你必須追溯到你正在尋找的方法。

0

的一切都在這裏首先有幾件事情,我從你的代碼注意:1。 無法理解
2. NO調用(主要方法)
3.必須承擔控制流

基本上你代碼在可讀性方面確實很糟糕。
現在來真正的問題:

this.getClass()的getName();

1.這是指傳遞給該方法的隱式對象,換句話說,該方法被調用的對象。
2.getClass()作爲方法名稱建議爲您提供對象類類型「Class」的對象。
3.getName()爲您提供該類的名稱。

java命名約定在這裏很容易理解。這就是說,如果方法說getClass()爲什麼你期待的方法?