这是一个相当复杂的问题。我试图通过反射访问webview的webviewcore实例成员。我想要引用我的webview使用的webviewcore,以便我可以调用该webviewcore使用的方法。我必须通过反思来做到这一点,因为公共SDK不允许您访问此类。我知道不建议使用反射来做到这一点,但我为此感到安心。
我读过here要实现这一点,我会做这样的事情:
Class aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objetInstance, value);
这样做的问题(可能是我误解了)似乎是我必须创建一个新的WebViewCore实例来使用,然后将其设置回我的实例。首先,最重要的是,我是否正确理解了这一点。如果是这样,那么有人可以翻译上面的代码来执行我正在寻找的代码。如果我的理解不正确,是否有人知道我还能如何访问Webview实例的WebViewCore?
谢谢!
编辑:由于混乱,我将重申我的问题。我有一个webview实例。该Web视图具有一个名为“ mWebViewCore”的成员字段,该成员字段是WebViewCore类的实例。 WebViewCore具有一个称为TextSelectionData的成员类。我需要通过反射访问TextSelectionData对象。我知道如何通过反射访问Webview的字段和方法。所以我可以获取mWebViewCore字段,但是我不知道如何获取该字段并访问它的字段,方法,类等。那个领域。
对困惑感到抱歉。这是由于我对反射的理解不足,部分原因是我对WebViewCore类没有足够的了解。这是我在代码中必须去的地方:
Class c = mWebView.getClass();
try {
Field webViewCoreField = c.getDeclaredField("mWebViewCore");
webViewCoreField.setAccessible(true);
//how do i get the fields of webViewCoreField?
}
最佳答案
假设具有WebViewCore
字段的private String s
:
public class WebViewCore {
private String s;
public WebViewCore(String s) { this.s = s; }
@Override
public String toString() {
return "WebViewCore{" + "s='" + s + '\'' + '}';
}
}
假设具有
WebView
字段的private WebViewCore webViewCore
:public class WebView {
private WebViewCore webViewCore;
public WebView() { webViewCore = new WebViewCore("ohai"); }
}
现在我们来反思:
公共班级主要{
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// First get the private WebViewCore field...
Field fWvc = WebView.class.getDeclaredField("webViewCore");
fWvc.setAccessible(true);
System.out.println(fWvc);
// Then get an instance of a WebView; you already have one,
// I'm constructing one...
WebView wv = new WebView();
WebViewCore wvc = (WebViewCore) fWvc.get(wv);
System.out.println(wvc);
// Now get the private String field from the WebViewCore class...
Field fS = WebViewCore.class.getDeclaredField("s");
fS.setAccessible(true);
System.out.println(fS);
// Now get the value of the private String field from the instance
// of the WebViewCore we retrieved above...
String s = (String) fS.get(wvc);
System.out.println(s);
}
}
所以,这是我的怒吼:反射是一种相对先进的技术,尽管它很简单。 (基于警告,我已经做了很长时间了,使用的语言具有比Java更好的反射能力。)
这似乎仍然有点遥不可及-既然如此,我会非常非常小心地使用它,并且会从根本上避免任何代价。我质疑您是否需要做您想做的事,然后,我会质疑做您想做的事的智慧,直到像我们在此处想像的玩具示例之类的事情引起零概念问题。
这里有龙,它们会煮饭和吃掉你。