JAVA/Basic

[스터디할래? Java 12]애노테이션

[스터디할래? Java] 목차

이글은 백기선님 스터디 할래? 스터디를 뒤늦게 따라간 기록입니다.

스터디할래 링크 >> https://github.com/whiteship/live-study

이필기를 시작으로 공부했습니다 >> https://b-programmer.tistory.com/264 ,

                                                https://gowoonsori.site/java/annotation/

여기 없는내용은 스터디 할래 강의 내용 혹은 제가 java Doc보고작성하거나 예제를 만들어 추가했습니다.

그외는 같이 출처가 써있습니다. 

어노테이션 정의방법 @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {

java.lang.Annotation 구현 from Bytecode
장점 : 유효성검사등 명시 , AOP 을 쉽게 구성할 수 있게해준다. 
용도 : 문서화, 컴파일러 체크, 코드 분석 자동생성, 런타임 프로세싱
완전히 정적이어야 한다. final. 
빌트인 어노테이션 Java에 내장되어 있는 어노테이션, 컴파일러를 위한 어노테이션
@Override
@Deprecated
@SuppressWarning
개발자가 의도를 가지고 만들었는데 컴파일이 알지못하고 경고를 띄울수있어 제거하는목적
@SafeVarargs
jdk7 제네릭 같은 가변인자 매개변수 사용시 경고 무시
@FunctionalInterface
메타 어노테이션 어노테이션 정의 하기 위해 사용
@Retention, @Target, @Documented, @Inherited, @Repeatable
@Retention 어노테이션 LIfe Time 적용범위
public enum RetentionPolicy {
    SOURCE,  // 소스파일에만 존재, 클래스파일존재 안함
    CLASS,    // 클래스파일에만 존재, 런타임유지 필요없음 
                // default : class
    RUNTIME // 클래스파일에도 존재하고 런타임에 VM에 의해 유지, ==> 리플렉션 정보읽기가능
}
// 정말 Runtime 설정이 필요한 정보인가? 
리플렉션
XXXController.class.getAnnotation();
XXXController.class.getDeclardAnnotations();//클래스에 정의되어 있는것만

@Target 어노테이션 적용대상
public enum ElementType {
    TYPE,   //Class, Interface, enum , recode(JDK14)
    FIELD,
    METHOD,
    PARAMETER,  // 매개변수
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
//1.8 이후 추가. 
    TYPE_PARAMETER,  //타입메개변수
//jdk 9이후
    TYPE_USE,
    MODULE,
//jdk 14
    RECORD_COMPONENT
}
@Documented 어노테이션 정보 javaDoc 작성된 문서에 포함. 생성된문서가 어노테이션인지 여부가 차이가남.
@Inherited 부모에 이설정이 있는 어노테이션이 있으면 
자식도 같이 씀.  (하기 예시참조)
@Repeatable 어노테이션을 반복적으로 선언할 수 있게 하는 어노테이션
애노테이션 프로세서 어노테이션을 프로세싱 하는기술.
컴파일타임에 어노테이션들을 프로세싱하는 javac에 속한 빌드 툴로 어노테이션
소스코드를 분석하고 처리하기 위해 사용되는 훅. 
- 보일러플레이트코드 제거하는데 도움이 된다. 
: AbstractProcessort 구현하여 만들고 getter/setter 컴파일타임에 만들어서 보일러 플레이트 코드 제거.
marker annotation 메서드 선언 없는 인터페이스
ex) Serializable, Cloneable
public interface Serializable {
}
   

어노테이션 에노테이션 에너테이션 어너테이션

 

책추천: 

아웃라이어... 1만시간....

부의 추월차선.....사업.  5일을 노예처럼일하고. 노예처럼일하기위해 2일을 쉰다. 

 

XDoclet 엑스닥렛 java5.... 에노테이션 전신

 

ServiceLoader : JAR 파일에 포함된 구성 파일을 읽어서 인터페이스 구현을 찾고, 구현을 선택한 오브젝트의 목록으로 사용. 

serviceLoader.load(XXXX.class)

 

@Inherited

package study;

import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface InheritedAnnotation {
}

@Retention(RetentionPolicy.RUNTIME)
@interface notInherit{
}
@InheritedAnnotation
class A {}
@notInherit
class B {}
class AA extends A {}
class BB extends B {}

class test{
    public static void main(String[] args) {
        Class AAClass = AA.class;
        Class BBClass = BB.class;

        Annotation[] AAAnnotations =AAClass.getAnnotations();

        for (int i = 0; i < AAAnnotations.length; i++) {
            System.out.println(AAAnnotations[i]);
        }
        Annotation[] BBAnnotations =BBClass.getAnnotations();

        for (int i = 0; i < BBAnnotations.length; i++) {
            System.out.println(BBAnnotations[i]);
        }
    }
}