Java에서는 @Override와 같은 주석이 내부적으로 어떻게 작동합니까?
자바에서 주석이 내부적으로 어떻게 작동하는지 설명해 줄 사람?
자바에서 java.lang.annotation 라이브러리를 사용하여 커스텀 주석을 작성하는 방법을 알고 있습니다.그러나 @Override 주석과 같이 내부적으로 어떻게 작동하는지 아직 알 수 없습니다.
그것을 자세히 설명해 주시면 감사하겠습니다.
주석의 종류 간의 첫 번째 주요 차이점은 주석들이 컴파일 시 사용되고 나서 폐기되는지 여부입니다(예:@Override
또는 컴파일된 클래스 파일에 저장되며 런타임에 사용할 수 있습니다(Spring's 등).@Component
) 이것은 주석의 @Retention 정책에 따라 결정됩니다.주석을 직접 작성하는 경우 주석을 실행 시(자동 구성 시) 또는 컴파일 시(확인 또는 코드 생성 시)에만 사용할 수 있는지 결정해야 합니다.
주석을 포함한 코드를 컴파일 할 때, 컴파일러는 액세스 수식자와 같은 소스 요소에서 다른 수식자를 보는 것처럼 주석을 봅니다.public
/private
) 또는final
주석을 발견하면 주석 프로세서를 실행합니다. 주석 프로세서는 특정 주석과 관련이 있음을 나타내는 플러그인 클래스와 같습니다.주석 프로세서는 일반적으로 컴파일되는 요소를 검사하기 위해 Reflection API를 사용합니다.또한 단순히 이들 요소에 대한 검사를 실행하거나 수정하거나 컴파일할 새로운 코드를 생성할 수도 있습니다. @Override
첫 번째 예에서는 Reflection API를 사용하여 슈퍼클래스 중 하나에서 메서드시그니처와 일치하는 것을 찾아내고,Messager
컴파일 에러를 발생시킵니다.
주석 프로세서를 작성하는 데 사용할 수 있는 튜토리얼이 몇 가지 있습니다.여기 유용한 튜토리얼이 있습니다.인터페이스의 메서드를 조사하여 컴파일러가 주석 프로세서를 호출하는 방법을 확인합니다.메인 조작은,process
method. 이것은 컴파일러가 일치하는 주석을 가진 요소를 볼 때마다 호출됩니다.
다른 사람들이 제안한 것 외에, 주석의 작동 방식을 보기 위해 처음부터 맞춤 주석과 해당 프로세서를 작성할 것을 권장합니다.
예를 들어, 저는 컴파일 시간에 메서드가 오버로드되지 않았는지 확인하기 위해 주석을 작성했습니다.
'아,아,아,아,아,아,아,아,아,아,아'라는.Overload
에 이 을 붙입니다.@Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
다음으로 정의된 주석으로 주석을 단 요소를 처리할 수 있는 프로세서를 만듭니다.「」로 을 단 .@Overload
그 시그니처는 여러 번 표시되어야 합니다.또는 에러가 인쇄됩니다.
package gearon.customAnnotation;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
@SupportedAnnotationTypes("gearon.customAnnotation.Overload")
public class OverloadProcessor extends AbstractProcessor{
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// TODO Auto-generated method stub
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(Element element : roundEnv.getElementsAnnotatedWith(Overload.class)){
String signature = element.getSimpleName().toString();
int count = map.containsKey(signature) ? map.get(signature) : 0;
map.put(signature, ++count);
}
for(Entry<String, Integer> entry: map.entrySet()){
if(entry.getValue() == 1){
processingEnv.getMessager().printMessage(Kind.ERROR, "The method which signature is " + entry.getKey() + " has not been overloaded");
}
}
return true;
}
}
과 그 후 jar를 사용하여 .@Overload
합니다.
import gearon.customAnnotation.Overload;
public class OverloadTest {
@Overload
public static void foo(){
}
@Overload
public static void foo(String s){
}
@Overload
public static void nonOverloadedMethod(){
}
}
★★nonOverloadedMethod()
실제로 과부하가 되지 않았습니다.하다
있습니다@Override
: http://www.docjar.com/html/api/java/lang/Override.java.html.
사용자가 직접 작성할 수 있는 주석과 다른 점은 없습니다.흥미로운 부분은 주석의 소비자에 있습니다.다음과 같은 주석의 경우@Override
Java 컴파일러 자체 또는 정적 코드 분석 도구 또는 IDE에 있습니다.
기본적으로 주석은 컴파일러 또는 응용 프로그램에 의해 읽히는 마커일 뿐입니다.보존 정책에 따라 컴파일 시에만 사용할 수 있거나 런타임에 리플렉션을 사용하여 읽을 수 있습니다.
많은 프레임워크는 런타임 보존을 사용합니다. 즉, 클래스, 메서드, 필드 등에 일부 주석이 존재하는지 여부를 반사적으로 확인하고 주석이 존재하는지 여부를 확인합니다.또한 주석 구성원을 사용하여 추가 정보를 전달할 수 있습니다.
이 링크를 클릭해 주세요.이것은 당신의 문제에 대한 정확한 답을 제공할 것입니다.에 있는 주석들에 초점을 맞출 수 있습니다.Java
주석은 Java 5에서 도입되었으며 봄 고유하지 않습니다.일반적으로 주석을 사용하여 클래스, 메서드 또는 변수에 메타데이터를 추가할 수 있습니다.주석은 컴파일러(@Override 주석 등) 또는 스프링 등의 프레임워크(@Component 주석 등)로 해석할 수 있습니다.
또한, 저는 참고 자료를 더 추가하고 있습니다.
- http://www.codeproject.com/Articles/272736/Understanding-Annotations-in-Java
- http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/package-summary.html
- http://www.coderanch.com/how-to/java/AnnotationsExample
나도 같은 질문의 답을 찾고 있었다.아래 링크는 주석의 내부를 얻기 위한 통합된 좋은 정보를 제공합니다.https://dzone.com/articles/how-annotations-work-java 도움이 되길 바랍니다!
언급URL : https://stackoverflow.com/questions/18189980/how-do-annotations-like-override-work-internally-in-java
'source' 카테고리의 다른 글
getter를 사용하는 경우 (0) | 2022.10.03 |
---|---|
일부 스크립트에서 닫는 PHP 태그 '?>가 생략되는 이유는 무엇입니까? (0) | 2022.10.03 |
JavaScript에서 문자열을 비교하는 최적의 방법? (0) | 2022.10.03 |
osx 마리아DB max_allowed_packet 설정 방법 (0) | 2022.10.03 |
정규식을 사용하여 소수인지 확인하는 방법 (0) | 2022.10.03 |