我目前正在实现一些代码,对于每个类的方法,它应该在.class文件上运行几个访问者,以便检测它的字节码。目前,我刚刚实现了一个MethodRenamerVisitor,但这已经变得非常尴尬了:
ClassReader classReader = null;
try {
classReader = new ClassReader(monitoringFile.getCannonicalName());
} catch (IOException e1) {
e1.printStackTrace();
}
ClassWriter classWriter = null;
for (BytecodeMethod bytecodeMethod : bytecodeClass.bytecodeMethods) {
System.out.println("\t" + bytecodeMethod.getName());
classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
MethodRenamerVisitor methodRenamerVisitor = new MethodRenamerVisitor(classWriter, bytecodeMethod);
classReader.accept(methodRenamerVisitor, 0);
String outputFile = monitoringFile.getCannonicalName();
outputFile = outputFile.replace('.', File.separatorChar)+".class";
classReader = new ClassReader(classWriter.toByteArray());
}
try {
fileSystem.writeToDisk(
classFilename,
classWriter.toByteArray()
);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我现在正在想要将其他访问者应用于每个BytecodeMethods。我是不是太复杂了?如果我能拥有以下形式的东西,那将是理想的:
MultiVisitors multiVisitors = new MultiVisitors();
visitors.add(new AVisitor(...));
visitors.add(new BVisitor(...));
...
visitors.run();
所以我可以轻松地堆叠我想要运行的所有访问者,然后最后我必须将它们保存在磁盘上。请记住,每个访问者都会添加/删除/修改它正在访问的方法!
答案 0 :(得分:0)
您已经堆叠了两个访问者 - ClassWriter和MethodRenamerVisitor。基本上链中的下一个访问者作为第一个参数i构造函数传递。所以第三个可以像这样添加:
ThirdVisitor v3 = new ThirdVisitor(methodRenamerVisitor); ForthVisitor v4 =新的ForthVisitor(v3); 等