我动态创建一个类 - 通过构造字节码并用类加载器加载它。之后,我需要获得此课程的InputStream
。对于公共类,我通过获取此类的资源URL
然后打开流(url.openStream()
)来获得此结果。显然,我不能这样做,因为动态加载的类没有URL。
如何获得动态创建的类的InputStream
?
我能想到的唯一解决方案是将字节码保存到某个临时文件/内存中,然后从中提供InputStream
。
修改
我需要InputStream
在现有的基础上更改另一个字节码。
答案 0 :(得分:1)
如果类加载器没有通过getResource
或getResourceAsStream
提供类的字节代码(这是合法的,类加载器契约没有指定这样的东西),你仍然可以使用{{ 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)
来触发上面的类文件转换器,该转换器将包含生成类型的类文件,即使它的类加载器不可用。