Я пытаюсь загрузить класс из classpath, а затем распечатать информацию о классе во время посещения ClassVisitor.Задача состоит в том, что класс, который меня интересует, не загружается инструментированным приложением, поэтому я должен загрузить его самостоятельно.Сначала я ищу его в classpath, а затем вызываю loader.loadClass
, но ничего особенного не происходит.Не могли бы вы, ребята, сказать мне, как это сделать правильно?Все работает нормально, если я мгновенно запускаю этот класс в инструментальном приложении (затем он загружается), я также уверен, что findConfigurationClassName
работает нормально, он возвращает правильное имя класса, также loadClass
не выдает никаких исключений.
public class Agent {
private static boolean scanned;
public static void premain(String arentArgs, Instrumentation inst) {
inst.addTransformer( new ClassFileTransformer() {
@Override
public byte[] transform ( ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer )
throws IllegalClassFormatException {
if(!scanned) {
ClassInfoList configrationClassName = findConfigrationClassName();
for(ClassInfo cl : configrationClassName) {
try {
loader.loadClass( cl.getName().replaceAll( "\\.", "\\" ) );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
}
}
ClassReader reader = new ClassReader(classfileBuffer);
ClassWriter writer = new ClassWriter(reader, 0);
ClassPrinter visitor = new ClassPrinter(writer);
reader.accept(visitor, 0);
return writer.toByteArray();
}
});
}
public static ClassInfoList findConfigrationClassName() {
scanned = true;
String routeAnnotation = "my.package";
try (ScanResult scanResult =
new ClassGraph()
.enableAllInfo()
.whitelistPackages("my")
.scan()) {
for (ClassInfo routeClassInfo : scanResult.getClassesWithAnnotation(routeAnnotation)) {
AnnotationInfo routeAnnotationInfo = routeClassInfo.getAnnotationInfo(routeAnnotation);
List<AnnotationParameterValue> routeParamVals = routeAnnotationInfo.getParameterValues();
String route = (String) routeParamVals.get(0).getValue();
System.out.println(routeClassInfo.getName() + " is annotated with route " + route);
}
return scanResult.getClassesWithAnnotation(routeAnnotation);
}
}
}