异常堆栈.
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)
Run Code Online (Sandbox Code Playgroud)
下面是导致错误的代码.如果我将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;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么这里的getCanonicalName会抛出这个错误?(JDK 1.6.0_20)
更新 经过一些研究,我发现在定义类时,必须首先加载其父类.但这很难.当我写入二进制文件时,它们只是按文件夹中的顺序排序.因此,当我加载它们时,它们不会被类hieriarchy命令.这里有点烦人.现在我只是循环这些类,然后再次加载错误类.这是解决方法,但不是一个好的.
我遇到这个问题的原因是我正在尝试做一些 JVM 不允许的事情。我使用自定义类加载器加载一个子类,但使用另一个类加载器加载父类。当你调用 getCanonicalName 时,这会导致问题,我猜这一次,JVM 会尝试找到它的父类,但由于父类被另一个类加载器加载而失败。所以抛出这个异常。
我所做的修复方法是,将所有父类(除了 Object 类:-))和子类都由同一个类加载器加载,并且接口不需要由同一个类加载器加载。关于加载顺序,我通过添加一个findClass方法解决了这个问题,在这个方法中,它会通过这个自定义方法来查找依赖类findClass()
。在调用之前,findClass(),
我将首先通过父类加载器查找依赖类。
这个classloader的调用顺序是custom classloader loadClass()
=> super (webapp的classloader) loadClass()
=> findClass()
method webapp的classloader是由custom classloader的构造函数设置的。
所以现在一切都解决了。
归档时间: |
|
查看次数: |
3861 次 |
最近记录: |