JAVA中JAR ClassLoader综合应用

JAVA中JAR ClassLoader综合应用,第1张

貌似没有能实现你目的的classloader,URLClassLoader只能装载jar文件,而java中的文件没有纯以内存作为存储介质的。如果一定要实现可以这样,但是工作量会比较大。

1 String解码转成byte[]

2 用ZipInputStream把byte[](也就是jar)里的所有文件项目都读出来存成byte[],文件名(也就是类名)也要保存

3 自己写一个classloader,装载类的时候根据2中保存的类名装载byte[],达到载入类的功能

另外,2这一步也可以省略,每次需要装载类的时候都重新对ZipInputStream扫描,找到需要的类并装载,只不过这种方式性能会比较差,但相对2来说消耗内存少,各有利弊。

设我们有一个hellojar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的UtilgetVersion方法。怎么实现?

在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。

为了动态加载hellojar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。

// 位于hellojar

package comflyingzl;

public class Util {

public static void getVersion(){

Systemoutprintln("java version: " + SystemgetProperty("javaversion"));

}

}

ClassLoader: ClassLoader是一个抽象类,一般的系统有一个缺省的ClassLoader用来装载Class, 用ClassLoadergetSystemClassLoader()可以得到。不过有时候为了安全或有其它的特殊需要可以自定义自己的ClassLoader来进行loader一些需要的Class, 比如有的产品它用了自己的ClassLoader可以指定Class只从它指定的特定的JAR文件里面来loader,如果想通过覆盖ClassPath方法来想让它用Class是行不通的。 有兴趣的可以参照Java API 的更详细的用法说明。

ClassLoadergetSystemResource("/")

ClassLoadergetSystemResource("")

/和空都表示当前目录

Java ClassLoadergetSystemResource("/")

而/表示的是从最开始,后面应该是绝对路径。。。如果不写,目录就是空的。。。系统不知道去哪儿找

以上就是关于JAVA中JAR ClassLoader综合应用全部的内容,包括:JAVA中JAR ClassLoader综合应用、java classloader 怎么加载jar包、java 怎么向getsystemclassloader中加载新的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10063261.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存