运用URLClassLoader加载外部jar包的java类,生成Class文件

先来一段网上copy的话术:

      //****************************

很多时候 我们写的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 void test1() {
  String path = "D:\\test.jar";//外部jar包的路径
  Set<Class<?>> classes = new LinkedHashSet<Class<?>>();//所有的Class对象
  Map<Class<?>, Annotation[]> classAnnotationMap = new HashMap<Class<?>, Annotation[]>();//每个Class对象上的注释对象
  Map<Class<?>, Map<Method, Annotation[]>> classMethodAnnoMap = new HashMap<Class
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
URLClassLoaderJava中的一个加载器,可以用来加载位于远程服务器或本地文件系统中的文件和资源。当使用URLClassLoader加载一个包含外部依赖的jar包时,需要确保这些依赖的jar包也能被ClassLoader找到并加载。 在加载含有外部依赖的jar包时,可以通过指定多个URL来告诉URLClassLoader加载这些jar包。例如,如果有一个主jar包和两个外部依赖的jar包,可以通过以下步骤来加载: 1. 创建一个URL数组,包含主jar包外部依赖的jar包URL路径。 ```java URL[] urls = new URL[3]; urls[0] = new URL("file:/path/to/main.jar"); urls[1] = new URL("file:/path/to/dependency1.jar"); urls[2] = new URL("file:/path/to/dependency2.jar"); ``` 2. 创建一个URLClassLoader实例,并将上述URL数组作为参数传入。 ```java URLClassLoader classLoader = new URLClassLoader(urls); ``` 3. 使用URLClassLoader加载需要的。 ```java Class<?> clazz = classLoader.loadClass("com.example.MyClass"); ``` 这样,URLClassLoader会根据提供的URL路径加载jar包以及其所依赖的jar包中的。当主jar包中的调用外部依赖的jar包中的方法时,ClassLoader会自动从已加载中寻找对应的方法。 需要注意的是,如果外部依赖的jar包存在相同的名或版本冲突,可能会导致加载错误或运行时异常。在使用URLClassLoader加载含有外部依赖的jar包时,建议仔细管理jar包的依赖关系,确保所加载能够正确地调用外部依赖的方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值