繁体   English   中英

GroovyClassLoader / ClassLoader如何工作?

[英]How does GroovyClassLoader/ClassLoader work?

我看到的代码就像

GroovyClassLoader cLoader = new GroovyClassLoader(this.class.getClassLoader())

接下来是这样的:

cLoader.loadClass([class name])

我对我应该了解的GroovyClassLoader类以及this.class.getClassLoader()的用途感兴趣。

类加载器以垂直层次结构方式工作,实际上在java中,此层次结构中有三个内置类加载器:

类加载器层次结构

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

在此输入图像描述

为什么要这样创建一个类加载器?为什么不用内置的? 那取决于你。

但是,这里要提醒的一个事实是类加载器以自上而下的方式加载类 类加载器要求其父级加载一个类,如果父级不能找到它自己加载类的类(注意调用是在进行复活),另一个事实是类加载器有一个缓存 ,加载的类会被缓存一段时间。

所以我通常使用Thread.currentThread.getClassLoader() (我相信它类似于urs),因为这给了我加载当前正在运行的线程的加载器,我相信它接近我的其他类,希望它可能已经缓存我要求的课程。

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

我不是类加载的专家,但AFAIK首先调用类加载器的父级来搜索给定的类。

至于应该知道什么,我不能告诉你任何文件中提供的内容。

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

  • Groovy代码需要一个合适的环境
  • 你最终希望摆脱脚本(及其所有类)

GroovyClassLoader将确保脚本(在它处于活动状态时加载)将起作用。 当它被垃圾收集时,它将确保所有资源也可以GC(否则,如果磁盘上的脚本发生更改并且您想重新加载它或者您将耗尽内存等,最终会遇到问题) 。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM