我看到像
这样的代码GroovyClassLoader cLoader = new GroovyClassLoader(this.class.getClassLoader())
其次是:
cLoader.loadClass([class name])
我对我应该了解的GroovyClassLoader
课程以及this.class.getClassLoader()
的目的感兴趣。
答案 0 :(得分:4)
类加载器以垂直层次结构的方式工作,实际上在java中,这个层次结构中有三个内置的类加载器:
因此,当您将this.class.getClassLoader(
)传递给构造函数时,您正在创建一个类加载器,其父级是加载当前类的类加载器,它将为您提供这种类加载器层次结构。
为什么要用这种方式创建一个类加载器?为什么不用内置的?那取决于你。
但提醒一下, classloaders以自上而下的方式加载类。类加载器要求其父级加载一个类,如果父级无法找到它自己加载类的类(注意调用正在进行调用),另一个事实是类加载器有一个缓存,加载的类被缓存有一段时间
所以我通常使用Thread.currentThread.getClassLoader()
(我认为它类似于urs),因为这给了我加载当前正在运行的线程的加载器,我相信它接近我的其他类,希望它可能有缓存了我要求的课程。
答案 1 :(得分:1)
根据文档,传递给构造函数的this.class.ClassLoader()
参数将被视为创建的GroovyClassLoader
的父级(而不是使用当前Thread的上下文类加载器作为父级 - 默认行为)。 / p>
我不是类加载的专家,但AFAIK首先调用类加载器的父级来搜索给定的类。
至于应该知道什么,我不能告诉你任何文件中提供的内容。
答案 2 :(得分:1)
Groovy是一种脚本语言,因此,您会发现自己处于从文件加载Groovy脚本并想要执行它的很多地方。这里有两个问题:
GroovyClassLoader
将确保脚本(在其处于活动状态时加载)将起作用。当它被垃圾收集时,它将确保所有资源也可以GC(否则,如果磁盘上的脚本发生更改并且您想重新加载它或者您将耗尽内存等,最终会遇到问题) 。)
Groovy代码需要访问普通的Java类,这就是为什么你必须给它一个父类加载器。 Groovy类加载器会向父级询问它不知道的任何内容。