如何在运行时从 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 名字作为键…

玩得开心!