2012-06-11 70 views
2

下面是代碼片段,我試圖調用使用REFLECTION的usingClass方法。當我傳遞一個Child類型的對象時直接調用usingClass()方法(不帶反射),儘管當我嘗試使用Reflection時實現相同的事情時,它會拋出NoSuchMethodFoundException。想了解我是否錯過了某些東西,或者有沒有邏輯背後的邏輯?請幫助在Java中調用使用Reflection的方法無法找到方法,當方法的基類爲參數

package Reflection; 

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class TestMethodInvocation { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     TestMethodInvocation test = new TestMethodInvocation(); 
     Child child = new Child(); 
     Parent parent = (Parent)child; 
     Class<? extends Parent> argClassType = parent.getClass(); 
     Class<? extends TestMethodInvocation> thisClassType = test.getClass(); 

     test.usingClass(child); 

     Method methodToCall; 
     try { 
      methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType); 
      methodToCall.invoke(test, parent); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private void usingClass(Parent p){ 
     System.out.println("UsingClass: " + p.getClass()); 
    } 


} 

輸出如下。

UsingClass: class Reflection.Child 
java.lang.NoSuchMethodException: Reflection.TestMethodInvocation.usingClass(Reflection.Child) 
    at java.lang.Class.getDeclaredMethod(Unknown Source) 
    at Reflection.TestMethodInvocation.main(TestMethodInvocation.java:20) 
+0

發佈代碼示例時,請考慮執行以下操作:刪除自動生成的註釋,以及在與該問題沒有直接關係時捲起異常處理。謝謝! –

回答

1

您應該使用

methodToCall = thisClassType.getDeclaredMethod("usingClass", Parent.class); 

因爲精確的確切類的parent(這是兒童),用於在運行時和可變拿着它的類型改變不了什麼。

另一個(太重)的方式來解決這將是:

Class<? extends Parent> argClassType2 = (new Parent()).getClass(); 
... 
    methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType2); 
+1

這解決了錯誤原因的問題。泛型在運行時被擦除,因此在Class <?之間的運行時沒有實際差異。繼承Parent>和Class 。查看Jochen的迴應是否有正確的理由。 – Pablo

+0

子級繼承父級如下所示 包反射; public class Parent { \t public Parent(){}; } ----------------------------------------- package reflection; public class Child extends Parent { \t public Child(){ \t \t super(); \t} } – user1448281

+0

@Pablo:你說得對。我編輯了我的答案(並提出了Jochen;))。 –

4

您的代碼不工作的原因是getClass()動態綁定。投射到父項不會影響對象的運行時類型,因此變量childparent包含相同的類對象。 除非您通過getGenericSuperclass()或類似的東西顯式查詢您的實例的父類,否則您將不得不使用由dystroy提到的靜態方法。

相關問題