Javassist 工具
Javassist insturmenter
我是 Java 和 Javassist 的新手。我想在某些方法中对我的一个原始变量进行每次读取访问之前添加一个记录器。经过一些研究,我想出了这个代码:
try {
method.instrument(
new ExprEditor() {
public void edit(FieldAccess fa) throws CannotCompileException {
CtField field = null;
CtClass fieldType = null;
try {
field = fa.getField();
fieldType = field.getType();
} catch (NotFoundException e) {
e.printStackTrace();
}
if (fa.isReader() && field != null && fieldType.isPrimitive()){
System.out.println("Primitive found: " + field.getName());
//ToDo: call method before variable access
fa.replace("{ $_ = $proceed($$); }");
}
}
}
);
} catch (CannotCompileException e) {
e.printStackTrace();
}
有没有办法在访问变量之前调用 (logger) 方法,或者我必须以不同的方式解决这个问题?使用 Javassist 实现此目的的最佳方法是什么?
希望有人能帮助我:)
您可以使用普通的记录器对象来调用记录器方法。但请确保在清单文件中提供 jar class 路径。
我是 Java 和 Javassist 的新手。我想在某些方法中对我的一个原始变量进行每次读取访问之前添加一个记录器。经过一些研究,我想出了这个代码:
try {
method.instrument(
new ExprEditor() {
public void edit(FieldAccess fa) throws CannotCompileException {
CtField field = null;
CtClass fieldType = null;
try {
field = fa.getField();
fieldType = field.getType();
} catch (NotFoundException e) {
e.printStackTrace();
}
if (fa.isReader() && field != null && fieldType.isPrimitive()){
System.out.println("Primitive found: " + field.getName());
//ToDo: call method before variable access
fa.replace("{ $_ = $proceed($$); }");
}
}
}
);
} catch (CannotCompileException e) {
e.printStackTrace();
}
有没有办法在访问变量之前调用 (logger) 方法,或者我必须以不同的方式解决这个问题?使用 Javassist 实现此目的的最佳方法是什么?
希望有人能帮助我:)
您可以使用普通的记录器对象来调用记录器方法。但请确保在清单文件中提供 jar class 路径。