我正在尝试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
类的情况下运行良好。