1

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

Анонимный класс создан:

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

The cls.getName() является class code.jit.asm.example.Callee/629106582, который несколько отличается от имени tradtion мы видим: 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: 

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

+0

Полезно использовать тег [tag: java] для Java-вопросов. –

+1

"/" не является ([egal] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8) для имени класса. Как вы его создали? – Jayan

+0

@Jayan, он создан Unsafe.defineAnonymousClass (..) –

ответ

0

ASM cannpt читает файл класса, поскольку код, который вы пытаетесь найти, не предоставляется загрузчиком классов, в котором ASM обычно считывает файл класса. Однако вы можете получить доступ к байтовому коду с помощью Java-агента, как я объяснил в этом ответе: Can you inspect the byte code of a Java 8 lambda at runtime?

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^