Annotation을 심도있게 학습하려면 자신만의 Annotation을 정의하고 사용할 수 있어야 합니다. 자신만의 Annotation을 정의하기 전에 Java에서 제공하는 Meta Annotation 및 관련 정의 Annotation의 구문을 이해해야 합니다.
------------------------------------- ----------------------------------
메타 주석:
메타 주석의 역할은 다른 주석에 주석을 다는 것입니다. Java5.0은 다른 주석 유형에 대한 설명을 제공하는 데 사용되는 네 가지 표준 메타 주석 유형을 정의합니다. Java5.0에 의해 정의된 메타 주석:
1.@대상,
2.@보유,
3.@문서화됨,
4.@상속됨
이러한 유형과 지원되는 클래스는 java.lang.annotation 패키지에 있습니다. 각 메타 주석의 역할과 해당 하위 매개변수 사용 지침을 살펴보겠습니다.
------------------------------------- ----------------------------------
@목표:
@Target은 Annotation에 의해 수정된 객체의 범위를 설명합니다. Annotation은 패키지, 유형(클래스, 인터페이스, 열거형, Annotation 유형), 유형 멤버(메서드, 생성자, 멤버 변수, 열거형 값), 메소드 매개변수 및 지역 변수( 루프 변수, 캐치 매개변수 등). Annotation 유형 선언에 target을 사용하면 수정된 대상을 더 명확하게 만들 수 있습니다.
기능: 주석의 사용 범위를 설명하는 데 사용됩니다(예: 설명된 주석을 사용할 수 있는 위치).
(ElementType) 값은 다음과 같습니다.
1.CONSTRUCTOR: 생성자 설명에 사용 2.FIELD: 도메인 설명에 사용 3.LOCAL_VARIABLE: 지역 변수 설명에 사용 4.METHOD: 메소드 설명에 사용 5.PACKAGE: 패키지 설명에 사용 6.PARAMETER: 사용 7.TYPE: 클래스, 인터페이스(주석 유형 포함) 또는 열거형 선언을 설명하는 데 사용됩니다.
사용 예:
@Target(요소 유형.FIELD)
공개 @인터페이스 NoDBColumn {
}
------------------------------------- ----------------------------------
@보유:
@Retention은 주석이 유지되는 기간을 정의합니다. 일부 주석은 소스 코드에만 나타나며 컴파일러에 의해 삭제됩니다. 반면 다른 주석은 클래스 파일에서 컴파일되어 가상화될 수 있습니다. 다른 것들은 클래스가 로드될 때 읽혀집니다. (Annotation과 클래스가 별도로 사용되기 때문에 클래스 실행에는 영향을 미치지 않습니다.) 주석의 "수명주기"를 제한하려면 이 메타 주석을 사용하십시오.
기능: 주석 정보를 저장해야 하는 수준을 나타내며 주석의 수명 주기를 설명하는 데 사용됩니다(예: 설명된 주석이 어떤 범위 내에서 유효한지).
(RetentionPoicy) 값은 다음과 같습니다.
1.SOURCE: 소스 파일에 유효함(즉, 소스 파일이 유지됨)
2.CLASS: 클래스 파일에서 유효함(예: 클래스 예약됨)
3.RUNTIME: 런타임에 유효함(즉, 런타임에 유지됨)
Retention 메타 주석 유형은 멤버로서 고유한 값을 가지며 해당 값은 java.lang.annotation.RetentionPolicy의 열거 유형 값에서 가져옵니다. 구체적인 예는 다음과 같습니다.
------------------------------------- ----------------------------------
@문서화됨:
@Documented는 주석이 달린 프로그램 멤버의 공개 API로 사용되어야 하고 따라서 javadoc과 같은 도구로 문서화할 수 있는 다른 유형의 주석을 설명하는 데 사용됩니다. Documented는 마크업 주석이며 멤버가 없습니다.
@Inherited 메타 주석은 특정 주석이 달린 유형이 상속됨을 나타내는 마크업 주석입니다. @Inherited로 수정된 주석 유형이 클래스에 사용되는 경우 이 주석은 해당 클래스의 하위 클래스에 사용됩니다.
참고: @Inherited 주석 유형은 주석이 달린 클래스의 하위 클래스에 상속됩니다. 클래스는 구현하는 인터페이스에서 주석을 상속하지 않으며, 메서드는 오버로드하는 메서드에서 주석을 상속하지 않습니다.
@Inherited 주석 유형으로 주석이 달린 주석의 Retention이 RetentionPolicy.RUNTIME인 경우 리플렉션 API는 이 상속을 강화합니다. @Inherited 주석 유형의 주석을 쿼리하기 위해 java.lang.reflect를 사용하면 반사 코드 검사가 작동하기 시작합니다. 지정된 주석 유형을 찾을 때까지 클래스와 해당 상위 클래스를 확인하거나 클래스 상속 구조의 최상위 수준을 확인합니다. 도달했습니다.
예제 코드:
------------------------------------- ----------------------------------
맞춤 주석:
@interface를 사용하여 주석을 사용자 정의하면 java.lang.annotation.Annotation 인터페이스가 자동으로 상속되고 기타 세부사항은 컴파일러에 의해 자동으로 완성됩니다. 주석을 정의할 때 다른 주석이나 인터페이스를 상속할 수 없습니다. @interface는 주석을 선언하는 데 사용되며 각 메서드는 실제로 구성 매개변수를 선언합니다. 메소드의 이름은 매개변수의 이름이고, 반환값 유형은 매개변수의 유형입니다. (반환값 유형은 기본 유형인 Class, String, enum만 가능합니다.) default를 통해 매개변수의 기본값을 선언할 수 있습니다.
주석 형식을 정의합니다.
공개 @interface 주석 이름 {정의 본문}
주석 매개변수의 지원되는 데이터 유형:
1. 모든 기본 데이터 유형(int, float, boolean, byte, double, char, long, short)
2. 문자열 유형 3. 클래스 유형 4. 열거형 유형 5. 주석 유형 6. 위의 모든 유형의 배열
주석 유형에서 매개변수를 설정하는 방법:
첫째, public 또는 default라는 두 가지 액세스 권한으로만 수정할 수 있습니다. 예를 들어 여기서는 메서드가 기본 유형으로 설정됩니다.
둘째, 매개변수 멤버는 byte, short, char, int, long, float, double, boolean의 8가지 기본 데이터 유형과 이러한 유형의 배열, String, Enum, Class, Annotation 등의 데이터 유형만 사용할 수 있습니다. String value(); 여기서 매개변수 멤버는 String입니다.
셋째, 매개변수 멤버가 하나만 있는 경우 매개변수 이름을 "value"로 설정하고 그 뒤에 괄호를 붙이는 것이 가장 좋습니다. 예: 다음 예의 FruitName 주석에는 매개변수 멤버가 하나만 있습니다.
간단한 사용자 정의 주석 및 주석 사용 예:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 과일 이름에 대한 참고사항
* @author 페이다
*
*/
@Target(요소 유형.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@문서화됨
공개 @interface FruitName {
문자열 값() 기본값 "";
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 과일 색상 주석
* @author 페이다
*
*/
@Target(요소 유형.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@문서화됨
공개 @interface FruitColor {
/**
* 색상 열거
* @author 페이다
*
*/
공개 열거형 Color{BULE,RED,GREEN};
/**
* 색상 속성
* @반품
*/
색상 FruitColor() 기본값 Color.GREEN;
}
import annotation.FruitColor.Color;
공개 클래스 Apple {
@FruitName("사과")
개인 문자열 appleName;
@FruitColor(과일색상=Color.RED)
개인 문자열 appleColor;
공공 무효 setAppleColor(문자열 appleColor) {
this.appleColor = 사과색상;
}
공개 문자열 getAppleColor() {
appleColor를 반환합니다.
}
공공 무효 setAppleName(문자열 appleName) {
this.appleName = 사과이름;
}
공개 문자열 getAppleName() {
사과이름을 반환합니다.
}
공공 무효 디스플레이 이름(){
System.out.println("과일 이름은 사과입니다.");
}
}