В настоящее время я реализую некоторый код, который должен, для каждого метода класса, запускать пару посетителей в файле .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();
, чтобы я мог легко сложить всех посетителей, которых я хочу запустить, и тогда только в конце я должен был бы сохранить ихдиск.Имейте в виду, что каждый из посетителей будет добавлять / удалять / изменять методы, которые он посещает!