<div dir="ltr"><div>Wait, I think I just figured this out... the annotation is on the code, not the method...</div><div><br></div><div>Nevermind! Thanks.</div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Wed, Nov 12, 2025 at 10:17 AM Archie Cobbs <<a href="mailto:archie.cobbs@gmail.com">archie.cobbs@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I think I found a bug in the ClassFile API but since I'm new to it, before creating one in Jira, I wanted to double-check I'm not doing something stupid... could someone please confirm?</div><div><br></div><div>Consider this simple test class:</div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div><div style="margin-left:40px"><span style="font-family:monospace">import java.lang.annotation.*;</span><br><span style="font-family:monospace">import java.lang.classfile.*;</span><br><span style="font-family:monospace">import java.nio.file.Path;</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace">public class Test {</span><br><br><span style="font-family:monospace"> public static void main(String[] args) throws Exception {</span><br><span style="font-family:monospace"> final String filename = args.length > 0 ? args[0] : "Example.class";</span><br><span style="font-family:monospace"> final Path path = Path.of(filename);</span><br><span style="font-family:monospace"> final ClassFile classFile = ClassFile.of();</span><br><span style="font-family:monospace"> final ClassModel classModel = classFile.parse(path);</span><br><span style="font-family:monospace"> classModel.forEach(classElement -> {</span><br><span style="font-family:monospace"> switch (classElement) {</span><br><span style="font-family:monospace"> case MethodModel method when method.methodName().equalsString("<init>") -></span><br><span style="font-family:monospace"> System.out.println(String.format("%s: method \"%s\": runtime visible type annotations: %s",</span><br><span style="font-family:monospace"> filename, method.methodName(), <span style="background-color:rgb(255,255,0)">method.findAttribute(Attributes.runtimeVisibleTypeAnnotations())</span>));</span><br><span style="font-family:monospace"> default -> { }</span><br><span style="font-family:monospace"> }</span><br><span style="font-family:monospace"> });</span><br><span style="font-family:monospace"> }</span><br><span style="font-family:monospace">}</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace">class Example {</span><br><span style="font-family:monospace"> Example(Object o) {</span><br><span style="font-family:monospace"> String s = <span style="background-color:rgb(255,255,0)">(@Anno String)</span>o;</span><br><span style="font-family:monospace"> }</span><br><span style="font-family:monospace">}</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace;background-color:rgb(255,255,0)">@Retention(RetentionPolicy.RUNTIME)</span><br><span style="font-family:monospace">@Target(ElementType.TYPE_USE)</span><br><span style="font-family:monospace">@interface Anno { }</span><br></div><div style="margin-left:40px"><span style="font-family:monospace"></span></div><br></div><div>If you compile and run this test it doesn't find any type annotation attribute on the Example constructor:</div><div><br></div><div style="margin-left:40px"><span style="font-family:monospace">$ javac Test.java && java Test <br>Example.class: method "<init>": runtime visible type annotations: <span style="background-color:rgb(255,255,0)">Optional.empty</span></span></div><div><br></div><div>Yet javap shows that there is one (as expected):</div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div style="margin-left:40px"><span style="font-family:monospace">$ javap -verbose Example</span></div><div style="margin-left:40px"><span style="font-family:monospace">...</span></div><div><div style="margin-left:40px"><span style="font-family:monospace"> Example(java.lang.Object);</span><br><span style="font-family:monospace"> descriptor: (Ljava/lang/Object;)V</span><br><span style="font-family:monospace"> flags: (0x0000)</span><br><span style="font-family:monospace"> Code:</span><br><span style="font-family:monospace"> stack=1, locals=3, args_size=2</span><br><span style="font-family:monospace"> 0: aload_0</span><br><span style="font-family:monospace"> 1: invokespecial #1 // Method java/lang/Object."<init>":()V</span><br><span style="font-family:monospace"> 4: aload_1</span><br><span style="font-family:monospace"> 5: checkcast #7 // class java/lang/String</span><br><span style="font-family:monospace"> 8: astore_2</span><br><span style="font-family:monospace"> 9: return</span><br><span style="font-family:monospace"> LineNumberTable:</span><br><span style="font-family:monospace"> line 24: 0</span><br><span style="font-family:monospace"> line 25: 4</span><br><span style="font-family:monospace"> line 26: 9</span><span style="background-color:rgb(255,255,0)"><br><span style="font-family:monospace"> RuntimeVisibleTypeAnnotations:</span><br><span style="font-family:monospace"> 0: #15(): CAST, offset=5, type_index=0</span><br><span style="font-family:monospace"> Anno</span></span><br><span style="font-family:monospace"></span></div><br></div><div>Thanks,</div><div>-Archie</div><div><br></div><div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature">Archie L. Cobbs<br></div></div></div>
</blockquote></div><div><br clear="all"></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature">Archie L. Cobbs<br></div>