<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
So ClassHierarchyResolver.ofClassLoading loads system classes and inspect them with core reflection to determine their class hierarchy, based on the assumptions that the system classes are constant. However, such assumptions do not stand when agents are present,
 and agents do not wish system class loaded in the process of handling class files. As a result, we should inspect the class file resources instead, which is largely the same as agent-transformed classes (as agents don't usually change super classes or change
 classes to interfaces)</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
P.S. Forwarding this conversation to classfile-api-dev as this may be valuable to the public.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Regards, Chen</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Mark Roberts <markro@cs.washington.edu><br>
<b>Sent:</b> Wednesday, January 8, 2025 10:15 AM<br>
<b>To:</b> Chen Liang <chen.l.liang@oracle.com><br>
<b>Subject:</b> RE: [External] : RE: ClassFile.build() is loading result file</font>
<div> </div>
</div>
<style>
<!--
@font-face
        {font-family:"Cambria Math"}
@font-face
        {font-family:Calibri}
p.x_MsoNormal, li.x_MsoNormal, div.x_MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
a:link, span.x_MsoHyperlink
        {color:blue;
        text-decoration:underline}
p.x_xmsonormal, li.x_xmsonormal, div.x_xmsonormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
p.x_xxmsonormal, li.x_xxmsonormal, div.x_xxmsonormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
p.x_xxxmsonormal, li.x_xxxmsonormal, div.x_xxxmsonormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
span.x_EmailStyle26
        {font-family:"Calibri",sans-serif;
        color:windowtext}
.x_MsoChpDefault
        {font-size:10.0pt}
@page WordSection1
        {margin:1.0in 1.0in 1.0in 1.0in}
div.x_WordSection1
        {}
