这是一个相当令人费解的问题。 我试图通过反射来访问网页视图的webviewcore实例成员。 我想由我的web视图中使用,这样我可以调用该webviewcore使用方法webviewcore的参考。 我通过反射做到这一点,因为公众SDK不会让你访问这个类。 我知道使用反射来做到这一点是灰心了,但我做了我与和平。
我读过这里 ,要实现这一点,我会做这样的事情:
Class aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objetInstance, value);
有这样做(也许IM误解这一点)的问题是,它看起来像我必须创建WebViewCore的新实例一起工作,然后将其设置回我的实例。 第一,formost,我是否正确理解这一点。 如果是这样,那么有人可以翻译上面的代码做什么,我找它做。 如果我的理解是不正确,没有人知道是怎么回事,我可以访问网页视图的一个实例的WebViewCore?
谢谢!
编辑:由于混乱,我将重申我的问题。 我有一个网页视图的一个实例。 该网页视图具有称为“mWebViewCore”,这是WebViewCore类的一个实例成员字段。 该WebViewCore有一个叫做成员类叫做TextSelectionData。 我需要通过反射访问的TextSelectionData对象。 我知道如何通过反射访问领域和web视图的方法。 这样我就可以mWebViewCore场,但我不知道如何拍摄现场,并访问它的字段,方法,类等等。broadstrokes是采取对象的实例,发现在该实例的特定字段,并访问域那场。
对困惑感到抱歉。 它来自我反思薄弱理解,并部分的事实,我没有充分理解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更好的反射能力,语言)。
这似乎仍然有点乱范围-既然如此,我会非常非常小心使用,并会避免在基本的任何费用。 我怀疑你需要做什么是你正在试图做的,而在这之后,我会质疑这样做不管它是你想的智慧 ,直到像玩具例子的东西,我们会在这里造成出渣零个概念问题。
此处有怪物,它们会做饭,吃了你。
反思为您提供访问私有字段,一类的私有方法(或者更确切地说,一个对象),以及运行时信息的能力。
您反映的理解是正确的。 但是在您发布的代码片段,您反映的使用没有任何意义了我。 你是一个值与该字段的值设置为一个字段,即你正在做的事情,如:
obj.setValue(obj.getValue());
你说你想访问的WebView的私人领域,我假设你已经拥有的WebView实例,所以一旦你的字段引用,您只需设置您的原始的WebView实例字段的值,你不和不应该”牛逼创建一个新的WebView对象,因为它是你想运行在原有的WebView对象。
事情是这样的:
WebView myWebView = ...;
Object myValueToSet = ...;
Class webViewClass = WebView.class
Field field = webViewClass.getField("someField");
field.setAccessible(true);
field.set(myWebView, myValueToSet);