Java Android:如何通过反射获取成员字段的实例

Java Android:如何通过反射获取成员字段的实例,java,android,reflection,android-webview,Java,Android,Reflection,Android Webview,这是一个相当复杂的问题。我试图通过反射访问webview的webviewcore实例成员。我需要一个对webview使用的webviewcore的引用,以便调用webviewcore使用的方法。我必须通过反射来实现这一点,因为公共sdk不允许您访问此类。我知道用反思来做这件事是不被鼓励的,但我已经平静下来了 我已经读到,为了实现这一点,我会这样做: Class aClass = MyObject.class Field field = aClass.getField("someField");

这是一个相当复杂的问题。我试图通过反射访问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);
WebView myWebView = ...;
Object myValueToSet = ...; 
Class webViewClass = WebView.class
Field field = webViewClass.getField("someField");
field.setAccessible(true);
field.set(myWebView, myValueToSet);
这样做的问题可能是我误解了这一点,因为看起来我必须创建一个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?
        }   

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

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

obj.setValue(obj.getValue());
你说你想访问WebView的一个私有字段,我假设你已经有了WebView实例,所以一旦你得到了字段引用,你只需在你的原始WebView实例上设置该字段的值,你不应该也不应该创建一个新的WebView对象,因为它是你想要操作的原始WebView对象

大概是这样的:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);
WebView myWebView = ...;
Object myValueToSet = ...; 
Class webViewClass = WebView.class
Field field = webViewClass.getField("someField");
field.setAccessible(true);
field.set(myWebView, myValueToSet);

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

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

obj.setValue(obj.getValue());
你说你想访问WebView的一个私有字段,我假设你已经有了WebView实例,所以一旦你得到了字段引用,你只需在你的原始WebView实例上设置该字段的值,你不应该也不应该创建一个新的WebView对象,因为它是你想要操作的原始WebView对象

大概是这样的:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);
WebView myWebView = ...;
Object myValueToSet = ...; 
Class webViewClass = WebView.class
Field field = webViewClass.getField("someField");
field.setAccessible(true);
field.set(myWebView, myValueToSet);
假设WebViewCore具有私有字符串s字段:

假设WebView具有专用WebViewCore WebViewCore字段:

现在我们思考:

公共班机{

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

这似乎仍然有点遥不可及,在这种情况下,我会非常非常小心地使用它,并且会不惜任何代价避免它。我怀疑你是否需要做任何你想做的事情,在那之后,我会怀疑做任何你想做的事的智慧,直到我们正在做的玩具示例ith在这里不会引起任何概念问题

这里有龙,它们会烹饪并吃掉你。

假设WebViewCore有一个私有字符串s字段:

假设WebView具有专用WebViewCore WebViewCore字段:

现在我们思考:

公共班机{

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

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


这里有龙,它们会烹饪并吃掉你。

Field.get的参数是你试图从中检索指定字段的实例。你为什么要创建一个新的?那么你就不会在你关心的实例上得到设置;您正在学习Jenkiv的教程,但误解了它:该教程创建了一个类的实例以从中检索字段,因为还没有实例,您已经有了一个实例。我有一个webview的实例,而不是webviewcore。我想访问webviewcore的一个字段。webviewcore字段本身就是一个对象,所以我不能只设置一个值,因为该字段的值是一个我无法实例化的对象。如果这让人困惑,我很抱歉。你们中的一位能否提供一些代码来说明如何做到这一点。你们需要更好地展示对象层次结构/解释你们想要什么。如果您试图访问webview的一个字段,您显然不想设置一个字段,而是想获得一个字段。请描述你想要什么,以便人们能够理解-我仍然不明白问题是什么。我在编辑中添加了信息,应该更清楚。感谢您的帮助。Field.get的参数是您试图从中检索指定字段的实例。你为什么要创建一个新的?那么你就不会在你关心的实例上得到设置;您正在学习Jenkiv的教程,但误解了它:该教程创建了一个类的实例以从中检索字段,因为还没有实例,您已经有了一个实例。我有一个webview的实例,而不是webviewcore。我想访问webviewcore的一个字段。webviewcore字段本身就是一个对象,所以我不能只设置一个值,因为该字段的值是一个我无法实例化的对象。如果这让人困惑,我很抱歉。你们中的一位能否提供一些代码来说明如何做到这一点。你们需要更好地展示对象层次结构/解释你们想要什么。如果您试图访问webview的一个字段,您显然不想设置一个字段,而是想获得一个字段。请描述你想要什么,以便人们能够理解-我仍然不明白问题是什么。我在编辑中添加了信息,应该更清楚。谢谢你的帮助。