3

getSelectionのメソッドを呼び出そうとしていWebViewます。Android でリフレクション API を使用して、選択したテキストを取得しようとしています。

いくつかの機能を追加するために拡張しましWebViewた (新しいクラスの名前は です)。MyWebViewメソッドgetSelectionは次のように呼び出されますMyWebView

for(Method m : WebView.class.getDeclaredMethods()) {
    if(m.getName().equalsIgnoreCase("getSelection")) {
        m.setAccessible(true);
        String str;
        try {
            Log.v(this.toString(), "is getSelection available? " + m.getModifiers() + " " + m.isAccessible());
            str = (String) m.invoke(this, new Object[] { null });
            Log.v(this.toString(), "String selected = " + str);
            Toast.makeText(context, str, Toast.LENGTH_LONG).show();  

MyWebView非アクティビティ クラスです。コードを実行すると、次のLogCat出力 が得られます。

08-16 19:15:22.745: W/System.err(23452): java.lang.IllegalArgumentException: object is not an instance of the class
08-16 19:15:22.745: W/System.err(23452):    at java.lang.reflect.Method.invokeNative(Native Method)
08-16 19:15:22.745: W/System.err(23452):    at java.lang.reflect.Method.invoke(Method.java:507)
08-16 19:15:22.745: W/System.err(23452):    at com.englishhelper.bluebottle.EHWebView$3.onTouch(EHWebView.java:210)
08-16 19:15:22.745: W/System.err(23452):    at android.view.View.dispatchTouchEvent(View.java:3934)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
08-16 19:15:22.745: W/System.err(23452):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1730)
08-16 19:15:22.745: W/System.err(23452):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1142)
08-16 19:15:22.745: W/System.err(23452):    at android.app.Activity.dispatchTouchEvent(Activity.java:2102)
08-16 19:15:22.745: W/System.err(23452):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1714)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2218)
08-16 19:15:22.745: W/System.err(23452):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1889)
08-16 19:15:22.745: W/System.err(23452):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 19:15:22.745: W/System.err(23452):    at android.os.Looper.loop(Looper.java:123)
08-16 19:15:22.745: W/System.err(23452):    at android.app.ActivityThread.main(ActivityThread.java:3691)
08-16 19:15:22.745: W/System.err(23452):    at java.lang.reflect.Method.invokeNative(Native Method)
08-16 19:15:22.745: W/System.err(23452):    at java.lang.reflect.Method.invoke(Method.java:507)
08-16 19:15:22.745: W/System.err(23452):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
08-16 19:15:22.745: W/System.err(23452):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
08-16 19:15:22.745: W/System.err(23452):    at dalvik.system.NativeStart.main(Native Method)

私の質問は次のとおり
です。 1. invokeReflection API のメソッドでは、メソッドを呼び出す予定のクラスのオブジェクトを最初の引数として渡す必要があります。この場合、それは class のオブジェクトになりますMyWebViewinvokeタイプのオブジェクトを呼び出すにはどうすればよいMyWebViewですか? 2. がクラスの一部で
ある場合、同じコードがうまく機能します。MyWebViewActivity

4

1 に答える 1

2

例外は、匿名の内部クラスの内部にいることを示しています。問題は、 のインスタンスではなく、誤って内部クラスのインスタンスを渡していることですEHWebView

通常のクラス名の後に が表示されるため、インナー クラスの内部にいることがわかりEHWebViewます。あなたが提起したスタックトレースの関連部分は次のとおりです。$3EHWebView

08-16 19:15:22.745: W/System.err(23452):    at com.englishhelper.bluebottle.EHWebView$3.onTouch(EHWebView.java:210)

通常、匿名の内部クラスは、イベント ハンドラーまたは実行可能なクラスです。それらは頻繁に現れ、多くの人はそれらを使用していることにさえ気づいていません.

メソッドに渡しthisていinvoke()ます。内部クラスの内部でthisは、外部クラスのインスタンスではなく、その内部クラスのインスタンスを参照しますEHWebView

thisこの問題を解決するには、代わりに を使用して を削除して、外部クラスの参照を渡しますEHWebView.this

        str = (String) m.invoke(EHWebView.this, new Object[] { null });
于 2013-08-27T09:05:13.217 に答える