1

这是一个相当复杂的问题。我正在尝试通过反射访问 webview 的 webviewcore 实例成员。我想要对我的 webview 使用的 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);

这样做的问题(也许我误解了这一点)是看起来我必须创建一个 WebViewCore 的新实例才能使用,然后将其设置回我的实例。首先,我是否正确理解这一点。如果是这样,那么有人可以翻译上面的代码来做我想要做的事情。如果我的理解不正确,有谁知道我还能如何访问 webview 实例的 WebViewCore?

谢谢!

编辑:由于混淆,我将重申我的问题。我有一个 webview 的实例。该 webview 有一个名为“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?
        }   
4

2 回答 2

2

反射使您能够访问私有字段、类(或者更确切地说,一个对象)的私有方法和运行时信息。

你对反射的理解是正确的。但是在您发布的代码片段中,您对反射的使用对我来说没有意义。您正在为具有该字段值的字段设置值,即您正在执行以下操作:

obj.setValue(obj.getValue());

您说您想访问 WebView 的私有字段,我假设您已经拥有 WebView 实例,因此一旦您获得 Field 引用,您只需在原始 WebView 实例上设置该字段的值,您应该也不应该t创建一个新的 WebView 对象,因为它是您想要操作的原始 WebView 对象。

像这样的东西:

WebView myWebView = ...;
Object myValueToSet = ...; 
Class webViewClass = WebView.class
Field field = webViewClass.getField("someField");
field.setAccessible(true);
field.set(myWebView, myValueToSet);
于 2012-05-11T17:01:42.333 回答
2

假设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 具有更好的反射能力。)

这似乎仍然有点遥不可及——在这种情况下,我会非常非常小心地使用它,并且基本上会不惜一切代价避免它。我质疑你是否需要做你想做的任何事情,在那之后,我会质疑做任何你想做的事情的智慧,直到像我们在这里搞砸的玩具例子这样的东西导致零概念问题。

这里有龙,它们会做饭吃你。

于 2012-05-11T22:06:25.483 回答