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

标签 java classloader bytecode bytecode-manipulation

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

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

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

编辑

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

最佳答案

如果类加载器没有通过 getResourcegetResourceAsStream 提供类的字节码(这是合法的,类加载器契约没有指定这样的事情),你仍然可以se a Java agent用于要求虚拟机为您创建字节码。

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

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(someGenerateClass) 来触发上述类文件转换器,该转换器将包含生成类型的类文件,即使该类文件无法从其类中获取装载机。

关于java - 获取动态创建的类的InputStream(使用字节码)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074196/

相关文章:

java - Java 中的私有(private)成员

Java 编译器错误。找不到标志

java - 自定义 ClassLoader 在 JUnit 测试中代理静态库类

java - 有哪些有趣、免费、开源的 Java 动态分析工具?

Mono.Cecil 或 .NET 反射的 Java 等效项,可访问 MSIL 代码

java - Tomcat 端口重定向在版本 6.0.28 中不起作用

java - 防止 Java Applet 类加载器尝试远程检索类

java - 在运行时替换某些方法的内容

java - 哪些 Scala 语句或代码可以生成无法转换为 Java 的字节码?

java - 如何从 Java 中的 Object[] 中获取元素?