java - 动态类重新加载仅在 Debug模式下有效,为什么/如何真正起作用?

标签 java jvm classloader dynamic-class-loaders

我有一个棘手的问题。

我的 java 程序在循环中做这样的事情:

循环:

  1. 将带有已编译 java 类的外部文件读取到 byte[] 数组中。

  2. 创建我自己的类加载器的新实例。

  3. setbytes 从读取的文件到这个类加载器实例。

  4. 使用创建的类加载器从外部文件创建类对象的新实例。

  5. 调用创建对象的任何方法。

问题出在哪里。

  1. 当我在 Debug模式下运行这个程序时,它的行为与我预期的一样,所以如果外部文件改变,类加载器加载新版本的类并执行新版本(如果文件没有改变,它当然也会加载旧版本) .

  2. 但是当我在非 Debug模式下运行这个程序时,它总是执行旧版本,尽管读取的文件已经更改。

也许对类加载问题和 JVM 行为有更深入了解的人可以向我解释这种行为。

最佳答案

这是发生的情况的简化版本:

  1. JVM 将类和其他资源从 CLASSPATH 环境变量中指定的目录或 Jar 加载到类路径中一次(除非在 Debug模式下运行)。
  2. 为此,它使用类加载器
  3. 一旦资源被 ClassLoader 实例加载,它就会保留在内存中,直到 ClassLoader 被垃圾回收。

Debug模式是JVM提供的一种特殊模式,类加载器更加努力地为您提供最新版本的资源。

关于java - 动态类重新加载仅在 Debug模式下有效,为什么/如何真正起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10581127/

相关文章:

encoding - Coldfusion 11 的 CFdirectory,文件名中的非 ascii 字符问题

java - 如何通过提供的地址(如 0x3790f200)使用 mat 识别指定对象

java - 如何读取不在类路径中的 .xslt 文件

java - CompletableFuture/ForkJoinPool 集合类加载器

java - 如何从 jar 中获取资源(文件夹)?

java - 为什么在 Eclipse 中路径需要两个斜杠 (\\)?

Java:将文件内容放入 vector 中

java - 从测试 jar 运行 JUnit 测试时出现类未找到异常

java - JVM 如何处理 RuntimeException(s)

java - Maven exec 无法识别 src/test 中的我的应用程序