getSelection
메서드를 WebView
으로 호출하려고합니다. 선택한 텍스트를 가져 오기 위해 Android에서 리플렉션 API를 사용하려고합니다.리플렉션 API를 올바르게 호출 - Android
일부 기능을 추가하기 위해 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. 리플렉션 API의 invoke
방법은 내가의 메소드를 호출하고자하는 클래스의 객체를 전달해야합니다 첫 번째 인수로. 이 경우 클래스 MyWebView
의 객체가됩니다. 유형 MyWebView
의 객체로 invoke
으로 전화하려면 어떻게해야합니까?
MyWebView
이 Activity
클래스의 일부인 경우 동일한 코드가 잘 작동합니다.