getCanonicalName 时抛出 ClassCircularityError

2024-03-19

异常堆栈。

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)

UPDATE经过一番研究,我发现当你定义类时,你必须首先加载它的父类。但这很难。当我写入二进制文件时,它们只是被排序 按文件夹中的顺序。所以当我加载它们时,它们不会按类排序 等级制度。这里有点烦人。现在我只是循环类,然后再次加载错误类。这是一种解决方法,但不是一个好的方法。


我遇到这个问题的原因是我正在尝试做一些 JVM 不允许的事情。 我使用自定义类加载器加载一个子类,但使用另一个类加载器加载父类。当你调用 getCanonicalName 时,这会导致问题,我猜这一次,JVM 会 尝试找到它的父类,但由于父类被另一个类加载器加载而失败。 所以抛出这个异常。

我所做的修复方法是,将所有父类(除了 Object 类:-))和子类都由同一个类加载器加载,并且接口不需要由同一个类加载器加载。关于装载顺序, 我通过添加一个findClass方法解决了这个问题,在这个方法中,它将通过这个自定义查找依赖类findClass()方法。致电之前findClass(),我将首先通过父类加载器查找依赖类。

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

所以现在一切都解决了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getCanonicalName 时抛出 ClassCircularityError 的相关文章

随机推荐