4

getMessage()私はJavassistによって私のメソッド本体を次のように変更TestClassします:

ClassPool cp = new ClassPool(true);
CtClass ctClass = cp.get("my.test.javassist.TestClass");
CtMethod ctMethod = ctClass.getDeclaredMethod("getMessage");
ctMethod.setBody("{ return \"Hello from javassist\"; }");
ctClass.toClass();

TestClass c = new TestClass();
System.out.println(c.getMessage());

それはうまくいきます。ただし、ctClass.toClass()メソッド呼び出しを削除すると、本文の置換が機能しません。なんで?

getMessage()メソッドの本体を正しく置き換えるにはどうすればよいですか?私はそれを正しくやっていますか?

4

1 に答える 1

7

AにはオブジェクトClassPoolが含まれています。これらはクラスを表しますが、 Javaクラスではありません。メソッドはインスタンスをJavaクラスに変換し、実際にクラスをロードします。CtClasstoClass()CtClass

を実行しない場合toClass()、バイトコードの変更はクラスにコンパイルされずnew TestClass()、クラスパスからクラスロードがトリガーされます。

于 2011-09-12T09:42:53.317 に答える