<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>