从Unsafe

时间:2015-06-06 02:37:17

标签: java classloader anonymous-class java-bytecode-asm bytecode-manipulation

我尝试从匿名类构建ASM ClassReader,但失败了。

Anonymous类由:

创建
         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:

如何获取匿名类的输入流?

2 个答案:

答案 0 :(得分:0)

ASM会读取类文件,因为您尝试定位的代码不是由ASM通常从中读取类文件的类加载器提供的。但是,您可以使用Java代理访问字节代码,正如我在本回答中所解释的那样:Can you inspect the byte code of a Java 8 lambda at runtime?

答案 1 :(得分:0)

术语匿名类应该指向您。您无法按名称访问匿名类,因为这是匿名的重点。匿名类不会被ClassLoader引用,因此与普通类不同,它们可能会在不再使用时被垃圾收集。

如果您想了解为lambda表达式生成的类,您可以使用选项
-Djdk.internal.lambda.dumpProxyClasses=targetdirectory

通常,JRE使用此功能来实现lambda表达式/方法引用实例和MethodHandle的实现。在这两种情况下,生成的类都有这么简单的结构,看它们并不是很有趣......