未列出GroovyClassLoader加载的类

时间:2013-01-22 15:13:18

标签: java groovy classloader

我正在研究一些JVM bsaed代码中的内存泄漏(在Java环境中运行的groovy)。

我有一个简单的Java测试类,我用它来研究围绕Groovy类加载的各种行为,我正在运行以下代码(来自普通Java):

GroovyClassLoader localGroovyClassLoader = new GroovyClassLoader();
Class clazz = localGroovyClassLoader.loadClass("com.test.Example", true, false, true);

Example只是一个简单的Groovy类(没有做任何特别的事情,因为它只是我的虚拟案例)。

现在,如果在上述代码之后立即记录以下内容:

localGroovyClassLoader.getLoadedClasses().length

它记录0 - 尽管我可以验证我的加载类是否都是好的(clazz输出它实际上是Example)。

我想使用getLoadedClasses()方法的原因是因为我动态地重新加载groovy,所以在重新加载时我还要清除元注册表(详见此处:https://stackoverflow.com/a/10484023/258813) - 所以计划使用以下代码:

for (Class c : localGroovyClassLoader.getLoadedClasses()){
    GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}

但显然,如果getLoadedClasses()尽管刚刚加载了一个类而返回0,我将无法运行上述代码。

由于

1 个答案:

答案 0 :(得分:1)

您是否在父类加载器中有com.test.Example编译的类?调用getLoadedClasses只会为您提供此GCL直接加载的类。如果它能够通过委托给它的父加载器来找到一个特定的类,那么它就不需要加载类本身,并且该类将不会包含在getLoadedClasses中。