2013-01-22 223 views
8

我有2個班,調用父類方法,比如說A & B:使用反射

Class A extends B { 
    public void subClassMthd(){ 
     System.out.println("Hello"); 
    } 
} 

Class B { 
    public void printHelloWorld { 
     System.out.println("Hello"); 
    } 
} 

現在,我使用反射來調用A類的方法我也想調用printHelloWorld方法目前在B級

我嘗試使用

Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Method superClassmthd = classAInstance.getClass() 
    .getSuperclass().getMethod("printHelloWorld", null); 
superClassmthd.invoke(classAInstance); 

還試圖作爲

Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Class superClazz = Class.forName(classAInstance.getClass().getSuperclass().getName()); 
Object superclassInstance = superClazz.newInstance(); 
Method superClassmthd = superclassInstance.getMethod("printHelloWorld", null); 
superClassmthd.invoke(superclassInstance); 

但他們都沒有工作;他們扔了一個InstantiationException

我在這裏做錯了什麼?

+0

目前還不清楚是什麼你正在嘗試做正是因爲你的代碼提供沒有任何意義。你能否提供你想要做的更多細節? –

+0

當您嘗試創建類的新實例時(而不是在調用常規方法時),可能會引發InstantiationException。你確定你正在尋找合適的位置來解決問題嗎? – jarnbjo

+0

你能否提供Exception Stacktrace和來自類B中方法的代碼,以及(如果存在)來自類A的重寫和/或重載方法?方法的簽名是足夠的 - 不需要完整的內部方法代碼。 –

回答

15

試試這個:

Method mthd = classAInstance.getClass().getSuperclass().getDeclaredMethod("XYZ"); 
mthd.invoke(classAInstance) 

的區別是使用getDeclaredMethod(),它得到的所有能見度(publicprotected,包/ default和private),而不是getMethod(),只獲得方法與public可見度的方法。

+0

謝謝,這工作 – Vivek

+0

這將調用classAInstance的XYZ方法。我只是測試它,它並沒有只調用classAInstance的super.XYZ()。 –

+2

@ user951793如果super方法被實例的類所覆蓋(而不是這個問題中的情況),那麼當然重寫的方法將被調用 - 該行爲是OOP的核心。 – Bohemian

2

你想調用的方法(公共,私人等)的可見性是什麼。 如果你想看看你不能直接調用的方法,你應該使用getDeclaredMethod()。

另外,你的類的構造函數是什麼樣的? InstantiationException表示您無法獲取類A(或B)的實例。

我有下面的代碼和它的作品:

A.java

import java.lang.reflect.Method; 

public class A extends B { 

    public static void main(String[] args) throws Exception { 
     A classAInstance = new A(); 
     Method mthd = classAInstance.getClass().getSuperclass().getMethod("XYZ", null); 
     mthd.invoke(classAInstance); 
    } 

} 

B.java

public class B { 

    public void XYZ() { 
     System.out.println("done"); 
    } 

} 
+0

謝謝,這個提示也適合我。 – Vivek