我动态创建一个类 - 通过构造字节码并使用类加载器加载它。稍后,我需要获取这个类的InputStream
。对于公共(public)类,我通过获取此类的资源 URL
然后打开流 (url.openStream()
) 来获得此信息。显然,在这里我不能这样做,因为动态加载的类没有 URL。
如何获取动态创建的类的InputStream
?
我能想到的 atm 的唯一解决方案是将字节码保存到某个临时文件/内存,然后从中提供 InputStream
。
编辑
我需要 InputStream
在现有字节码的基础上进行另一个字节码更改。
最佳答案
如果类加载器没有通过 getResource
或 getResourceAsStream
提供类的字节码(这是合法的,类加载器契约没有指定这样的事情),你仍然可以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/