`
RednaxelaFX
  • 浏览: 3053402 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

URLClassLoader会“挂住”所有它已经打开了的在classpath上的文件

    博客分类:
  • Java
阅读更多
嗯,这问题虽然很久以前就知道了,但最近一个功能正好需要让ClassLoader有些灵活性,就又栽在这里了。顺便把这个问题记下来。

Sun的JDK里最重要的两种ClassLoader,sun.misc.Launcher.ExtClassLoader和sun.misc.Launcher.AppClassLoader都是继承了URLClassLoader的(bootstrap ClassLoader并不是Java程序可见的ClassLoader,不算在内;它甚至不继承ClassLoader这个基类,根本不是一个Java object)。别的一些自定义ClassLoader为了实现方便也会继承URLClassLoader,例如GroovyClassLoader

但就是这么重要的URLClassLoader却一直有一个特性:它一旦打开了它所知的classpath上的文件就会把那些文件全部锁住,直到它被卸载前都不会释放掉。但是ClassLoader什么时候才被释放这就无法预测了,里面引用的JarFile的finalizer什么时候被调用又得看RP,诶……

在Java 7当中URLClassLoader新实现了Closeable接口,添加了一个close()方法,专门用于处理这个问题。在调用了某个URLClassLoader实例上的close()方法后,该实例就无法再用于加载类或资源;原本已经打开的类或资源仍然是可用的。

但在Java 7正式发布之前,要是想修改已经被URLClassLoader打开的JAR包就没好办法了。
分享到:
评论

相关推荐

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    如果需要,可以通过类似的方式使用URLClassLoader加载这些源代码或接口文件所在的目录,但这通常不是常规做法,因为通常我们加载的是已经打包好的JAR文件。 总之,使用URLClassLoader加载本地JAR文件是一种灵活的类...

    在linux和windows下动态设置classpath调用java类方法脚本代码

    在编程世界中,Java是一种广泛使用的跨平台语言,它的运行依赖于类路径(Classpath),这是一个指示Java虚拟机(JVM)查找.class文件的环境变量。本文将详细讲解如何在Linux和Windows操作系统下动态设置classpath以...

    Java URLClassLoader动态加载jar包1

    `URLClassLoader`会读取这个JAR文件,并将其包含的类加载到当前运行的Java虚拟机(JVM)中。 在代码中,首先创建了一个`URL`对象,表示JAR文件的路径。接着,通过`URLClassLoader`的构造函数,传入URL数组来实例化...

    URLClassLoader中指定目录和jar的问题

    在Java编程语言中,`URLClassLoader`是Java标准类加载器的一种实现,它负责从指定的URL(统一资源定位符)加载类和资源。本文将深入探讨`URLClassLoader`的工作原理,以及如何处理指定目录和JAR文件中的类加载问题。...

    URLClassLoader初体验

    在Java世界中,`URLClassLoader`是一个非常关键的类,它是`ClassLoader`的子类,主要用于从指定的URL(统一资源定位符)加载类和资源。这篇博客文章“URLClassLoader初体验”可能深入探讨了如何使用`URLClassLoader`...

    加载jar包中的spring配置文件

    综上所述,"加载jar包中的spring配置文件"是一个关键的Java开发实践,它涉及到Spring框架的配置管理、类路径的概念,以及如何在多模块项目中有效地组织和使用配置。正确理解和使用这些技术,能帮助开发者构建可扩展...

    java反序列化漏洞URLClassLoader利用1

    这个执行链完成后,`exploit.ErrorBaseExec`类中的`do_exec`方法会在目标机器上被执行,从而实现了远程代码执行。 在实际的安全场景中,这种漏洞可能导致非常严重的后果,因为攻击者可以控制执行的命令。为了防御这...

    java动态添加外部jar包到classpath的实例详解

    在Java中,classpath是指Java虚拟机(JVM)在搜索类文件时所遵循的路径。在Java应用程序中,我们可以通过配置classpath来指定要加载的jar包。在传统的开发方式中,我们通常是将需要的jar包添加到项目的classpath中,...

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    URLClassLoader通过URL集合来定位类的资源,它通常用于加载不在应用类路径(ClassPath)内的额外类库。创建URLClassLoader后,我们需要确保在不再使用时关闭它,以释放与之关联的资源,尤其是文件句柄。 关闭类加载...

    Java 自动加载JAR文件并运行其中的类方法

    在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    前者会将所有依赖的JAR文件解压并合并到生成的JAR中,后者则将依赖的JAR文件打包进一个独立的目录结构,如`lib`。 对于外部JAR包,如果选择`Package required libraries into generated JAR`,你需要将`lib`目录...

    jar 包 内文件读取 文件内容

    在Java编程语言中,JAR(Java Archive)文件是一种打包格式,用于收集多个类文件、相关的元数据和其他资源(如图像、声音或文本文件),以便一起分发和部署。JAR文件是基于ZIP格式的,因此可以使用类似的机制来读取...

    Java源文件读取JAR包文件.rar

    这个任务对于那些希望在不将文件解压到硬盘上的情况下使用它们的开发者来说是非常重要的。本文将详细介绍如何在Java源文件中实现这一功能。 首先,了解JAR文件的基本概念。JAR文件是Java平台的标准归档格式,用于...

    jvm 加载class文件

    Java类加载器是JVM的重要组成部分之一,它负责查找并加载类文件到JVM的内存空间中。Java程序的运行依赖于类加载器将`.class`文件加载到JVM中,并对其进行验证、准备和解析等步骤,最终使类能够在JVM中执行。 #### ...

    Springboot + Hutool-db 使用 URLClassLoader 动态加载外部数据库和数据池 jar包实例

    在Spring Boot项目中,我们通常会将数据库连接信息写入`application.properties`或`application.yml`配置文件中。然而,为了实现动态加载,我们可以使用URLClassLoader,这是一个Java类加载器,它可以加载指定URL...

    jar包、class文件读取工具

    常见的工具有JD-GUI,它是一个图形界面工具,可以直接打开jar包或class文件,显示源代码视图。 三、JD-GUI的使用 1. 安装与启动:JD-GUI是一个独立的工具,可以从官方网站下载安装。启动后,通过菜单或拖放方式可以...

    通过自定义Gradle插件修改编译后的class文件

    def classLoader = new URLClassLoader(task.classpath.asFiles.toURLs(), Thread.currentThread().getContextClassLoader()) new ByteBuddy() .redefine(classLoader.loadClass('com.example.MyClass')) // 替换...

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    5. 文件句柄或网络连接:类加载器可能打开文件或保持网络连接,如果在加载完成后未关闭,也会导致资源泄露。务必在类加载器不再使用时关闭这些资源。 总之,理解ClassLoader的工作原理及其关系对于优化Java应用程序...

    从JAR文件中读取文本数据

    5. **关闭资源**:最后,确保在操作完成后关闭所有打开的流,避免资源泄漏: ```java reader.close(); is.close(); jar.close(); ``` 在提供的`TextOperatorJAR.java`源文件中,可能就包含了实现这些步骤的...

    Struct jar 包

    Java的`URLClassLoader`可以帮助实现这一目标,因为它允许在运行时动态加载新的类库。 9. **安全性**: JAR文件可以设置数字签名,以验证其来源和完整性,防止恶意篡改。同时,Java的安全模型允许对JAR包内的代码...

Global site tag (gtag.js) - Google Analytics