어노테이션과 메타스페이스
1. 제네릭타입 선언부에도 사용가능
//annotation @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_PARAMETER) public @interface ParmeterEx { } //class에 사용 public class AnnotationStudy <@ParmeterEx T> { public void print( T t){} } //method에 사용 public class AnnotationStudy { public <@ParmeterEx T> void print( T t){} } //method에 사용 public class AnnotationStudy { public <@ParmeterEx T> void print(T t) throws @ParameterEx SomthingException{} } //BYTE CODE public class study/AnnotationStudy { // compiled from: AnnotationStudy.java @Lstudy/ParmeterEx;() : CLASS_TYPE_PARAMETER 0, null // access flags 0x0 Ljava/lang/String; name // access flags 0x1 public <init>()V L0 LINENUMBER 3 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init> ()V L1 LINENUMBER 4 L1 ALOAD 0 LDC "default" PUTFIELD study/AnnotationStudy.name : Ljava/lang/String; RETURN L2 LOCALVARIABLE this Lstudy/AnnotationStudy; L0 L2 0 // signature Lstudy/AnnotationStudy<TT;>; // declaration: this extends study.AnnotationStudy<T> MAXSTACK = 2 MAXLOCALS = 1 // access flags 0x1 // signature <R:Ljava/lang/Object;>()V // declaration: void print<R>() public print()V @Lstudy/ParmeterEx;() : METHOD_TYPE_PARAMETER 0, nullpublic class AnnotationStudy { public <T> void print(@ParmeterEx T a){} }@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) public @interface ParmeterEx { } @ParmeterEx public class AnnotationStudy <@ParmeterEx T>{ @ParmeterEx String name = "default"; @NonNull public <@ParmeterEx R> void print(@ParmeterEx String t, @ParmeterEx R r){ @ParmeterEx int a=1; } } //byte code // class version 61.0 (61) // access flags 0x21 // signature <T:Ljava/lang/Object;>Ljava/lang/Object; // declaration: study/AnnotationStudy<T> public class study/AnnotationStudy { // compiled from: AnnotationStudy.java @Lstudy/ParmeterEx;() @Lstudy/ParmeterEx;() : CLASS_TYPE_PARAMETER 0, null // access flags 0x0 Ljava/lang/String; name @Lstudy/ParmeterEx;() : FIELD, null // access flags 0x1 public <init>()V L0 LINENUMBER 4 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init> ()V L1 LINENUMBER 5 L1 ALOAD 0 LDC "default" PUTFIELD study/AnnotationStudy.name : Ljava/lang/String; RETURN L2 LOCALVARIABLE this Lstudy/AnnotationStudy; L0 L2 0 // signature Lstudy/AnnotationStudy<TT;>; // declaration: this extends study.AnnotationStudy<T> MAXSTACK = 2 MAXLOCALS = 1 // access flags 0x1 // signature <R:Ljava/lang/Object;>(Ljava/lang/String;TR;)V // declaration: void print<R>(java.lang.String, R) public print(Ljava/lang/String;Ljava/lang/Object;)V @Lstudy/ParmeterEx;() : METHOD_TYPE_PARAMETER 0, null @Lstudy/ParmeterEx;() : METHOD_FORMAL_PARAMETER 0, null @Lstudy/ParmeterEx;() : METHOD_FORMAL_PARAMETER 1, null L0 LINENUMBER 10 L0 ICONST_1 ISTORE 3 L1 LINENUMBER 11 L1 RETURN L2 LOCALVARIABLE this Lstudy/AnnotationStudy; L0 L2 0 // signature Lstudy/AnnotationStudy<TT;>; // declaration: this extends study.AnnotationStudy<T> LOCALVARIABLE t Ljava/lang/String; L0 L2 1 LOCALVARIABLE r Ljava/lang/Object; L0 L2 2 // signature TR; // declaration: r extends R LOCALVARIABLE a I L1 L2 3 LOCALVARIABLE @Lstudy/ParmeterEx;() : LOCAL_VARIABLE, null [ L1 - L2 - 3 ] MAXSTACK = 1 MAXLOCALS = 4 // access flags 0x9 public static main([Ljava/lang/String;)V L0 LINENUMBER 15 L0 RETURN L1 LOCALVARIABLE args [Ljava/lang/String; L0 L1 0 MAXSTACK = 0 MAXLOCALS = 1 }@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE}) @Retention(RetentionPolicy.CLASS) @Documented public @interface NonNull { }
2. 중복 사용 가능
배열 병렬 정렬
Metaspace
PermGen
Metaspace
후기
Last updated