如何访问 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);");
我有一个简单的 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?
我尝试这样做的方法是使用 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);");