import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;

enum EnumCtor {
    ;
    EnumCtor(@TypeAnno Comparator<@TypeAnno String> cmp) {} // relevant content

    public static void main(String... args) throws Throwable {
        inspect(EnumCtor.class.getDeclaredConstructor(String.class, Integer.TYPE, Comparator.class));
    }

    static void inspect(Executable ctor) {
        var params = ctor.getParameters();
        System.out.println("Params:\n" + Arrays.toString(params));
        System.out.println("Param types:\n" + Arrays.toString(ctor.getParameterTypes()));
        System.out.println("Generic Params:\n" + Arrays.toString(ctor.getGenericParameterTypes()));
        System.out.println("Annotated Params:\n" + Arrays.toString(ctor.getAnnotatedParameterTypes()));
        System.out.println("Receiver:\n" + ctor.getAnnotatedReceiverType());
        for (int i = 0; i < params.length; i++) {
            var p = params[i];
            System.out.println("Param " + i + ":\n" + p.getType() + ", " + p.getParameterizedType() + ", " + p.getAnnotatedType());
        }
        System.out.println();
    }

}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface TypeAnno {} 