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. invoke
Reflection API のメソッドでは、メソッドを呼び出す予定のクラスのオブジェクトを最初の引数として渡す必要があります。この場合、それは class のオブジェクトになりますMyWebView
。invoke
タイプのオブジェクトを呼び出すにはどうすればよいMyWebView
ですか? 2. がクラスの一部で
ある場合、同じコードがうまく機能します。MyWebView
Activity