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?

Consider this simple test class:

import java.lang.annotation.*;
import java.lang.classfile.*;
import java.nio.file.Path;

public class Test {

    public static void main(String[] args) throws Exception {
        final String filename = args.length > 0 ? args[0] : "Example.class";
        final Path path = Path.of(filename);
        final ClassFile classFile = ClassFile.of();
        final ClassModel classModel = classFile.parse(path);
        classModel.forEach(classElement -> {
            switch (classElement) {
            case MethodModel method when
method.methodName().equalsString("<init>") ->
                System.out.println(String.format("%s: method \"%s\":
runtime visible type annotations: %s",
                  filename, method.methodName(),
method.findAttribute(Attributes.runtimeVisibleTypeAnnotations())));
            default -> { }
            }
        });
    }
}

class Example {
    Example(Object o) {
        String s = (@Anno String)o;
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface Anno { }

If you compile and run this test it doesn't find any type annotation
attribute on the Example constructor:

$ javac Test.java && java Test
Example.class: method "<init>": runtime visible type annotations:
Optional.empty

Yet javap shows that there is one (as expected):

$  javap -verbose Example
...
  Example(java.lang.Object);
    descriptor: (Ljava/lang/Object;)V
    flags: (0x0000)
    Code:
      stack=1, locals=3, args_size=2
         0: aload_0
         1: invokespecial #1                  // Method
java/lang/Object."<init>":()V
         4: aload_1
         5: checkcast     #7                  // class java/lang/String
         8: astore_2
         9: return
      LineNumberTable:
        line 24: 0
        line 25: 4
        line 26: 9
      RuntimeVisibleTypeAnnotations:
        0: #15(): CAST, offset=5, type_index=0
          Anno

Thanks,
-Archie

-- 
Archie L. Cobbs

Reply via email to