我想在开始时预加载包含所有类和资源的整个jar文件。因此,进一步的Java程序执行不需要访问HDD。
这样做的推荐方法是什么?
更新
使用proguard掌握jar,它会检测某种死代码并将其从输出中删除。因此,加载永远不会使用的类不是问题。
答案 0 :(得分:2)
建议的方法是不要这样做。它会产生太多问题。
问题是(通常)你不能保证加载了所有需要加载的类...除非你对你的代码和库代码(包括Java SE库)进行详细分析上。由于某些组件可能会进行动态类加载,因此分析很难。
理论上,您可以遍历类加载器树的命名空间并加载每个类。但是你最终会加载大量的代码而不会被你的应用程序使用。
开箱即用......
您可以将JAR文件读入内存,并使用自定义类加载器从内存中复制加载。但是,存在问题。标准的JarFile
和ZipFile
API允许您从流或内存缓冲区中读取。因此,您需要使用JarInputStream
来迭代JAR的条目,读取相应的内容,并将它们缓存在内存中。
当然,如果加载应用程序类会触发从标准库加载类,那么您的应用程序需要从光盘读取。 (除非您缓存核心库JAR和ZIP文件。)
然后有一个棘手的问题,一些类依赖于动态加载的本机库,并且在类加载时没有解决该依赖关系。那些本地库也将在磁盘上。
应用程序JAR文件中可能还有其他资源(图像,prorty文件等),可以由应用程序动态读取。
答案 1 :(得分:-1)
您可以查看Reflections库。
但是,你应该考虑permgen的大小和内存利用率,你可能会因为硬盘使用情况而变得更糟。
另外,请记住JRE / JDK类,它们不会出现在编译和打包应用程序类的jar中。