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

时间:2016-10-16 18:55:24

标签: java classloader bytecode bytecode-manipulation

我动态创建一个类 - 通过构造字节码并用类加载器加载它。之后,我需要获得此课程的InputStream。对于公共类,我通过获取此类的资源URL然后打开流(url.openStream())来获得此结果。显然,我不能这样做,因为动态加载的类没有URL。

如何获得动态创建的类的InputStream

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

修改

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

1 个答案:

答案 0 :(得分:1)

如果类加载器没有通过getResourcegetResourceAsStream提供类的字节代码(这是合法的,类加载器契约没有指定这样的东西),你仍然可以使用{{ 3}}要求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)来触发上面的类文件转换器,该转换器将包含生成类型的类文件,即使它的类加载器不可用。