-->
</style>
<div lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="x_WordSection1">
<p class="x_MsoNormal">Ok that worked – thank you.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Could you give me a little background on what’s going on and why the option is needed?</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Thanks,</p>
<p class="x_MsoNormal">Mark</p>
<p class="x_MsoNormal"> </p>
<div>
<div style="border:none; border-top:solid #e1e1e1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_MsoNormal"><b>From:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>>
<br>
<b>Sent:</b> Wednesday, January 8, 2025 8:05 AM<br>
<b>To:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br>
<b>Subject:</b> Re: [External] : RE: ClassFile.build() is loading result file</p>
</div>
</div>
<p class="x_MsoNormal"> </p>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; color:black">Yep; for the loader, if you are just transforming system classes, ClassLoader.getSystemClassLoader() should be sufficient.</span></p>
</div>
<div class="x_MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="x_divRplyFwdMsg">
<p class="x_MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br>
<b>Sent:</b> Wednesday, January 8, 2025 9:28 AM<br>
<b>To:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>><br>
<b>Subject:</b> RE: [External] : RE: ClassFile.build() is loading result file</span>
</p>
<div>
<p class="x_MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="x_xmsonormal">So would that be:</p>
<p class="x_xmsonormal"> </p>
<p class="x_xmsonormal">ClassFile classFile = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(ClassHierarchyResolver.ofResourceParsing(loader)));</p>
<p class="x_xmsonormal"> </p>
<p class="x_xmsonormal"> </p>
<div>
<div style="border:none; border-top:solid #e1e1e1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_xmsonormal"><b>From:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>>
<br>
<b>Sent:</b> Wednesday, January 8, 2025 6:32 AM<br>
<b>To:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>>;
<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a><br>
<b>Subject:</b> Re: [External] : RE: ClassFile.build() is loading result file</p>
</div>
</div>
<p class="x_xmsonormal"> </p>
<div>
<p class="x_xmsonormal">Use ClassHierarchyResolver.ofResourceParsing instead.</p>
</div>
<div id="x_x_ms-outlook-mobile-signature">
<div>
<p class="x_xmsonormal"> </p>
</div>
<p class="x_xmsonormal">Get <a href="https://urldefense.com/v3/__https:/aka.ms/AAb9ysg__;!!ACWV5N9M2RV99hQ!P6_3DTWkMb_9ONnHMD1wDIARAPnpbunYeeg1XeFh5H0nk8Z1fOgOb1seLBTsIqZ2Oaj2JGT2Nw9OvsRULAkfAAee3w$">
Outlook for Android</a></p>
</div>
<div class="x_MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="x_x_divRplyFwdMsg">
<p class="x_xmsonormal"><b><span style="color:black">From:</span></b><span style="color:black"> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br>
<b>Sent:</b> Wednesday, January 8, 2025 8:02:16 AM<br>
<b>To:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>><br>
<b>Subject:</b> [External] : RE: ClassFile.build() is loading result file</span> </p>
<div>
<p class="x_xmsonormal"> </p>
</div>
</div>
<div>
<div>
<p class="x_xxmsonormal">I’m sorry but I don’t understand. A documentation note doesn’t solve my problem.  What do I have to do to keep this from happening?</p>
<p class="x_xxmsonormal"> </p>
<p class="x_xxmsonormal">Mark</p>
<p class="x_xxmsonormal"> </p>
<div>
<div style="border:none; border-top:solid #e1e1e1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_xxmsonormal"><b>From:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>>
<br>
<b>Sent:</b> Tuesday, January 7, 2025 7:14 PM<br>
<b>To:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>>; Chen Liang <<a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a>><br>
<b>Cc:</b> classfile-api-dev <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br>
<b>Subject:</b> Re: ClassFile.build() is loading result file</p>
</div>
</div>
<p class="x_xxmsonormal"> </p>
<div>
<p class="x_xxmsonormal">Thanks for this investigation. I should definitely add a note to tge class hierarchy resolver option about this side effect when this is used by instrumentation.</p>
</div>
<div>
<p class="x_xxmsonormal"> </p>
</div>
<div>
<p class="x_xxmsonormal">Chen</p>
</div>
<div>
<p class="x_xxmsonormal"> </p>
</div>
<div id="x_x_x_ms-outlook-mobile-signature">
<p class="x_xxmsonormal">Get <a href="https://urldefense.com/v3/__https:/aka.ms/AAb9ysg__;!!ACWV5N9M2RV99hQ!KfAd3s_X3uwq0GUJGbBPHbRHcLwDWfvhrPGqrFqcKKKoSTvlL5zMD9oAaPcAK995QChm-syru7lSrZ4S1mQ5KRKdmA$">
Outlook for Android</a></p>
</div>
<div class="x_MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="x_x_x_divRplyFwdMsg">
<p class="x_xxmsonormal"><b><span style="color:black">From:</span></b><span style="color:black"> classfile-api-dev <<a href="mailto:classfile-api-dev-retn@openjdk.org">classfile-api-dev-retn@openjdk.org</a>> on behalf of Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br>
<b>Sent:</b> Tuesday, January 7, 2025 8:13:03 PM<br>
<b>To:</b> Chen Liang <<a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a>><br>
<b>Cc:</b> classfile-api-dev <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br>
<b>Subject:</b> RE: ClassFile.build() is loading result file</span> </p>
<div>
<p class="x_xxmsonormal"> </p>
</div>
</div>
<div>
<div>
<p class="x_xxxmsonormal">OK – I build my own version of java.base so I could debug this issue.  It looks like the problem is that when StackMapGenerator wants to see if something is an interface, the code ends up doing a Class.forName and loads the class being
 built prematurely.</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">  Here is the interesting call stack:</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">  at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1073)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:315)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:757)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.Class.forName0(Native Method)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.Class.forName(Class.java:582)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.Class.forName(Class.java:561)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$ClassLoadingClassHierarchyResolver$1.apply(ClassHierarchyImpl.java:223)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$ClassLoadingClassHierarchyResolver$1.apply(ClassHierarchyImpl.java:219)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$ClassLoadingClassHierarchyResolver.getClassInfo(ClassHierarchyImpl.java:243)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$CachedClassHierarchyResolver$1.apply(ClassHierarchyImpl.java:134)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$CachedClassHierarchyResolver$1.apply(ClassHierarchyImpl.java:131)</p>
<p class="x_xxxmsonormal">    at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1229)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl$CachedClassHierarchyResolver.getClassInfo(ClassHierarchyImpl.java:142)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.resolve(ClassHierarchyImpl.java:74)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.isInterface(ClassHierarchyImpl.java:86)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeReferenceFrom(StackMapGenerator.java:1547)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeFrom(StackMapGenerator.java:1515)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.merge(StackMapGenerator.java:1376)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.checkAssignableTo(StackMapGenerator.java:1326)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator.processMethod(StackMapGenerator.java:433)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator.generate(StackMapGenerator.java:302)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator.<init>(StackMapGenerator.java:245)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.StackMapGenerator.of(StackMapGenerator.java:156)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.generateStackMaps(DirectCodeBuilder.java:317)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.tryGenerateStackMaps(DirectCodeBuilder.java:325)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.writeBody(DirectCodeBuilder.java:360)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.UnboundAttribute$AdHocAttribute.writeTo(UnboundAttribute.java:835)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.Util.writeAttribute(Util.java:230)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.AttributeHolder.writeTo(AttributeHolder.java:71)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.DirectMethodBuilder.writeTo(DirectMethodBuilder.java:146)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.Util.writeList(Util.java:247)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.DirectClassBuilder.build(DirectClassBuilder.java:198)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.classfile.impl.ClassFileImpl.build(ClassFileImpl.java:146)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.classfile.ClassFile.build(ClassFile.java:333)</p>
<p class="x_xxxmsonormal">    at daikon.chicory.Instrument.transform(Instrument.java:295)</p>
<p class="x_xxxmsonormal">    at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:259)</p>
<p class="x_xxxmsonormal">    at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)</p>
<p class="x_xxxmsonormal">    at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:611)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.defineClass1(Native Method)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)</p>
<p class="x_xxxmsonormal">    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.defineClass1(Native Method)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)</p>
<p class="x_xxxmsonormal">    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)</p>
<p class="x_xxxmsonormal">    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)</p>
<p class="x_xxxmsonormal">    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)</p>
<p class="x_xxxmsonormal">    at javautil.ArrayList17Test.main(ArrayList17Test.java:7)</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">Thank you,</p>
<p class="x_xxxmsonormal">Mark</p>
<p class="x_xxxmsonormal"> </p>
<div>
<div style="border:none; border-top:solid #e1e1e1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_xxxmsonormal"><b>From:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>>
<br>
<b>Sent:</b> Monday, January 6, 2025 12:51 PM<br>
<b>To:</b> 'Chen Liang' <<a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a>><br>
<b>Cc:</b> 'classfile-api-dev' <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br>
<b>Subject:</b> RE: ClassFile.build() is loading result file</p>
</div>
</div>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">I modified the jvmti minst tool to capture java execution method enter and exit.  I have attached what I hope is the relevant part of the log file.  This section of the log file starts with:</p>
<p class="x_xxxmsonormal">daikon.chicory.Instrument.modifyClass exit</p>
<p class="x_xxxmsonormal">and ends with:</p>
<p class="x_xxxmsonormal">java.lang.LinkageError: loader 'app' attempted duplicate abstract class definition for javautil.AbstractList17. 
</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">Along the way you can see the load: </p>
<p class="x_xxxmsonormal"> [6.689s][info][class,load] javautil.AbstractList17 source: file:/scratch/markro/tests/scratch/markro/clones/mydaikon.24/tests/daikon-tests/ArrayList17/</p>
<p class="x_xxxmsonormal">Happening twice.  The second time is expected when the code exits the transform method.  This first seems like an error that occurs at some point while the DirectCodeBuilder is running.</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">Hope this helps to debug my problem.</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">Thank you,</p>
<p class="x_xxxmsonormal">Mark</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal"> </p>
<div style="border:none; border-top:solid #e1e1e1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_xxxmsonormal"><b>From:</b> Chen Liang <<a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a>>
<br>
<b>Sent:</b> Sunday, January 5, 2025 2:06 PM<br>
<b>To:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br>
<b>Cc:</b> classfile-api-dev <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br>
<b>Subject:</b> Re: ClassFile.build() is loading result file</p>
</div>
<p class="x_xxxmsonormal"> </p>
<p>Hi Mark,<br>
why do you need to supply the ClassLoader to the modifyClass method? Class file transformation should have no dependency on the CHA process, and the only need is encapsulated within the ClassFile context object.</p>
<p>Can you post your modifyClass?</p>
<p>Chen</p>
<p class="x_xxxmsonormal"> </p>
<div>
<div>
<p class="x_xxxmsonormal">On Sun, Jan 5, 2025, 2:57 PM Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>> wrote:</p>
</div>
<blockquote style="border:none; border-left:solid #cccccc 1.0pt; padding:0in 0in 0in 6.0pt; margin-left:4.8pt; margin-top:5.0pt; margin-right:0in; margin-bottom:5.0pt">
<div>
<div>
<p class="x_xxxmsonormal">I am using ClassFileTransformer.transform() to instrument class files as they are loaded.   Within my transform method I call</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">byte[] newBytes =  classFile.build(classModel.thisClass().asSymbol(),</p>
<p class="x_xxxmsonormal">                          classBuilder -> modifyClass(classBuilder, classModel, loader));</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">where modifyClass does all the instrumentation.</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">The problem is some where inside of classFile.build() the class is actually being loaded!  Thus, when I return newBytes from the transform method I get an error ‘attempted duplicate abstract class definition’. I have verified that
 the class has not be loaded prior to the return from modifyClass().</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">What is going on?</p>
<p class="x_xxxmsonormal"> </p>
<p class="x_xxxmsonormal">Thank you,</p>
<p class="x_xxxmsonormal">Mark</p>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>