安卓:如何通过反射得到一个成员字段的实例(Android: how to get an instan

2019-09-17 04:07发布

这是一个相当令人费解的问题。 我试图通过反射来访问网页视图的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?
        }   

Answer 1:

假设WebViewCoreprivate String s领域:

public class WebViewCore {
    private String s;
    public WebViewCore(String s) { this.s = s; }
    @Override
    public String toString() {
        return "WebViewCore{" + "s='" + s + '\'' + '}';
    }
}

假设WebViewprivate 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更好的反射能力,语言)。

这似乎仍然有点乱范围-既然如此,我会非常非常小心使用,并会避免在基本的任何费用。 我怀疑你需要做什么是你正在试图做的,而在这之后,我会质疑这样做不管它是你想的智慧 ,直到像玩具例子的东西,我们会在这里造成出渣零个概念问题。

此处有怪物,它们会做饭,吃了你。



Answer 2:

反思为您提供访问私有字段,一类的私有方法(或者更确切地说,一个对象),以及运行时信息的能力。

您反映的理解是正确的。 但是在您发布的代码片段,您反映的使用没有任何意义了我。 你是一个值与该字段的值设置为一个字段,即你正在做的事情,如:

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);


文章来源: Android: how to get an instance of a member field via reflection