Java URLClassLoader动态加载jar包1
Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader`就被引入,以支持从网络或者其他支持URL的来源加载类。 `URLClassLoader`的主要工作原理是通过URL对象定位到类或资源的路径。例如,在提供的代码示例中,创建了一个`URLClassLoader`实例,其URL参数指向了本地文件系统的"C:/Url.jar"。`URLClassLoader`会读取这个JAR文件,并将其包含的类加载到当前运行的Java虚拟机(JVM)中。 在代码中,首先创建了一个`URL`对象,表示JAR文件的路径。接着,通过`URLClassLoader`的构造函数,传入URL数组来实例化一个新的类加载器。然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。 一旦类被加载,就可以通过反射调用其方法。在这里,获取了类的所有声明的方法,并检查其中是否有名为"test"的方法。如果找到,就通过`Method.invoke()`执行这个方法。在`Url.jar`中,有一个名为`Url`的类,其中定义了一个静态方法`test()`, 这个方法被调用后打印出"I'm void.",这正是在代码执行时看到的输出。 需要注意的是,`URLClassLoader`默认只加载指定的URLs,如果需要加载父类加载器的类,可以使用`ClassLoader.getSystemClassLoader()`或者`Thread.currentThread().getContextClassLoader()`。此外,为了安全考虑,通常需要设置`Method.setAccessible(true)`,使私有方法和受保护方法可以被访问,但这种做法打破了Java的封装性,应谨慎使用。 Java的`URLClassLoader`是实现动态加载和执行代码的核心工具,它扩展了Java应用程序的灵活性,允许在运行时加载和执行不在初始类路径中的类和资源。这种机制在很多高级应用场景,如模块化系统、服务器插件和自定义应用程序加载逻辑中都有广泛的应用。