java.lang.ClassCircularyError:java/util/ArrayList$ListItr在检测JDK时

java.lang.ClassCircularyError:java/util/ArrayList$ListItr在检测JDK时,java,instrumentation,runtimeexception,javassist,Java,Instrumentation,Runtimeexception,Javassist,我正在尝试为JDK类提供工具。我能够为java.lang.System和java.lang.Thread等类插入工具。但是,超过370个类失败并出现错误: java.lang.ClassCircularyError:java/util/ArrayList$ListItr 由于这个问题,任何依赖或引用java.util.ArrayList$ListItr的类似乎都无法检测 以下是异常出现的位置的片段: ClassPool classPool = ClassPool.getDefault(); Ct

我正在尝试为JDK类提供工具。我能够为java.lang.System和java.lang.Thread等类插入工具。但是,超过370个类失败并出现错误: java.lang.ClassCircularyError:java/util/ArrayList$ListItr

由于这个问题,任何依赖或引用java.util.ArrayList$ListItr的类似乎都无法检测

以下是异常出现的位置的片段:

ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.makeClass(className)//Here everything goes wrong :(;

关于这一点有什么想法:(

不是用来生成全新类的
makeClass
吗?这与检测现有类有什么关系?除此之外,你忘了提到你实际上在做什么。“检测JDK类”,是的,您应用了什么样的更改,使用了什么样的插装,加载时间还是热替换,等等。我正在做的一件事是测量每个方法的执行时间。因此,我插入CurrentTimeMilli作为每个方法调用的开始和结束。这个片段位于transormer类中。因此,该方法返回ctClass。getBytes()。但是,好的,
makeClass(String)
以一个新的类开始,因此您会删除所有现有的所有代码,而不是转换它。但是,除此之外,如果您在加载时转换器类中执行此操作,则该方法内部使用的所有类可能会再次调用转换器(以及Javassist随后使用的所有其他类),如果这些类尚未加载。这将创建一个循环依赖项。因此,您不能以这种方式转换所有类。