获取动态创建的 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 加载器不通过 getResource
或 getResourceAsStream
提供 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 加载程序获得。
我动态创建了一个 class - 通过构建字节码并使用 class 加载器加载它。稍后,我需要得到这个 class 的 InputStream
。对于常见的 class,我通过获取此 class 的资源 URL
然后打开流 (url.openStream()
) 来获得它。显然,在这里我不能这样做,因为动态加载的 class 没有 URL.
如何获取动态创建的 class 的 InputStream
?
我能想到的唯一解决方案是将字节码保存到某个临时文件 file/memory,然后从中提供 InputStream
。
编辑
我需要 InputStream
在现有的基础上进行另一个字节码更改。
如果 class 加载器不通过 getResource
或 getResourceAsStream
提供 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 加载程序获得。