Java 기초 자습서의 이해
7276 단어 JavaAnnotation
개념
Annontation은 Java5에서 도입하기 시작한 새로운 피쳐입니다.중국어 명칭은 일반적으로 주해라고 부른다.모든 정보나 메타데이터 (metadata) 를 프로그램 요소 (클래스, 방법, 구성원 변수 등) 와 연결하는 안전한 주석 메커니즘을 제공합니다.
더욱 통속적인 의미는 프로그램의 요소(클래스, 방법, 구성원 변수)에 더욱 직관적이고 명확한 설명을 덧붙이는 것이다. 이런 설명 정보는 프로그램의 업무 논리와 무관하고 지정된 도구나 프레임워크에 사용된다.
Annontation은 일종의 수식자처럼 패키지, 유형, 구조 방법, 방법, 구성원 변수, 파라미터와 로컬 변수의 성명 문장에 응용된다.
원리
Annotation은 사실 인터페이스입니다.Java의 반사 메커니즘과 관련된 API를 통해 annotation 정보에 접근합니다.관련 클래스 (프레임워크나 도구의 클래스) 는 이러한 정보에 따라 프로그램 요소를 사용하거나 행동을 바꾸는 방법을 결정합니다.
annotation은 프로그램 코드의 실행에 영향을 주지 않습니다. annotation이 어떻게 변하든지 간에 코드는 시종일관 실행됩니다.
Java 언어 해석기는 작업할 때 이 annotation을 무시합니다. 따라서 JVM에서 이 annotation들은'작용되지 않는다'는 것입니다. 이 annontaion 형식의 정보에 접근하고 처리할 수 있는 도구만 있습니다.
Annotation 과 interface 의 차이점:
1), Annotation 유형은 인터페이스 대신 키워드 @interface를 사용합니다.
이 키워드는 자바를 계승했다는 메시지를 담고 있습니다.lang.annotation.인터페이스가 아닌 Annotation 인터페이스
2), Annotation 유형, 방법 정의는 독특하고 제한되어 있습니다.
Annotation 유형의 메서드는 매개 변수 없음, 예외 없음으로 선언되어야 합니다.이 방법들은 annotation의 구성원을 정의합니다. 방법 이름은 구성원의 이름이 되고, 방법 반환 값은 구성원의 유형이 됩니다.방법 반환값 형식은primitive 형식,Class 형식,매거 형식,annotation 형식 또는 앞의 형식 중 하나를 요소의 1차원 그룹으로 해야 합니다.방법의 뒤에 default와 기본 수치를 사용하여 구성원의 기본값을 설명할 수 있습니다.null은 구성원의 기본값으로 사용할 수 없습니다. 이것은 우리가 비annotation 형식에서 정의한 방법과 크게 다릅니다.
Annotation 형식과 그 방법은 annotation 형식의 매개 변수를 사용할 수 없고, 구성원은generic일 수 없습니다.되돌아오는 값 형식만 클래스인 방법은annotation 형식에서generic를 사용할 수 있습니다. 이 방법은 클래스로 여러 종류를 클래스로 변환할 수 있기 때문입니다.
3), Annotation 유형은 인터페이스와 유사합니다.
그것들은 상수, 정적 구성원 유형 (예를 들어 매거 유형 정의) 을 정의할 수 있다.Annotation 유형도 인터페이스처럼 구현되거나 상속될 수 있습니다.
3. 응용 장소
annotation은 일반적으로 보조적인 경로로 소프트웨어 프레임워크나 도구에 응용된다. 이런 도구 클래스에서 서로 다른 annontation 주석 정보에 따라 서로 다른 처리 과정을 취하거나 해당하는 프로그램 요소(클래스, 방법 및 구성원 변수 등)를 바꾸는 행위.
예를 들어 Junit, Struts, Spring 등 유행하는 도구 프레임워크에서 annontion을 광범위하게 사용했다.코드의 유연성을 크게 향상시키다.
4. 일반적인 표준 Annotation
자바 5 버전부터 세 가지 표준 annontation 형식을 가지고 있습니다.
(1)、Override
java.lang.Override는marker annotation 형식으로 표시 방법으로 사용됩니다.이것은 표시된 방법이 부류를 다시 불러오는 방법을 설명하고 단언의 역할을 한다.만약 우리가 이 annotation을 사용하여 부모 클래스를 덮어쓰는 방법이 없을 때, 자바 컴파일러는 컴파일 오류로 경고할 것입니다.
이 annotaton은 종종 우리가 부류 방법을 덮어쓰려고 시도했지만 방법 이름을 잘못 썼을 때 보장적인 검사 과정을 추가합니다.
(2)、Deprecated
Deprecated도 일종의 marker annotation이다.유형이나 유형 구성원이 @Deprecated 수식을 사용하면 컴파일러는 이 표시된 프로그램 요소를 사용하지 않습니다.그래서 이런 수식을 사용하면 일정한'지속성'을 가진다. 만약에 우리가 코드에서 계승하거나 덮어쓰는 방식으로 이 유행이 지난 유형이나 구성원을 사용했다면 계승하거나 덮어쓴 유형이나 구성원은 @Deprecated로 성명되지 않았지만 컴파일러는 여전히 경찰에 신고해야 한다.
주의: @Deprecated라는 annotation 형식은javadoc의 @deprecated라는 태그와 차이가 있습니다. 전자는java컴파일러가 식별하고 후자는javadoc 도구에 의해 식별되어 문서를 만드는 데 사용됩니다. (프로그램 구성원이 왜 유행이 지났는지, 어떻게 금지되거나 대체되어야 하는지를 포함합니다.)
(3)、SuppressWarnings
이 메모는 클래스, 방법 및 구성원 변수에 대한 경고를 닫는 Java 컴파일러를 알려줍니다.
때때로 컴파일할 때 경고를 제기할 수 있다. 이 경고에 대해 어떤 경고는 버그가 숨겨져 있고, 어떤 경고는 피할 수 없으며, 어떤 보기 싫은 경고 정보에 대해서는 이 주석을 통해 차단할 수 있다.
SuppressWarning은 marker annotation이 아닙니다.String[] 유형의 구성원이 있으며 이 구성원의 값은 금지된 경고 이름입니다.javac 컴파일러의 경우 -Xlint 옵션에 유효한 경고 이름도 @SuppressWarings에 유효하며 컴파일러는 식별할 수 없는 경고 이름을 무시합니다.
annotation 문법은 annotation 이름 뒤에 괄호를 붙일 수 있습니다. 괄호에는 쉼표로 분할된 name=value를 사용하여 annotation에 사용할 구성원에게 값을 부여합니다.
코드:
@SuppressWarnings(value={"unchecked","fallthrough"})
public void lintTrap() { /* sloppy method body omitted */ }
이 예에서 SuppressWarnings annotation 형식은 하나의 단일한 구성원만 정의하기 때문에 간단한 value={...}name=value로 맞습니다.또 구성원 값이 하나의 그룹이기 때문에 대괄호를 사용하여 그룹 값을 표시합니다.주의: 우리는 아래의 상황에서 annotation을 줄일 수 있습니다. annotation은 단일 구성원만 있고 구성원은 "value="라고 명명됩니다."value="로 이동할 수 있습니다.예를 들어 위의 SuppressWarnings annotation을 줄임말로 사용합니다.
코드:
@SuppressWarnings({"unchecked","fallthrough"})
SuppressWarnings에서 선언된 금지된 경고 개수가 하나일 경우 괄호를 줄일 수 있습니다.
@SuppressWarnings("unchecked")
5. 사용자 정의 annontation 예시예제에는 다음과 같은 네 가지 클래스가 있습니다.
명세서 1: Author.java
package com.magc.annotation;
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;
/**
* ,name group
* @author magc
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {
String name();
String group();
}
명세서 2: 설명.java
/**
*
*/
package com.magc.annotation;
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 magc
*
* value
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
String value();
}
명세서 3: 유틸리티.java
package com.magc.annotation;
@Description(value = " ")
public class Utility {
@Author(name = "haoran_202",group="com.magc")
public String work()
{
return "work over!";
}
}
참고: 일반적인 Java 클래스로 @Description 및 @Author 메모가 실행됩니다.명세서 3: AnalysisAnnotation.java
package com.magc.annotation;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
/**
* annotation
*
*
*/
public static void main(String[] args) {
try {
// API annotation
Class rt_class = Class.forName("com.magc.annotation.Utility");
Method[] methods = rt_class.getMethods();
boolean flag = rt_class.isAnnotationPresent(Description.class);
if(flag)
{
Description description = (Description)rt_class.getAnnotation(Description.class);
System.out.println("Utility's Description--->"+description.value());
for (Method method : methods) {
if(method.isAnnotationPresent(Author.class))
{
Author author = (Author)method.getAnnotation(Author.class);
System.out.println("Utility's Author--->"+author.name()+" from "+author.group());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
주: 이것은 사용자 정의 @Description 및 @Author와 조립된 기본 프레임워크나 도구 클래스입니다. 이를 통해 일반 Java 클래스 Utility를 얻을 수 있습니다.java와 관련된 정보, 즉 묘사와 작가.AnalysisAnnotation 실행, 출력 결과:
Utility's Description---> 유용한 도구 클래스입니다.
Utility's Author--->haoran_202 from com.magc
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.