1

次のコードを使用して、Javassist を使用してクラスのフィールドを取得しています。

for (CtField ctf : ctclass.getDeclaredFields()) {
    System.out.println(ctf.getName());
}

したがって、アクセスしているクラスのすべての変数が画面に表示され、これはうまく機能します。

私が知りたいのは、これらの変数の値にアクセスできるということですか?

ご協力いただきありがとうございます!

4

2 に答える 2

1

これらの変数の値を取得する唯一の方法は、値を取得したいオブジェクトのインスタンスがある場合です (異なるインスタンスは異なる値を持つ可能性があるため)。

Object instance = ...
...
for (CtField ctf : ctclass.getDeclaredFields()) {
    Field f = instance.getClass().getDeclaredField(ctf.getName());
    f.setAccessible(true);
    Object value = f.get(instance);
}

静的フィールドにアクセスしようとしている場合は、インスタンスは必要なく、f.get(null)上記のコードで行うことができます。

また、これを Java インスツルメンテーションなどと一緒にある種のプロファイリングに使用していて、検査しているオブジェクトのインスタンスがない場合、実行可能な戦略は、それぞれにインスタンスのstaticフィールドを追加することです。 Collectionclass (javassist を使用) を作成し、すべてのコンストラクターを ( を使用してinsertAfter) 変換してそのフィールドに追加thisします。次に、私の例で同じリフレクション メソッドを使用して、関心のある各クラスからこの新しいフィールドを取得すると、すべてのインスタンスへの参照が得られます。

于 2013-09-04T16:12:07.157 に答える