当前位置: 首页 > 知识库问答 >
问题:

超类层次结构正常时的ClassCircularityError

李昱
2023-03-14
public class Refactorer implements ClassFileTransformer {
    private static final Set<AbstractMatcher<String>> matchers = new HashSet<AbstractMatcher<String>>();

    public static void register(AbstractMatcher<String> matcher) {
        matchers.add(matcher);
    }

    public byte[] transform(ClassLoader loader, String name, Class<?> clazz, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {}
}
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.ClassCircularityError: java/util/Set
    at me.vader.Refactorer.register(Refactorer.java:42)
    at me.vader.Setup.registerModders(Setup.java:30)
    at me.vader.Agent.setAndAddTransformer(Agent.java:37)
    at me.vader.Agent.premain(Agent.java:18)

测试用:

Class c = matchers.getClass();
int i = 0;
while (c != null){
    System.out.println("Class (Sup x" + i+ "): " + c.getName());
    c = c.getSuperclass();
    i++;
}

i = 0;
c = matcher.getClass();
while (c != null){
    System.out.println("Class (Sup x" + i+ "): " + c.getName());
    c = c.getSuperclass();
    i++;
}

哪些产出:

// The "matchers"
Class (Sup x0): java.util.HashSet
Class (Sup x1): java.util.AbstractSet
Class (Sup x2): java.util.AbstractCollection
Class (Sup x3): java.lang.Object

// The matcher being added to "matchers"
Class (Sup x0): me.vader.match.ClassMatcher
Class (Sup x1): me.vader.match.AbstractMatcher
Class (Sup x2): java.lang.Object

共有1个答案

微生自怡
2023-03-14

似乎没有按照正确的顺序加载类。我不知道为什么,但似乎就是这样。

我的修复是拍打重构程序类中的folllowing:

static {
    Serializable.class.getName();
    Cloneable.class.getName();
    Iterable .class.getName();
    Collection.class.getName();
    AbstractCollection.class.getName();
    Set.class.getName();
    AbstractSet.class.getName();
    HashSet.class.getName();
}

迫使它们以正确的顺序加载。很丑但很管用。

 类似资料:
  • 问题内容: 我试图从我的MySQL数据库中按层次结构获取所有类别和子类别: 我的结果应该是这样(只是示例): 猫A 子猫1 Sub_Sub_Cat 1 Sub_Sub_Cat 2 子猫2 猫B C猫 … MySQL代码: 简而言之,如何在使用 PHP代码 的层次结构中获得它? 问题答案: 使用邻接表模型时,您可以一次性生成结构。 取自一遍父子数组结构(2007年9月; Nate Weiner撰写)

  • 我有一个类的层次结构:是一个基本抽象类

  • 操作步骤: 菜单栏: Navigate —>Type Hierarchy 快捷键: Mac: control + H Windows\/Linux: Ctrl + H

  • SQLAlchemy支持三种继承形式: 单表继承 ,其中几种类型的类由一个表表示, 具体的表继承 ,其中每种类型的类都由独立的表表示,并且 联接表继承 ,其中类层次结构在依赖表中被分解,每个类都由其自己的表表示,该表只包含该类的本地属性。 最常见的继承形式是单表和联接表,而具体的继承则面临更多的配置挑战。 在继承关系中配置映射器时,SQLAlchemy可以加载元素 polymorphically

  • 当使用“joined”、“single”或“concrete”表继承样式在继承层次结构中映射类时,如中所述 映射类继承层次结构 通常的行为是,对特定基类的查询也将生成与子类相对应的对象。当单个查询能够返回每个结果行具有不同类或子类的结果时,我们使用术语“多态加载”。 在多态加载领域,特别是联合表继承和单表继承,还有一个额外的问题,子类属性需要预先查询,然后再加载。当预先查询某个特定子类的属性时,我

  • 在Tableau中,可以构建层次结构以可视化数据。可以通过以下步骤在Tableau中创建它: 例如,考虑数据源,例如Sample-Superstore,以及它的维度和度量。 第1步: 首先转到工作表。然后, 选择一个维度,然后右键单击该维度以创建层次结构。 转到“层次结构(Hierarchy)”选项。 并且,单击下面屏幕截图中显示的“创建层次结构(Create Hierarchy)”选项。 第2步