Создайте ClassReader из анонимного класса, созданного Unsafe

Я попытался создать ASM ClassReader из анонимного класса, но не смог.

Класс Anonymous создан:

         Class cls = Unsafe.defineAnonymousClass(Hoster, byte[], null);

cls.getName() isclass code.jit.asm.example.Callee/629106582, которое несколько отличается от традиционного имени, которое мы видим: class code.jit.asm.example.Callee

Затем я попробовал:

a)  ClassReader cr = new ClassReader(cls.getName())

b)  public static InputStream getClassInputStream(Class cls){
        String classAsPath = cls.getName().replace('.', '/') + ".class";
        return cls.getClassLoader().getResourceAsStream(classAsPath);
        //return cls.getResourceAsStream(classAsPath);
    }
    ClassReader cr = new ClassReader(getClassInputStream(cls))

И a), и b) вызывают одно и то же исключение:

java.io.IOException: Class not found
    at org.objectweb.asm.ClassReader.readClass(ClassReader.java:455)
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:

Как я могу сохранить входной поток анонимного класса?


person shijie xu    schedule 06.06.2015    source источник
comment
Хорошо использовать тег java в вопросах по Java.   -  person John Saunders    schedule 06.06.2015
comment
/ не является (легальным для имени класса. Как вы его создали?   -  person Jayan    schedule 06.06.2015
comment
@Jayan, он создан Unsafe.defineAnonymousClass(..)   -  person shijie xu    schedule 06.06.2015
comment
Похоже на дизайн [решение]. (openjdk.5641.n7.nabble.com/). Подробнее в. Небезопасный источник код   -  person Jayan    schedule 06.06.2015


Ответы (2)


ASM не может прочитать файл класса, поскольку код, который вы пытаетесь найти, не предоставляется загрузчиком классов, из которого ASM обычно считывает файл класса. Однако вы можете получить доступ к байтовому коду с помощью агента Java, как я объяснил в этом ответе: Можете ли вы проверить байт-код лямбда-выражения Java 8 во время выполнения?

person Rafael Winterhalter    schedule 06.06.2015

Термин анонимный класс должен указывать на него. Вы не можете получить доступ к анонимным классам по имени, так как в этом смысл анонимности. На анонимные классы не ссылается ClassLoader, поэтому, в отличие от обычных классов, они могут собирать мусор, когда они больше не используются.

Если вы хотите получить классы, сгенерированные для лямбда-выражений, вы можете использовать опцию
-Djdk.internal.lambda.dumpProxyClasses=targetdirectory.

Как правило, JRE использует эту функцию для реализации эталонных экземпляров лямбда-выражения/метода и для MethodHandle. В обоих случаях сгенерированные классы имеют настолько простую структуру, что смотреть на них не особо интересно…

person Holger    schedule 09.06.2015