Java Intstrumentation - загрузить класс из пути к классам в ClassFileTransformer - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь загрузить класс из 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...