次のコードを使用して、Javassist を使用してクラスのフィールドを取得しています。
for (CtField ctf : ctclass.getDeclaredFields()) {
System.out.println(ctf.getName());
}
したがって、アクセスしているクラスのすべての変数が画面に表示され、これはうまく機能します。
私が知りたいのは、これらの変数の値にアクセスできるということですか?
ご協力いただきありがとうございます!
これらの変数の値を取得する唯一の方法は、値を取得したいオブジェクトのインスタンスがある場合です (異なるインスタンスは異なる値を持つ可能性があるため)。
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
フィールドを追加することです。 Collection
class (javassist を使用) を作成し、すべてのコンストラクターを ( を使用してinsertAfter
) 変換してそのフィールドに追加this
します。次に、私の例で同じリフレクション メソッドを使用して、関心のある各クラスからこの新しいフィールドを取得すると、すべてのインスタンスへの参照が得られます。