java url包_java中使用URLClassLoader访问外部jar包的java类

很多时候 我们写的Java程序是分模块的,有很好的扩展机制,即我们可以为我们自己的java类添加插件,来运行将来某天我们可能开发出来的类,以下称这些类为插件类。

下边是一种简单的实现方法:

Class A 作为程序的主入口,其中包含了程序的执行入口(main)函数。然后在main函数中通过外部的配置文件,然后通过外部的配置文件,我们可以获得插件类的信息(位于哪个jar包,jar包的具体路径),然后获得jar包中某一个类的实例,来完成相应的工作。这个jar包很可能是外部的jar包,是我们自己写好的,那么我们放到哪里,他才能自己找到呢?我尝试过很多次,除非将其具体目录,放到class_path中才可以成功执行,否则报的异常只有一个ClassNotFoundException,就是找不到类。不过还有一种方法,就是将该jar包解压到运行jar包所在的目录,这样就可以通过class_path中的.来获得相应的类了。不过这样会显得很不专业,java写出来的东西都是jar包啊,自己感觉的。放到claspath中,不能每次写出新的jar包都配置一遍吧!

如此出现了如下的解决办法:

想了解解决办法的含义,首先要了解java的类加载机制。众所周知,程序若想执行,必须加载到内存当中才能成功执行。java程序并不是可执行文件,由许多独立的类文件来完成。所以java中加载程序是以类为单外来完成的。这也就需要我们来简单了解一下java的class loader加载机制。

java程序开始执行,遇到的第一个classloader是bootstrap classloader,这个classloader是用c++语言编写,通过他来完成加载java中的核心类。第二个classloader是extension classloader,加载的是jre/lib目录中的ext目录中的jar包。然后第三个是system classloader,也被称为应用加载器,主要负责完成加载-classpath 或者系统中的全局变量ClassPath中的类。System.out.println(System.getProperty(“java.class.path”));可以获得classpath的配置,也就是system classloader 加载的类,第四个class loader可能是用户自定义的加载器,来自定义加载类。通常一个类的加载过程是这样的通过当前的类加载器的父加载器尝试查找,如果没有再找其父加载器尝试加载,直到最终的bootstrap classloader为止,如果还没有找到,那么就开始从上往下加载类。这样做的目的是防止自定义的类来覆盖系统中的类,如果没有这种机制很容易出现这种笑话,自己写了一个String类,然后new string的时候是自己写的String类,这样就比较好玩了。

1.自己定义URLClassLoader对象加载外部jar包,针对jar包里面不再出现别的jar包的情况,即只解析.class文件:

private static voidtest1() {

String path= "D:\\test.jar";//外部jar包的路径

Set> classes = new LinkedHashSet>();//所有的Class对象

Map, Annotation[]> classAnnotationMap = new HashMap, Annotation[]>();//每个Class对象上的注释对象

Map, Map> classMethodAnnoMap = new HashMap, Map>();//每个Class对象中每个方法上的注释对象

try{

JarFile jarFile= new JarFile(newFile(path));

URL url= new URL("file:" +path);

ClassLoader loader= new URLClassLoader(new URL[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值