2013-10-17 61 views
2

我想弄清楚如何使用反射。我已經建立了2班一個擁有數java.lang.IllegalArgumentException:對象不是聲明類的實例

public class Reflectee { 

    String str; 

    public Reflectee(String str){ 
     this.str=str; 
    } 

    public Reflectee(){ 

    } 
    public boolean doSomething(String str){ 
     boolean flag=true; 
     try{ 
      Integer.parseInt(str); 
     }catch (NumberFormatException e){ 
      flag=false; 
     } 
     return flag; 
    } 
} 

,然後我創建了將使用反射調用DoSomething的方法的類基本驗證。

public class Reflector { 

    private String str="22"; 

    public boolean reflect(){ 
     Reflectee r=new Reflectee(); 
     Class clazz=r.getClass(); 
     boolean b=false; 
     try { 
      Method m=clazz.getDeclaredMethod("doSomething",String.class); 
      b=(Boolean)m.invoke(this,str); //Exception is here 
     } catch (NoSuchMethodException | SecurityException | 
       IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return b; 
    } 
} 

我得到當我試圖調用一個方法的異常的異常是

java.lang.IllegalArgumentException: object is not an instance of declaring class 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.app.example2.Reflector.reflect(Reflector.java:16) 
    at com.app.example2.test.Reflector_UT.test(Reflector_UT.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

我相信,我失去了一些東西未成年人。任何想法有什麼不對?

感謝

回答

4

問題是以下行

b=(Boolean)m.invoke(this,str); //Exception is here 

您必須將Reflectee對象上調用方法,而不是這個(反射物體)

b=(Boolean)m.invoke(r,str); //Exception is here 
+0

這工作但是當我更換b =(布爾型)m.invoke(此,STR);與b =(布爾)m.invoke(clazz,str);我仍然得到一個例外,爲什麼? – svager

+0

'm.invoke(r,str)'相當於'r.doSomething(str)'。如果沒有Relfectee類的對象,則無法調用doSomething方法。現在'm.invoke(clazz,str)'相當於'clazz.doSomething(str)',這顯然是錯誤的 – Arun

相關問題