如何访问 javassist 创建的 fields/methods

How to access fields/methods created by javassist

我有一个简单的 java 应用程序,其名称为 class TestApp。我正在编写一个 java 代理来使用 javassist 对我的 java 应用程序进行一些分析。我在我的测试应用程序的 TestApp class 中添加了一个方法和一个字段,如下所示:

CtClass ctClass = ClassPool.getDefault().get("TestApp");

// create a field
CtField f = CtField.make("int testField = 1;", ctClass);
ctClass.addField(f);

//create a method
CtMethod newmethod = CtNewMethod.make("public void test() { System.out.println(\"printing\"); }", ctClass);
ctClass.addMethod(newmethod);

问题是即使我已经使用此代理创建并将它们添加到我的 TestApp class 我仍然无法从我的 TestApp [=] 的任何其他成员访问它们43=]。所以我的问题是如何从 TestApp class?

的其他成员访问使用 java 代理的转换方法创建的方法和字段

我尝试这样做的方法是使用 insertBefore,它应该在 TestApp class 的所有方法的开头插入源代码行,如下所示:

CtMethod ctMethod[] = ctClass.getDeclaredMethods();
for (CtMethod method : ctMethod) {
    System.out.println(method.getName());
    method.insertBefore("System.out.println(\"field value \" + testField);");
}
ctClass.writeFile();

但这失败了,因为它无法访问 testField,我只能在使用 method.addLocalVariable 创建局部变量时使用它们。那么有没有什么方法可以在 insertBefore/insertAfter 方法中使用像上面那样创建的全局字段,如果没有,是否有任何替代修复方法,以便我们可以从原始 java 应用程序访问该字段?

还有一个问题如何调试javassist代码?因为如果我的 javassist 代理代码失败

,我看不到任何输出或错误

任何 suggestion/recommendation/help 将不胜感激, 谢谢

我想我找到了答案。错误是当我试图在我的主 class 中使用 javassist 访问代理创建的静态字段时,我只是在 insertBefore 中给出字段的名称,例如

method.insertBefore("System.out.println(\"field value \" + testField);");

应该是

method.insertBefore("System.out.println(\"field value \" + <Complete Class name>.testField);");