자바 어노테이션은 코드에 대한 정보를 제공합니다. 자바 어노테이션은 어노테이션을 달지만 직접적인 영향을 미치지 않습니다. 자바 어노테이션 튜토리얼에서는 다음을 살펴볼 것입니다;
- 내장 자바 어노테이션
- 사용자 정의 어노테이션 작성 방법
- 어노테이션 사용법 및 리플렉션 API를 사용하여 어노테이션 파싱하는 방법
자바 어노테이션
자바 1.5에서 어노테이션이 소개되었으며 현재는 하이버네이트, Jersey, 그리고 Spring과 같은 자바 EE 프레임워크에서 널리 사용되고 있습니다. 자바 어노테이션은 프로그램에 포함된 프로그램 메타데이터입니다. 어노테이션 구문 분석 도구 또는 컴파일러에 의해 구문 분석될 수 있습니다. 또한 컴파일 시간까지 또는 런타임까지 어노테이션의 가용성을 지정할 수도 있습니다. 자바 어노테이션 이전에는 프로그램 메타데이터가 자바 주석이나 Javadoc을 통해 사용 가능했지만 어노테이션은 그 이상의 기능을 제공합니다. 어노테이션 메타데이터는 런타임에서도 사용할 수 있으며 어노테이션 구문 분석기는 프로세스 흐름을 결정하기 위해 이를 사용할 수 있습니다. 예를 들어 Jersey 웹서비스에서는 메서드에 URI 문자열과 함께 PATH 어노테이션을 추가하고 런타임에서 jersey가 주어진 URI 패턴에 대해 호출할 메서드를 결정합니다.
자바 사용자 정의 어노테이션
Translated text:
사용자: 사용자 정의 주석을 작성하는 것은 인터페이스를 작성하는 것과 유사하지만 인터페이스 키워드 앞에 _@_ 기호가 붙습니다. 주석에서 메소드를 선언할 수 있습니다. 자바 사용자 정의 주석 예제를 살펴보고 나중에 그 기능과 중요한 포인트를 논의하겠습니다.
package com.journaldev.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
String author() default "Pankaj";
String date();
int revision() default 1;
String comments();
}
자바 주석에 관한 몇 가지 중요한 포인트는 다음과 같습니다:
- 주석 메소드는 매개변수를 가질 수 없습니다.
- 주석 메소드의 반환 유형은 기본형, 문자열, 열거형, 주석 또는 이러한 형식의 배열로 제한됩니다.
- 자바 주석 메소드에는 기본값이 있을 수 있습니다.
- 주석에는 메타 주석이 첨부될 수 있습니다. 메타 주석은 주석에 대한 정보를 제공하는 데 사용됩니다.
자바의 메타 주석
다섯 가지 유형의 메타 주석이 있습니다:
- @Documented – 이 주석을 사용하는 요소는 javadoc 및 유사한 도구에서 문서화되어야 함을 나타냅니다. 이 유형은 주석된 요소의 사용에 영향을주는 유형의 선언에 주석을 달 때 사용해야합니다. 선언 유형이 Documented로 주석 처리되면 해당 주석은 주석된 요소의 공개 API의 일부가 됩니다.
- @대상 – 주석 유형이 적용 가능한 프로그램 요소를 나타냅니다. 일부 가능한 값은 TYPE, METHOD, CONSTRUCTOR, FIELD 등입니다. 대상 메타 주석이 없으면 주석을 어떤 프로그램 요소에도 사용할 수 있습니다.
- @상속 – 주석 유형이 자동으로 상속됨을 나타냅니다. 사용자가 클래스 선언에 주석 유형을 쿼리하고 해당 유형에 대한 주석이 없는 경우 클래스의 슈퍼 클래스가 자동으로 해당 유형에 대한 주석을 쿼리합니다. 이 프로세스는 해당 유형에 대한 주석이 발견되거나 클래스 계층 구조의 맨 위 (Object)에 도달할 때까지 반복됩니다.
- @유지 – 주석이 있는 유형이 유지될 기간을 나타냅니다. 유지 정책 인수를 사용하며 가능한 값은 SOURCE, CLASS 및 RUNTIME입니다.
- @반복 가능 – 해당 주석 유형이 반복 가능하다는 것을 나타냅니다.
Java의 내장 주석
Java는 내장 주석 다섯 가지를 제공합니다.
@Override
– 슈퍼클래스의 메서드를 재정의할 때에는 이 주석을 사용하여 컴파일러에게 해당 메서드를 재정의하고 있다고 알려야 합니다. 따라서 슈퍼클래스의 메서드가 제거되거나 변경되면 컴파일러가 오류 메시지를 표시합니다. 언제나 메서드를 재정의할 때 자바 재정의 주석을 사용해야 하는 이유를 알아봅니다.@Deprecated
– 메서드가 더 이상 사용되지 않는다는 것을 컴파일러에게 알리고 싶을 때 이 주석을 사용해야 합니다. Java는 javadoc에서 해당 메서드가 왜 사용되지 않게 되었는지 그리고 어떤 대안을 사용해야 하는지에 대한 정보를 제공하는 것을 권장합니다.@SuppressWarnings
– 이것은 컴파일러가 생성하는 특정 경고를 무시하도록 하는 것뿐입니다. 예를 들어 자바 제네릭스에서 원시 타입을 사용할 때입니다. 이의 보유 정책은 SOURCE이며 컴파일러에 의해 삭제됩니다.@FunctionalInterface
– 이 주석은 자바 8에서 도입되었으며 해당 인터페이스가 함수형 인터페이스임을 나타냅니다.@SafeVarargs
– 주석이 달린 메서드나 생성자의 본문이 varargs 매개변수에 대해 잠재적으로 안전하지 않은 작업을 수행하지 않음을 프로그래머가 단언하는 것입니다.
자바 주석 예제
위 예제에서 우리가 만든 사용자 정의 주석을 사용하는 방법과 자바 내장 주석을 보여주는 자바 예제를 살펴보겠습니다.
package com.journaldev.annotations;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
public class AnnotationExample {
public static void main(String[] args) {
}
@Override
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1)
public String toString() {
return "Overriden toString method";
}
@Deprecated
@MethodInfo(comments = "deprecated method", date = "Nov 17 2012")
public static void oldMethod() {
System.out.println("old method, don't use it.");
}
@SuppressWarnings({ "unchecked", "deprecation" })
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10)
public static void genericsTest() throws FileNotFoundException {
List l = new ArrayList();
l.add("abc");
oldMethod();
}
}
I believe above java annotation example is self-explanatory and showing the use of annotations in different cases.
자바 주석 구문 분석
우리는 Reflection을 사용하여 클래스에서 자바 주석을 구문 분석할 것입니다. 주의해야 할 점은 주석 유지 정책이 RUNTIME이어야 한다는 것입니다. 그렇지 않으면 그 정보가 런타임에서 사용할 수 없으며 해당 정보에서 데이터를 가져올 수 없습니다.
package com.journaldev.annotations;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationParsing {
public static void main(String[] args) {
try {
for (Method method : AnnotationParsing.class.getClassLoader()
.loadClass(("com.journaldev.annotations.AnnotationExample")).getMethods()) {
// 메소드에 MethodInfo 주석이 있는지 확인합니다
if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
try {
// 메소드에서 사용 가능한 모든 주석을 반복합니다
for (Annotation anno : method.getDeclaredAnnotations()) {
System.out.println("Annotation in Method '" + method + "' : " + anno);
}
MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
if (methodAnno.revision() == 1) {
System.out.println("Method with revision no 1 = " + method);
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
} catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
위 프로그램의 출력은 다음과 같습니다:
Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)
Reflection API는 자바, J2EE 프레임워크인 스프링, 하이버네이트, JUnit 등에서 널리 사용되는 강력한 기능입니다. 자바 주석 예제 튜토리얼은 여기까지입니다. 여러분이 무언가를 배웠으면 좋겠습니다. 자바 주석 업데이트:
- 서블릿 사양 3.0은 서블릿 구성 및 초기 매개변수에 주석 사용을 소개했습니다. 자바 서블릿 튜토리얼에서 자세한 내용을 확인하세요.
- 우리는 Struts 2에서 주석을 사용하여 작업 클래스 및 결과 페이지를 구성할 수 있습니다. 작동 예제는 Struts 2 Hello World 주석 예제에서 확인할 수 있습니다.
참고: 오라클 웹사이트
Source:
https://www.digitalocean.com/community/tutorials/java-annotations