异​​常堆栈。

Exception in thread "main" java.lang.ClassCircularityError:
plugins/agents/Agent
        at java.lang.Class.getDeclaringClass(Native Method)
        at java.lang.Class.getEnclosingClass(Class.java:1085)
        at java.lang.Class.getCanonicalName(Class.java:1169)
        at agents.loader.AgentLoader.getPluginAgentFromCache(AgentLoader.java:288)
        at compiler.AgentCompiler.main(AgentCompiler.java:365)

以下是导致错误的代码。如果将getCanonicalName更改为getName,那一切都很好,这很奇怪。这些已加载的类将使用自定义的ClassLoader进行加载。像cl = defineClass(name, byteArray, 0, byteArray.length);
public Class getPluginAgentFromCache(String name)
{
    if (_loadedClasses == null)
        return null;

    Iterator <Class> iter = _loadedClasses.iterator();

    while (iter.hasNext())
    {
        Class c=iter.next();
        if (c.getCanonicalName().equals(name))
            return c;
    }

    return null;
}

谁能告诉我为什么这里的getCanonicalName会引发此错误?
(JDK 1.6.0_20)

更新
经过研究,我发现在定义类时,必须首先加载其父类。但这很难。当我写二进制文件时,它们只是被命令
按文件夹中的顺序。因此,当我加载它们时,它们将不会按课程排序
等级制度。这里有点烦人。现在我只循环这些类,然后再次加载错误类。这是解决方法,但不是一个好方法。

最佳答案

我遇到此问题的原因是我正在尝试执行不允许的JVM。
我正在使用自定义类加载器加载一个子类,但使用另一类加载器加载父类。当您调用getCanonicalName时,这会引起问题,我想这次,JVM将
尝试找到其父类,但由于父类由另一个类加载器加载而失败。
因此,抛出此异常。

我要做的是将所有父类(除Object类:-)和子类放入同一类加载器,而接口不必由同一类加载器加载。关于加载顺序
我通过添加findClass方法解决了该问题,在该方法中,它将通过此​​自定义findClass()方法查找依赖项类。在调用findClass(),之前,我将首先由父类加载器查找依赖项类。

该类加载器的调用顺序是自定义类加载器loadClass() => super(Web应用程序的类加载器)loadClass() => findClass()方法
webapp的类加载器由自定义类加载器的构造函数设置。

现在一切都解决了。

07-24 09:38