异常堆栈。
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的类加载器由自定义类加载器的构造函数设置。
现在一切都解决了。