簡體   English   中英

java.lang.NoSuchMethodException,其中getDeclaredMethods()否則顯示

[英]java.lang.NoSuchMethodException where getDeclaredMethods() shows otherwise

我的問題很簡單。 如此簡單,我似乎無法弄清楚。 我將合格的類名稱作為IntentString傳遞給BroadcastReceiver

目的是使用反射從類名稱實例化一個對象,並調用一個我們已知的方法,因為該方法實現了專有接口。 我什至正在對照getDeclaredMethods()對其進行檢查,在該處說了該方法,但是當我嘗試invoke該方法時,它將引發java.lang.NoSuchMethodException

String myClass = intent.getStringExtra("name");        
Class<?> c = Class.forName(myClass);
Object object = c.newInstance();

// Get the files from the interface

Method ms[] = c.getDeclaredMethods();
for (Method m1 : ms) {
    Log.i("METHOD", "METHODS " + m1.getName());
}

Method m = c.getDeclaredMethod("getStrings", (Class<?>) null);
String[] someStrings = (String[]) m.invoke(object, (Object[]) null);

m = c.getDeclaredMethod("getThings", (Class<?>) null);
Thing[] things = (Thing[]) m.invoke(object, (Object[]) null);

這是LogCat的輸出:

08-30 23:37:36.150: INFO/METHOD(2336): METHODS getStrings
08-30 23:37:36.150: INFO/METHOD(2336): METHODS getThings
08-30 23:37:36.150: WARN/System.err(2336): java.lang.NoSuchMethodException: getStrings
08-30 23:37:36.150: WARN/System.err(2336):     at java.lang.ClassCache.findMethodByName(ClassCache.java:247)
08-30 23:37:36.150: WARN/System.err(2336):     at java.lang.Class.getDeclaredMethod(Class.java:731)
08-30 23:37:36.150: WARN/System.err(2336):     at com.app.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:45)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread.access$2400(ActivityThread.java:117)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981)
08-30 23:37:36.150: WARN/System.err(2336):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-30 23:37:36.160: WARN/System.err(2336):     at android.os.Looper.loop(Looper.java:130)
08-30 23:37:36.160: WARN/System.err(2336):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-30 23:37:36.160: WARN/System.err(2336):     at java.lang.reflect.Method.invokeNative(Native Method)
08-30 23:37:36.160: WARN/System.err(2336):     at java.lang.reflect.Method.invoke(Method.java:507)
08-30 23:37:36.160: WARN/System.err(2336):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-30 23:37:36.160: WARN/System.err(2336):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-30 23:37:36.160: WARN/System.err(2336):     at dalvik.system.NativeStart.main(Native Method)

我在這里缺少什么嗎?

編輯:將代碼添加到類

public class MyClass implements MyInterface {

    @Override
    public String[] getStrings() {
        // Stub
        return new String[2];
    }

    @Override
    public Thing[] getThings() {
        // Stub
        return new Thing[2];
    }

}

注意: BroadcastReceiverClass在不同的項目中。

getDeclaredMethod要求您提供正確的參數。 如果沒有參數,則無需傳遞“ null”,而無需傳遞任何內容。

例如,這是hashCode的代碼段,其中不包含任何參數

Method m = c.getDeclaredMethod("hashCode");
System.out.println("test");
Method m2 = c.getDeclaredMethod("hashCode", (Class<?>) null);

它會打印出“ test”,然后拋出一個MethodNotFound異常,因為hashCode不帶任何參數。 如果要獲取參數類型和名稱,請在方法對象上執行getParameterTypes

for (Method m1 : ms) {
    System.out.println( "METHODS " + m1.getName());
    for (Class paramC : m1.getParameterTypes()) {
        System.out.println(paramC.getName());
    }
    }

這可能會有所幫助。 http://code.google.com/p/android/issues/detail?id=2812

發表評論或編輯您的原始帖子(如果不同),並提供更多詳細信息。 :)

我上面鏈接的線程與平台的錯誤有關,該錯誤導致其他類似的問題。

可能的原因:

  • 您是否在嘗試獲取已聲明的方法時傳遞了正確的參數?
  • 如果該方法不帶任何參數,請嘗試傳遞新的Class [0]而不是null

確保在getDeclaredMethod調用中發送了正確的參數列表。 現在,您正在發送(Class<?>) null getStrings方法的簽名是什么?

可能有兩個原因,首先,您的src對象可能不是您認為的那樣。 其次,您可能正在嘗試訪問私有成員。 實例化此類的代碼將是很棒的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM