我尝试从匿名类构建 ASM ClassReader,但失败了。
匿名类的创建者:
Class cls = Unsafe.defineAnonymousClass(Hoster, byte[], null);
cls.getName() 是class 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:
如何获得匿名类的输入流?
最佳答案
ASM 无法读取类文件,因为您尝试查找的代码不是由 ASM 通常从中读取类文件的类加载器提供的。但是,您可以使用 Java 代理访问字节码,正如我在这个答案中所解释的:Can you inspect the byte code of a Java 8 lambda at runtime?
关于java - 从 Unsafe 创建的匿名类构建 ClassReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678362/