/**~**/
에 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로부터 HTML을 생성해내는 프로그램(javadoc.exe)을 만들어서 사용했다. https://docs.oracle.com/javase/tutorial/java/annotations/
메타데이터의 한 형태인 애노테이션
은 프로그램의 일부가 아닌 다른 프로그램에게 데이터를 제공한다.
애노테이션은 그들이 주석을 다는 코드의 동작에 어떤 영향도 미치지 않는다.
애노노테이션 예시 :@Test
이 메서드를 테스트 해야 한다는 것을 테스트 프로그램에게 알리는 역할을 할 뿐 메서드가 포함된 프로그램 자체에는 영향을 미치지 않는다.
해당 프로그램에 이미 정의된 종류와 형식으로 작성해야만 의미가 있다.
https://docs.oracle.com/javase/tutorial/java/annotations/
https://docs.oracle.com/javase/tutorial/java/annotations/basics.html
@Entity
@
는 컴파일러에게 주석임을 나타낸다 @Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass { ... }
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
@SuppressWarnings("unchecked")
void myMethod() { ... }
@inteface SuppressWarnings {
String[] value();
}
@SuppressWarnings({"deprecation", "unchecked"})
void myMethod() { ... }
@Override
void mySuperMethod() { ... }
@Author(name = "Jane Doe")
@EBook
class MyClass { ... }
@interface TestInfo{
String[] testTools();
}
@TestInfo(testTools={"JUnit", "AutoTester"})
@TestInfo(testTools="JUnit") // 값이 하나일때는 {} 생략 가능
@TestInfo(testTools={}) // 값이 없을 때는 {} 생략 불가
@interface TestInfo{
String[] testTools() default {"JUnit", "AutoTester"});
String[] testTools2() default "JUnit"; //값이 하나일때는 {} 생략 가능
}
@TestInfo // @TestInfo(testTools={"JUnit", "AutoTester"}, testTools2="JUnit") 과 동일
@TestInfor(testTools={}) // @TestInfo(testTools={"JUnit", "AutoTester"}, testTools2={}) 과 동일
class NewClass {
}
선언에 사용될 수 있다.
Java8부터 애노테이션은 타입을 사용할 때 적용될 수 있다.
new @Interned MyObject();
myString = (@NonNull String) str;
class UnmodifiableList<T> implements
@Readonly List<@Readonly T> { ... }
void monitorTemperature() throws
@Critical TemperatureException { ... }
https://docs.oracle.com/javase/tutorial/java/annotations/declaring.html
@interface 애노테이션이름 {
타입 요소이름(); // 애노테이션의 요소를 선언한다.
}
interface
앞에 @
(AT)이 붙는 것을 제외하고. public class Generation3List extends Generation2List {
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
// class code goes here
}
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
String[] reviewers();
}
@interface ClassPreamble {
DateTime testDate(); // (@Datetime)
TestTime testType(); // enum TestTime { FIRST, FINAL }
}
@interface TestInfo{
int id = 10; // ok. 상수선언 가능
String testName(String name); // 에러. 매개변수 선언 불가
String wrong() throw Exception // 에러. 예외 선언 불가
ArrayList<T> list(); // 에러. 요소의 타입에 타입 매개변수 사용 불가
}
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
// Note array notation
reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {
// class code goes here
}
// import this to use @Documented
import java.lang.annotation.*;
@Documented
@interface ClassPreamble {
// Annotation element definitions
}
@interface TestAnno extends Annotation
하면 에러애노테이션 | 설명 |
---|---|
@Target | 애노테이션이 적용 가능한 대상 지정하는데 사용 |
@Documented | 애노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다 |
@Inherited | 애노테이션이 자손클래스에 상속되도록한다 |
@Retention | 애노테이션이 유지되는 범위를 지정하는데 사용 |
@Repeatable | 애노테이션을 반복해서 적용할 수 있게한다. (JDK 1.8) |
https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html
유지정책 | 의미 |
---|---|
RetentionPolicy.SOURCE | 소스파일에만 존재. 클래스 파일에는 존재x. 컴파일러에게 무시된다 |
RetentionPolicy.CLASS | 컴파일러에 의해 컴파일 타임에 유지. 하지만 JVM에 의해서는 무시된다. (실행시 사용불가) (기본값) |
RetentionPolicy.RUNTIME | JVM에 의해 유지. 런타임에 사용될 수 있다 |
컴파일러가 사용하는 애노테이션은 유지 정책이 SOURCE
유지정책이 RUNTIME이면 실행시에 리플렉션 reflection을 통해 클랫 파일에 저장된 애노테이션 정보를 읽어 처리할 수 있다.
@Controller
가 runtime
@Inherited 의 예에서 RetentionPolicy.RUNTIME 을 붙이지 않으면 출력시(runtime) 아무 것도 출력되지 않는다.
대상타입 | 의미 |
---|---|
ElementType.ANNOTATION_TYPE | 어노테이션 타입에 적용 가능 |
ElementType.CONSTRUCTOR | 생성자에 적용 가능 |
ElementType.FIELD | 필드나 속성에 적용 가능(멤버변수, enum 상수) |
ElementType.LOCAL_VARIABLE | 지역변수에 적용 가능 |
ElementType.METHOD | 메소드 레벨에 적용 가능 |
ElementType.PACKAGE | 패키지 선언에 적용 가능 |
ElementType.METHOD | 메소드 레벨에 적용 가능 |
ElementType.PARAMETER | 메소드의 매개변수에 적용 가능 |
ElementType.TYPE | 클래스의 모든 요소에 적용 가능(클래스, 인터페이스, enum), 타입을 선언할 때 |
ElementType.TYPE_PARAMETER | 타입 매개변수 가능 |
ElementType.TYPE_USE | 타입이 사용되는 모든 곳, 해당 타입의 변수를 선언할 때 |
imprt static java.lang.annotation.ElementType.*;
@Target({FIELD, METHOD})
public @interface SuprressWarnings {
}
https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913