- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
异常堆栈。
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)
更新经过一些研究,我发现当你定义类时,你必须首先加载它的父类。但这很难。当我写入二进制文件时,它们只是被订购按文件夹中的顺序。所以当我加载它们时,它们不会按类(class)排序等级制度。这里有点烦人。现在我只是循环类,然后再次加载错误类。这是解决方法,但不是一个好方法。
最佳答案
我遇到这个问题的原因是我试图做一些 JVM 不允许的事情。我正在使用自定义类加载器加载一个子类,但使用另一个类加载器加载父类。当您调用 getCanonicalName 时,这会导致问题,我想这一次,JVM 会试图找到它的父类,但由于父类被另一个类加载器加载而失败。所以抛出这个异常。
我修复它的方法是让所有父类(除了 Object 类:-))和子类由同一个类加载器加载,接口(interface)不需要由同一个类加载器加载。关于加载顺序,我通过添加一个 findClass 方法来解决它,在这个方法中,它将通过这个自定义的 findClass()
方法查找依赖类。在调用 findClass(),
之前,我会先通过父类加载器查找依赖类。
这个classloader的调用顺序是custom classloader loadClass()
=> super (webapp的classloader) loadClass()
=> findClass()
方法webapp的类加载器由自定义类加载器的构造函数设置。
所以现在一切都解决了。
关于java - 当 getCanonicalName 时抛出 ClassCircularityError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790349/
我有一个带有静态方法的类。 在该静态方法中,我需要包含该方法的类的规范名称。 (我宁愿不对其进行硬编码)。 一个明显的方法是使用 this.getClass().getCanonicalName();
异常堆栈。 Exception in thread "main" java.lang.ClassCircularityError: plugins/agents/Agent at ja
我是一名优秀的程序员,十分优秀!