这是一个相当复杂的问题。我试图通过反射访问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更好的反射能力。)

这似乎仍然有点遥不可及-既然如此,我会非常非常小心地使用它,并且会从根本上避免任何代价。我质疑您是否需要做您想做的事,然后,我会质疑做您想做的事的智慧,直到像我们在此处想像的玩具示例之类的事情引起零概念问题。

这里有龙,它们会煮饭和吃掉你。

10-05 22:46