如何在运行时从 JAR 文件的字节数组中加载所有 类?
How to load all classes from the byte array of a JAR file at runtime?
我有一个 JAR 文件的字节数组,我需要从这个数组中加载所有 类。
如何在不将此数组转换为文件的情况下执行此操作?
您必须将该字节数组包装成 java.util.ByteArrayInputStream
,然后再包装成 java.util.jar.JarInputStream
。
后者有方法获取一个条目(很可能是 class 文件,但也可能是某些类型的资源)作为 JarEntry
的实例,然后读取每个字节。
final var classes = new ArrayList<byte[]>();
try( final var inputStream = new JarInputStream( new ByteArrayInputStream( bytes ) ) )
{
var entry = inputStream.getNextJarEntry();
while( nonNull( entry ) )
{
var buffer = new bytes [entry.getSize()];
inputStream.read( buffer, 0, entry.getSize() );
classes.add( buffer );
entry = inputStream.getNextJarEntry();
}
}
好的,这没有经过测试,当然还有 none 所需的错误处理,也许您更愿意将 class 数据存储在地图中,使用 class 名字作为键…
玩得开心!
我有一个 JAR 文件的字节数组,我需要从这个数组中加载所有 类。
如何在不将此数组转换为文件的情况下执行此操作?
您必须将该字节数组包装成 java.util.ByteArrayInputStream
,然后再包装成 java.util.jar.JarInputStream
。
后者有方法获取一个条目(很可能是 class 文件,但也可能是某些类型的资源)作为 JarEntry
的实例,然后读取每个字节。
final var classes = new ArrayList<byte[]>();
try( final var inputStream = new JarInputStream( new ByteArrayInputStream( bytes ) ) )
{
var entry = inputStream.getNextJarEntry();
while( nonNull( entry ) )
{
var buffer = new bytes [entry.getSize()];
inputStream.read( buffer, 0, entry.getSize() );
classes.add( buffer );
entry = inputStream.getNextJarEntry();
}
}
好的,这没有经过测试,当然还有 none 所需的错误处理,也许您更愿意将 class 数据存储在地图中,使用 class 名字作为键…
玩得开心!