我在我的android應用程序中有2個類。 Class1
和Class2
。我在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();
}
}
}
,因爲沒有這樣的方法......你想調用的String類這種方法......這應該是' method.invoke(instanceofClass2,「asjdhaskdf」)' – Selvin