2012-10-26 30 views
0

我在我的android應用程序中有2個類。 Class1Class2。我在class2中有一些我想使用反射API調用的方法。在Android中使用反射api時NoSuchMethod異常

要調用類class2 「PRINTSTRING」,我用下面的代碼:

public void printString(String str) { 
     Log.d("TAG", "in printString" + str); 
    } 

反射代碼:

Method method = Class2.class.getMethod("printString"); 
method.invoke("asjdhaskdf", null); 

但是使用這個代碼拋出以下異常:

10-26 16:10:16.931: W/System.err(25036): java.lang.NoSuchMethodException: printString [] 
10-26 16:10:16.931: W/System.err(25036): at java.lang.Class.getConstructorOrMethod(Class.java:460) 
10-26 16:10:16.931: W/System.err(25036): at java.lang.Class.getMethod(Class.java:915) 
10-26 16:10:16.931: W/System.err(25036): at com.sample.mobile.android.ui.activities.Class1Activity$1.onClick(Class1Activity.java:56) 
10-26 16:10:16.931: W/System.err(25036): at android.view.View.performClick(View.java:3627) 
10-26 16:10:16.931: W/System.err(25036): at android.view.View$PerformClick.run(View.java:14329) 
10-26 16:10:16.936: W/System.err(25036): at android.os.Handler.handleCallback(Handler.java:605) 
10-26 16:10:16.936: W/System.err(25036): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-26 16:10:16.936: W/System.err(25036): at android.os.Looper.loop(Looper.java:137) 
10-26 16:10:16.941: W/System.err(25036): at android.app.ActivityThread.main(ActivityThread.java:4511) 
10-26 16:10:16.941: W/System.err(25036): at java.lang.reflect.Method.invokeNative(Native Method) 
10-26 16:10:16.941: W/System.err(25036): at java.lang.reflect.Method.invoke(Method.java:511) 
10-26 16:10:16.941: W/System.err(25036): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986) 
10-26 16:10:16.941: W/System.err(25036): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753) 
10-26 16:10:16.941: W/System.err(25036): at dalvik.system.NativeStart.main(Native Method) 

請告訴我做錯了什麼。我已閱讀互聯網上的教程,但沒有任何工作。

更新1

一個小鬼點:我的代碼的 「method.invoke」 行從來沒有達到過。它會在使用「getMethod」函數獲取方法的行上引發異常。

代碼的Class2的:

package com.sample.mobile.android.utils; 

public class Class2{ 

    public void printString(String str) { 
     Log.d("TAG", "in printString" + str); 
    } 

} 

代碼class1Activity的:

package com.sample.mobile.android.ui.activities; 

public class Class1Activity extends Activity { 

    private Class2 obj; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     obj = new Class2(); 
     Class cls; 
     try { 
      cls = Class 
        .forName("com.sample.mobile.android.utils.Class2"); 

      Method[] methods = cls.getMethods(); 
      Log.d("TAG", "length -- " + methods.length); 

      for (int i = 0; i < methods.length; i++) { 
       Log.d("TAG", "name -- " + methods[i].getName()); 
       // this is printing the name of all methods including "printString". 
      } 

      Method method = cls.getMethod("printString"); 
      method.invoke(obj, "asjdhaskdf"); 

     } catch (ClassNotFoundException 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(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+2

,因爲沒有這樣的方法......你想調用的String類這種方法......這應該是' method.invoke(instanceofClass2,「asjdhaskdf」)' – Selvin

回答

2

,因爲沒有這樣的方法

你想調用的String類這種方法

應該method.invoke(instanceofClass2, "asjdhaskdf")

編輯:匹配更新1

...既然printString有字符串參數,你應該使用getMethod這樣的:

Method method = Class2.class.getMethod("printString", String.class); 
+0

感謝男人..它現在工作..我也從這個鏈接找到了相同的答案:http://stackoverflow.com/questions/7327672/no-such-method-exception-using-reflection – mudit

+0

我沒有注意到,第一首先我看到的是調用問題:) – Selvin

1

作爲每Method.invoke的文檔,第一參數是在其上要調用的方法的對象,所以在你的情況下,你試圖調用String類中的printString,該類不存在。

我想你想用的:

Class2 myObject = new Class2(); 
Method method = Class2.class.getMethod("printString"); 
method.invoke(myObject, "asjdhaskdf"); 
+0

嘿,我試過你在你的答案中提到的方式。請在我的「update1」中查看我的代碼。你能看看嗎? – mudit

+0

@mudit看到我編輯的答案 – Selvin

+0

beny23和selvin,感謝您的幫助。 – mudit