1

これはかなり複雑な質問です。リフレクション経由で webview の webviewcore インスタンス メンバーにアクセスしようとしています。webviewcore が使用するメソッドを呼び出すことができるように、webview で使用される webviewcore への参照が必要です。public 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 には、WebViewCore クラスのインスタンスである「mWebViewCore」というメンバー フィールドがあります。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

フィールドWebViewCoreを持つ a を仮定します。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を持つ a を仮定します。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 に答える
2

リフレクションは、プライベート フィールド、クラス (またはオブジェクト) のプライベート メソッド、およびランタイム情報にアクセスする機能を提供します。

反射についてのあなたの理解は正しいです。しかし、あなたが投稿したコード スニペットでは、リフレクションの使用は私には意味がありません。そのフィールドからの値を持つフィールドに値を設定しています。つまり、次のようなことをしています:

obj.setValue(obj.getValue());

WebView のプライベート フィールドにアクセスしたいとおっしゃいましたが、既に WebView インスタンスを持っていると思いますので、Field 参照を取得したら、元の WebView インスタンスにそのフィールドの値を設定するだけです。新しい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 に答える