0

私のAndroidアプリには2つのクラスがあります。Class1Class2。リフレクション API を使用して呼び出したい class2 のメソッドがいくつかあります。

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

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();
        }
    }
}
4

2 に答える 2

2

そんな方法ないから

String クラスでこのメソッドを呼び出そうとしています

そのはずmethod.invoke(instanceofClass2, "asjdhaskdf")

編集: Update 1 に合わせて

...そして、次のようprintStringに使用する必要がある文字列パラメーターがあるためgetMethod:

Method method = Class2.class.getMethod("printString", String.class);
于 2012-10-26T11:03:04.257 に答える
1

Method.invokeのドキュメントによると、最初のパラメーターはメソッドを呼び出したいオブジェクトであるため、この場合、存在しないクラスで呼び出そうとしprintStringStringいます。

私はあなたが使用するつもりだったと思います:

Class2 myObject = new Class2();
Method method = Class2.class.getMethod("printString");
method.invoke(myObject, "asjdhaskdf");
于 2012-10-26T11:02:44.477 に答える