1

リフレクションに関する多くの投稿をすでに読んでおり、すべての例はstring、double、intなどの単純なアクセスオブジェクトです。しかし、Widget、Text、さらには自己定義オブジェクトなどのオブジェクトにアクセスしたいと思います。文字列と同じ方法で試しましたが、失敗します。

例えば

class testPrivate{
    public boolean test()
    {
        return true;
    }

}

class button {
public button(){
    anc=new testPrivate();
}
    private testPrivate anc;

}


public class Testing {

    public static void main(String arg[]) throws Throwable{
    button bt=new button();
    Field field = bt.getClass().getDeclaredField("anc");
    field.setAccessible(true);
    System.out.println(field.test());
    }

}

ここで、ステートメントSystem.out.println(field.test());のfield.test()。失敗します。

4

1 に答える 1

0

Fieldクラスタイプのフィールドを参照するクラスであり、そのクラスの特定のインスタンスではありません。

メソッドを呼び出すには、最初にそのクラスのインスタンスが必要です。次に、ancがnullでないことを確認する必要があります。

例:

button bt=new button();
Field field = bt.getClass().getDeclaredField("anc");
field.setAccessible(true);

//This sets the field value for the instance "bt"
field.set(bt, new testPrivate());

次に、メソッドを呼び出すには、そのオブジェクトを取得し、そのオブジェクトでメソッドを呼び出す必要があります。

//Since field corresponds to "anc" it will get the value
//of that field on whatever object you pass (bt in this example).
testPrivate tp = (testPrivate) field.get(bt);
System.out.println(tp.test());

また、文体的には、クラスは大文字で始める必要があります。例:button→<code>ButtonおよびtestPrivate→<code>TestPrivate

于 2013-03-02T14:15:13.440 に答える