GroovyClassLoader/ClassLoader 是如何运作的?

How does GroovyClassLoader/ClassLoader work?

我看到类似

的代码
GroovyClassLoader cLoader = new GroovyClassLoader(this.class.getClassLoader())

后跟类似的内容:

cLoader.loadClass([class name])

我想知道关于 GroovyClassLoader class 我应该知道什么以及 this.class.getClassLoader() 的目的是什么。

根据文档,传递给构造函数的 this.class.ClassLoader() 参数随后被视为创建的 GroovyClassLoader 的父级(而不是使用当前线程的上下文 Class 加载器作为父级 -默认行为)。

我不是 class 加载专家,但 AFAIK classloader 的父级在搜索给定 class.

时首先被调用

至于应该知道什么,除了文档中提供的信息,我无法告诉您更多信息。

Class 加载器以垂直层次结构方式工作,事实上在 java 中有三个内置的 class 加载器在这个层次结构中:

因此,当您将 this.class.getClassLoader() 传递给构造函数时,您正在创建一个 classloader,其父级是加载当前 class 的 classloader,它将给你这种 classloader 层次结构。

为什么要这样创建一个 classloader?为什么不获取内置的?那取决于你。

但这里要提醒的一个事实是 class加载程序以自上而下的方式加载 classes。 classloader 要求它的父加载一个 class,如果父找不到 class 它自己加载 class(注意调用是重复的)和另一个事实class加载器有一个缓存,加载的classes被缓存了一段时间。

所以我通常使用 Thread.currentThread.getClassLoader()(我认为这与你的相似)因为这给了我加载当前 运行 线程的加载器,我相信它靠近我的另一个 classes,希望它可能缓存了我请求的 class。

Groovy 是一种脚本语言,因此,您会发现自己在很多地方都在从文件加载 Groovy 脚本并想要执行它。这里有两个问题:

  • Groovy代码需要合适的环境
  • 您最终想要摆脱脚本(及其所有 类)

GroovyClassLoader 将确保脚本(在激活时加载)能够正常工作。当它被垃圾收集时,它将确保所有资源也可以被 GC(否则,如果磁盘上的脚本发生变化并且你想重新加载它,你最终会 运行 遇到问题或者你会 运行内存不足等)

Groovy 代码需要访问正常的 Java 类,这就是为什么你必须给它一个父类加载器。 Groovy 类加载器会向父类询问它自己不知道的任何内容。