我试图从匿名类构建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?

10-08 00:24