오늘 이거 알았네요/Java
[Java / Spring] 커스텀 Annotation
로그관리자
2023. 2. 10. 23:53
728x90
직접 어노테이션을 만들어보자
타입 정의하기
@interface 어노테이션 이름 {
타입 요소이름(); // 어노테이션 요소를 선언한다
...
}
어노테이션 내에 선언된 메서드를 ‘어노테이션의 요소(element)’라고 한다.
@interface TestInfo {
int count();
String testBy();
String[] testTools();
TestType testType(); //enum TestType {FIRST, FINAL}
DateTime testDate(); // 자신이 아닌 다른 어노테이션(@DateTime}을 포함할 수 있다.
}
@interface DateTime {
String yymmdd();
String hhmmss();
}
어노테이션의 요소
1. 반환 값이 있다.
2. 매개변수가 없는 추상메소드의 형태
3. 상속을 통해 구현하지 않아도 된다.
but, 이 요소들의 값을 빠짐없이 지정해주어야 한다. (순서 상관 없음)
@TestInfo(
count = 3,
testBy = "Kim",
testTools = {"JUnit", "AutoTester"},
testType = TestType.FIRST,
testDate = @DateTime(yymmdd="160101", hhmmss="2359559")
)
public class NewClass { ... }
4. 각 요소는 기본값을 가질 수 있다. (기본 값으로 null을 제외한 모든 리터럴이 가능)
5. 요소가 오직 하나뿐이고 이름이 value인 경우, 어노테이션 적용 시 이름 생략 가능
@interface TestInfo {
String value();
}
@TestInfo("passed") //@TestInfo(Value="passed")와 동일
class NewClass { ... }
6. 요소 타입이 배열
- 괄호 { }를 사용해서 여러 개의 값을 지정
- 기본 값 지정 시 괄호{ } 사용 가능
- 요소의 타입이 배열일 때 요소 이름이 value이면 요소 이름 생략 가능
@interface TestInfo {
String[] testTools();
}
@Test(testTools={"JUnit", "AutoTester"}) // 값이 여러개인 경우
@Test(testTools="JUnit") // 값이 하나일 때 괄호 {} 생략 가능
@Test(testTools={}) // 값이 없을 때 **괄호 {} 반드시 필요**
어노테이션 요소의 규칙
- 요소의 타입은 기본형, String, Enum, 어노테이션, Class만 허용
- ()안에 매개변수 선언 못 해
- 예외 선언 못 해
- 요소 타입을 매개변수로 정의 못 해
728x90