JDK 7中对URLClassLoader中新增了close方法,主要用于解决本地jar更新加载的异常问题。
URLClassLoader.close()方法有效地消除了如何支持从特定代码库(http),特别是从JAR文件(本地)加载的类和资源的更新实现的问题。
原则上,一旦应用程序清除对loader对象(仅仅是loader对象,而非加载的class对象)的所有引用,垃圾收集器和终结机制将最终确保释放和关闭所有资源(例如,本地JarFile对象打开文件)。然后,应用程序可以替换本地JAR文件,并创建一个新的URLClassLoader实例以从同一位置加载,使用类/资源的新实现。
但是,由于无法准确预测何时进行终结和垃圾收集,因此需要能够以可预测和及时的方式执行此操作的应用程序会出现问题,这是Windows上的问题,因为无法删除或替换打开的文件(直到GC执行,jarFile有关资源释放)。---JDK 7之前
在Java SE 7中,URLClassLoader.close()方法有效地使加载器失效,因此不能从中加载新类,它还会关闭加载程序打开的所有JAR文件。这允许应用程序删除或替换这些文件,并在必要时创建新的加载器并加载新的类实现或资源。
URL url = new URL("file:/code/test.jar"); URLClassLoader loader = URLClassLoader.newInstance(new URL[] {url}); Class cl = Class.forName ("com.test.Test", true, loader); Runnable test = (Runnable) cl.newInstance(); test.run(); //关闭,释放资源,此后将不能使用loader类加载新类,但是已经加载的class不受影响。 loader.close (); //此时,loader对象已经不再使用,我们重新创建loader对象。 //如果老的loader不close,将无法重新打开。除非GC loader = URLClassLoader.newInstance(new URL[] {url});; cl = Class.forName ("com.test.Test", true, loader); test = (Runnable) cl.newInstance(); test.run();
参考文档:关闭URLClassLoader
相关推荐
从JDK 1.2开始,`java.net.URLClassLoader`就被引入,以支持从网络或者其他支持URL的来源加载类。 `URLClassLoader`的主要工作原理是通过URL对象定位到类或资源的路径。例如,在提供的代码示例中,创建了一个`...
URLClassLoader是Java提供的一种类加载器,它允许我们通过URL来加载类和资源,从而实现这一目标。本篇文章将深入讲解如何使用URLClassLoader加载C盘下的test.jar文件。 首先,了解类加载器的基本概念。在Java中,类...
- 由于`URLClassLoader`的`addURL`方法不是公开的,我们需要使用反射来调用它,以在运行时添加新的URL。 - 添加URL后,类加载器会立即扫描新URL下的类和资源。 6. **安全和权限**: - 类加载涉及到代码执行,...
1. **URLClassLoader.close 方法**:为了更好地管理资源,URLClassLoader 类新增了一个 close 方法,允许开发者关闭URL类加载器并释放相关资源。具体用法参见官方文档《关闭 URLClassLoader》。 2. **...
下面我们将详细探讨`URLClassLoader`的相关知识点。 首先,`URLClassLoader`是Java运行时环境用于加载类的重要工具。它的主要职责是从网络或者本地文件系统加载.class文件。在Java中,类的加载遵循双亲委派模型,`...
2. **构造URLClassLoader**:首先,使用`ConstantTransformer`创建`URLClassLoader`的Class对象,然后通过`InvokerTransformer`调用`getConstructor`方法,传入`java.net.URL[].class`作为参数,创建一个构造函数...
我们可以获取到URLClassLoader的内部JarFile实例,并调用其close()方法。但是,直接操作内部状态可能存在风险,因为这违背了封装原则,可能会导致其他问题。所以,正确的做法是,如果URLClassLoader提供了关闭的API...
为了更好地支持更新特定代码库中的类和资源,Java 7新增了一个`URLClassLoader.close()`方法,该方法可以关闭由`URLClassLoader`加载的所有类和资源,有效解决了之前版本中存在的问题。 ##### 2. Sockets Direct ...
你需要指定jar包的本地路径,创建一个新的URL对象,并使用URLClassLoader的`newInstance`方法来实例化一个新的类加载器。 3. 使用加载后的类加载器,动态地加载数据库驱动类并进行实例化。例如,对于MySQL,可以加载...
- **URLClassLoader.close()**:新增了关闭`URLClassLoader`的方法,这解决了先前版本中对于从特定代码库加载的类和资源更新支持的问题。 - **套接字直接协议(SDP)**:引入了SDP,这是一种优化网络连接性能的协议,...
JDK 7 is a superset of JRE 7, and contains everything that is in JRE 7, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 7 provides the libraries, ...
例如,`sun.misc.Launcher$AppClassLoader`继承自`URLClassLoader`,并实现了类加载的逻辑,这使得我们有机会深入了解类加载的生命周期。 在文件列表中,我们可以看到`sun`、`javax`、`com`、`launcher`等目录,...
* 使用安全的类加载器:Java 平台提供了多种类加载器,例如 URLClassLoader 和 URLClassLoader 等。这些类加载器可以用于加载安全的类文件。 * 使用加密机制:Java 平台提供了多种加密机制,例如 SSL/TLS 和 HTTPS ...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...
`getConnection` 方法接收一个数据源名称,然后根据名称获取相应的数据源信息,如果还没有加载对应驱动,则使用 `URLClassLoader` 加载驱动类,实例化 `Driver` 对象,并将其注册到 `DriverManager` 中。最后,使用...
3.10.3 JDK1.2中禁用的方法 53 3.11 java.security.AccessController 56 3.11.1 AceessController的界面设计 57 3.11.2 基础访问控制算法 57 3.11.3 继承方法 59 3.11.4 扩展带有特权操作的基本算法 59 3.11.5 特权...
通过`java.lang.Class`类和相关的API,我们可以动态地创建对象、获取类的方法和字段、以及调用这些方法。这在处理未知类型的对象或者需要在运行时决定执行哪段代码时非常有用。 接下来,我们讨论`URLClassLoader`。...
1. 基本类加载器(Bootstrap ClassLoader):由JVM本身实现,负责加载JDK核心库(如rt.jar)。 2. 扩展类加载器(Extension ClassLoader):加载JRE扩展目录下的jar文件。 3. 应用类加载器(Application ClassLoader...
- 使用空行分隔逻辑相关的函数和方法。 - 函数长度不宜过长,通常控制在20-30行内,以提高可读性。 - 使用空格进行适当的缩进,保持代码整洁。 - 适当使用空格和换行,使代码看起来更有序。 4. **错误处理**: ...
3.10.3 JDK1.2中禁用的方法 53 3.11 java.security.AccessController 56 3.11.1 AceessController的界面设计 57 3.11.2 基础访问控制算法 57 3.11.3 继承方法 59 3.11.4 扩展带有特权操作的基本算法 59 3.11.5 特权...