获取动态创建的 class 的 InputStream(使用字节码)?

Get InputStream of a class that is dynamically created (using bytecode)?

我动态创建了一个 class - 通过构建字节码并使用 class 加载器加载它。稍后,我需要得到这个 class 的 InputStream。对于常见的 class,我通过获取此 class 的资源 URL 然后打开流 (url.openStream()) 来获得它。显然,在这里我不能这样做,因为动态加载的 class 没有 URL.

如何获取动态创建的 class 的 InputStream

我能想到的唯一解决方案是将字节码保存到某个临时文件 file/memory,然后从中提供 InputStream

编辑

我需要 InputStream 在现有的基础上进行另一个字节码更改。

如果 class 加载器不通过 getResourcegetResourceAsStream 提供 class 的字节码(这是合法的, class loader contract 没有指定这样的事情),你仍然可以 use a Java agent 要求 VM 为你创建字节码。

例如,您可以注册以下转换器:

instrumentation.addTransformer(new ClassFileTransformer() {
  @Override
  public byte[] transform(ClassLoader loader,
                          String name,
                          Class<?> classBeingRedefined,
                          ProtectionDomain pd,
                          byte[] classFileBuffer) {
    doSomethingWith(classFileBuffer);
    return null;
  }
}, true);

附加 Java 代理后,您可以调用:instrumentation.retransform(someGeneratedClass) 来触发上面的 class 文件转换器,它将包含生成类型的 class 文件,即使它无法从其 class 加载程序获得。