주석 (메타 데이터라고도 함)은 코드에 정보를 추가 할 수있는 공식적인 방법을 제공하여 나중에이 데이터를 매우 편리하게 사용할 수 있습니다.
1. 기본 구문
Java SE5에는 세 가지 내장 표준 주석이 있습니다
@override : 현재 메소드 정의가 슈퍼 클래스에서 메소드를 덮어 쓸 것임을 나타냅니다. 실수로 잘못된 철자를 철자하거나 메소드 서명이 덮어 쓰기 메소드와 일치하지 않으면 컴파일러가 오류 메시지를 발행합니다.
@DepRecated : 프로그래머가 주석이 달린 요소를 사용하는 경우 컴파일러는 경고 메시지를 발행합니다.
@supperesswarnings : 부적절한 컴파일러 경고 메시지를 닫습니다.
Java SE5에는 4 개의 내장 메타 주석이 있습니다
@target :이 주석을 사용할 수있는 위치를 나타냅니다. 가능한 요소 유형 매개 변수는 다음과 같습니다.
1) 생성자 : 생성자의 진술
2) 필드 : 도메인 선언 (열거 인스턴스 포함)
3) Local_variable : 로컬 변수 선언
4) 방법 : 메소드 문
5) 패키지 : 패키지 명령문
6) 매개 변수 : 매개 변수 선언
7) 유형 : 클래스, 인터페이스 (주석 유형 포함) 또는 열거 선언
@retention : 주석 정보를 저장할 수있는 수준을 나타냅니다. 옵션 러브 홀릭 매개 변수는 다음과 같습니다.
1) 출처 : 주석은 컴파일러에 의해 폐기됩니다.
2) 클래스 : 주석은 클래스 파일에서 사용할 수 있지만 VM에서 폐기합니다.
3) 런타임 : VM은 런타임 중에 주석을 유지하므로 주석 정보를 반사 메커니즘을 통해 읽을 수 있습니다.
@Documented : Javadoc 에이 주석을 포함시킵니다
@Inherited : 서브 클래스가 대부분의 시간 동안 부모 클래스에서 주석을 물려 받도록 허용하고 프로그래머는 주로 자신의 주석을 정의하고 자신의 프로세서를 작성하여 처리합니다.
usecase.java
패키지 com; import java.lang.annotation.elementtype; java.lang.annotation.trention import; java.lang.annotation.retentionpolicy import; Java.lang.annotation.target import; @target (elementtype.method) // 주석이 적용되는 위치를 정의하는 데 사용하며, 소스 코드 (클래스) 또는 런타임 (런타임) @retention (retentionpolicy.runtime) public @interface usecase {public ind id (); public String description () 기본 "설명 없음"; } passwordUtils .java 패키지 com; public class passwordutils {@usecase (id = 47, description = "암호는 하나 이상의 숫자를 포함해야합니다") public boolean validatepassword () {return true; } @usecase (id = 48) public string alcryptpassword (String password) {return password; } @usecase (id = 49, description = "jong_cai") public void showingame () {system.out.println ( "jong_cai"); }}
2. 주석 프로세서를 쓰십시오
주석을 읽는 도구가 없으면 주석이 주석보다 더 유용하지 않습니다. 주석을 사용하는 과정에서 중요한 부분은 주석 프로세서를 작성하고 사용하는 것입니다. Java SE5는 프로그래머가 그러한 도구를 구성 할 수 있도록 반사 메커니즘 API를 확장합니다. 동시에 프로그래머가 Java 소스 코드를 주석으로 구문 분석 할 수 있도록 외부 도구 APT를 제공합니다. 아래는 매우 간단한 주석 프로세서로, PasswordUtils 클래스를 읽고 반사 메커니즘을 사용하여 @usecase 태그를 찾는 데 사용할 것입니다. ID 값 세트를 제공 한 다음 PasswordUtils에있는 사용 사례와 누락 된 사용 사례가 나열됩니다.
usecasetracker.java 패키지 com; import java.lang.reflect.method; java.util.arraylist 가져 오기; java.util.collections import; Java.util.list 가져 오기; public class usecasetracker {public static void trackusecases (list <integer> list, class <?> cl) {for (method m : cl.getDeclaredMethods ()) {usecase us = m.getAnnotation (usecase.class); if (us! = null) {system.out.println ( "발견 된 사용 사례 :" + us.id () + "" + us.description ()); list.remove (new Integer (us.id ()); }} for (int i : list) {system.out.println ( "경고 : 누락 된 유스 케이스-" + i); }} public static void main (string [] args) {list <integer> list = new arraylist <integer> (); Collections.addall (목록, 47,48,49,50,51); TrackUsecases (list, passwordUtils.class); }}
이 프로그램은 GetDeclaredMethods () 및 GetAnnotation ()의 두 가지 반사 방법을 사용합니다. 둘 다 주석이있는 인터페이스 (클래스, 메소드 및 필드 및 기타 클래스 가이 인터페이스를 구현)에 속합니다. GetAnnotation () 메소드는 지정된 유형의 USECASE 인 주석 개체를 리턴합니다. 주석이 달린 메소드에 유형이 주석이 없으면 널 값을 반환합니다. 그런 다음 id () 및 description () 메소드를 호출하여 리턴 된 USECASE 객체에서 요소 값을 추출합니다. EncryptPassword () 메소드는 주석을 달 때 설명 값을 지정하지 않으므로 프로세서가 해당 주석을 처리 할 때 Description () 메소드의 기본값은 Description () 메소드에 의해 얻어집니다.
자바의 세계에서 주석이 퍼지고 있습니다. 시간이 있다면이 간단한 주석 기사를 작성하십시오. 주석에 대한 소개입니다. 나는 당신이 벽돌을 던지고 함께 배울 수 있기를 바랍니다 ...
말도 안되는 말을 중단하면 연습이 결론입니다.
3. 예
주석의 개념에 대해 먼저 이야기 한 다음 자신의 주석을 설계하는 방법에 대해 이야기합시다.
먼저 JDK와 함께 제공되는 java.lang.annotation 패키지에서 다음 소스 파일을 엽니 다.
소스 파일 target.java
@documented @retention (rendentionpolicy.runtime) @target (elementtype.annotation_type) public @interface target {elementType [] value (); @documented @retention (rendentionpolicy.runtime) @target (elementtype.annotation_type) public @interface target {elementType [] value (); }
@interface는 키워드입니다. 주석을 설계 할 때 유형은 @Interface로 정의되어야하며 클래스 또는 인터페이스 키워드를 사용할 수 없습니다 (Sun은 약간 고정되어 있지만 인터페이스와 너무 비슷해 보입니다).
소스 파일 retention.java
@documented @retention (rendentionpolicy.runtime) @target (extenttype.annotation_type) public @interface restention {retentionpolicy value (); } @documented @retention (rendentionpolicy.runtime) @target (elementtype.annotation_type) public @interface restention {retentionpolicy value (); }
이것을 본 후에, 당신은 모호하고 당신이 무슨 말을하는지 모릅니다. 걱정하지 마세요. 위의 파일은 두 개의 필드 retentionpolicy 및 elementType을 사용하며 이들은 두 개의 Java 파일이라고 추측 할 수 있습니다. 실제로이 두 파일의 소스 코드는 다음과 같습니다.
소스 파일 retentionpolicy.java
Public Enum regentionpolicy {소스, 클래스, 런타임} public enum resentionpolicy {소스, 클래스, 런타임} 이것은 세 가지 값, 즉 소스, 클래스 및 런타임을 가진 열거 유형입니다.
소스는 주석 유형 정보가 프로그램 소스 코드에만 유지됨을 의미합니다. 소스 코드가 컴파일되면 주석 데이터가 사라지고 컴파일 된 .class 파일에서 유지되지 않습니다.
클래스는 주석 유형 정보가 프로그램 소스 코드에 유지되며 컴파일 된 .class 파일에도 유지됩니다. 실행할 때이 정보는 가상 머신 (JVM)에로드되지 않습니다. 주석 유형의 유지 값을 설정하지 않으면 시스템 기본값은 클래스입니다.
세 번째는 런타임입니다. 즉, 정보는 소스 코드에 유지되고 .Class 파일을 컴파일 하고이 정보는 실행 중에 JVM에로드됩니다.
예를 들어, @override의 보존이 소스로 설정된 경우 컴파일이 성공하면 이러한 확인 된 정보가 필요하지 않습니다. 반대로 @deprecated의 보존은 런타임으로 설정되어 있으므로 컴파일 중에 사용되는 메소드를 경고하는 것 외에도 실행시 메소드가 더 이상 사용되지 않는지 확인할 수도 있습니다.
소스 파일 elementtype.java
public enum elementType {유형, 필드, 메소드, 매개 변수, 생성자, local_variable, annotation_type, package} public enum elementType {유형, 필드, 메소드, 매개 변수, 생성자, local_variable, annotation_type, package} target의 ElementType는 사용될 수있는 요소 주석 유형을 지정하는 데 사용됩니다. 설명하자면 : 유형 (유형), 필드 (속성), 메소드 (메소드), 매개 변수 (매개 변수), 생성자 (생성자), local_variable (로컬 변수), annotation_type, 패키지 (패키지), 여기서 유형 (유형)은 클래스, 인터페이스, 하향 및 주석 유형에 사용되는 것을 나타냅니다.
또한 @Target 자신도 자신을 선언하는 데 사용했으며 Annotation_type에서만 사용될 수 있음을 알 수 있습니다.
주석 유형이 @Target을 사용하는 요소를 지정하지 않으면 모든 요소에 사용할 수 있으며 여기의 요소는 위의 8 가지 유형을 나타냅니다.
몇 가지 올바른 예를 알려 드리겠습니다.
@TARGET (ElementType.Method)
@target (value = elementType.Method)
@TARGET (ElementType.Method, ElementType.constructor)
자세한 내용은 Javadoc 문서를 참조하십시오
소스 파일은 모두 @documented를 사용합니다. @documented의 목적은이 주석 유형 정보를 Javaapi 설명 문서에 표시 할 수 있도록하는 것입니다. 추가되지 않은 경우 Javadoc을 사용하여 API 문서를 생성 할 때이 유형에서 생성 된 정보는 찾을 수 없습니다.
또 다른 요점은 주석 데이터를 서브 클래스로 상속 해야하는 경우 @inherited 주석 유형을 사용한다는 것입니다.
다음은 디자인에 가장 간단한 주석 예제이며, 이는 네 개의 파일로 구성됩니다.
설명. 자바
패키지 lighter.javaeye.com; import java.lang.annotation.documented; import java.lang.annotation.elementtype; java.lang.annotation.trention import; java.lang.annotation.retentionpolicy import; Java.lang.annotation.target import; @TARGET (ElementType.type) @retention (rendentionPolicy.runtime) @documented public @interface description {String value (); } 패키지 lighter.javaeye.com; import java.lang.annotation.documented; import java.lang.annotation.elementtype; java.lang.annotation.trention import; java.lang.annotation.retentionpolicy import; Java.lang.annotation.target import; @TARGET (ElementType.type) @retention (rendentionPolicy.runtime) @documented public @interface description {String value (); }
참고 : 모든 주석은 인터페이스 java.lang.annotation을 자동으로 상속하므로 다른 클래스 나 인터페이스를 상속받을 수 없습니다.
가장 중요한 점은 주석 유형에서 매개 변수를 설정하는 방법입니다.
먼저 공개 또는 기본 액세스 권한 만 사용하여 수정할 수 있습니다. 예를 들어, 문자열 값 (); 여기서 메소드를 기본 기본 유형으로 설정하십시오.
둘째, 매개 변수 멤버는 바이트, 짧은, char, int, long, float, double, boolean 및 문자열, 열거, 클래스, 주석 및 이러한 유형의 배열과 같은 데이터 유형의 8 가지 기본 데이터 유형 만 사용할 수 있습니다. 예를 들어, 문자열 값 (); 여기서 매개 변수 멤버는 문자열입니다.
셋째, 매개 변수 멤버가 하나만 있으면 매개 변수 이름을 "값"으로 설정하고 나중에 브래킷을 추가하는 것이 가장 좋습니다. 예 : 위의 예에는 매개 변수 멤버가 하나뿐입니다.
이름 .java
패키지 lighter.javaeye.com; import java.lang.annotation.documented; import java.lang.annotation.elementtype; java.lang.annotation.trention import; java.lang.annotation.retentionpolicy import; Java.lang.annotation.target import; // 여기의 @Target은 @Description과 다르며 매개 변수 멤버는 @Target (ElementType.Method) @retention (resentPolicy.runtime) @documented public @interface name {String originate (); 문자열 커뮤니티 (); } 패키지 lighter.javaeye.com; import java.lang.annotation.documented; import java.lang.annotation.elementtype; java.lang.annotation.trention import; java.lang.annotation.retentionpolicy import; Java.lang.annotation.target import; // 여기의 @Target은 @Description과 다르며 매개 변수 멤버는 @Target (ElementType.Method) @retention (resentPolicy.runtime) @documented public @interface name {String originate (); 문자열 커뮤니티 (); }
Javaeyer.java
패키지 lighter.javaeye.com; @description ( "Javaeye, 최고의 소프트웨어 개발 교환 커뮤니티") 공개 클래스 Javaeyer {@name (Originate = "Founder : Robbin", community = "javaeye") public String getName () {return null; } @name (originate = "창립자 : Jiangnan Baiyi", community = "Springside") public String getName2 () {return "ID의 두 ID를 빌리십시오.이 예를 작성해 주셔서 감사합니다!"; }} 패키지 lighter.javaeye.com; @description ( "Javaeye, 최고의 소프트웨어 개발 교환 커뮤니티") 공개 클래스 Javaeyer {@name (Originate = "Founder : Robbin", community = "javaeye") public String getName () {return null; } @name (originate = "창립자 : Jiangnan Baiyi", community = "Springside") public String getName2 () {return "ID의 두 ID를 빌리십시오.이 예를 작성해 주셔서 감사합니다!"; }}Javaeyer 정보 추출물을 실행할 수있는 TestAntantation 클래스 작성
패키지 lighter.javaeye.com; import java.lang.reflect.method; java.util.hashset 가져 오기; java.util.set import; 공개 클래스 testAnnotation { / *** 저자 라이터* 참고 : 자세한 내용은 주석 API 사용에 대한 Javadoc 문서를 참조하십시오. 클래스 test = class.forname (class_name); 메소드 [] 메소드 = test.getMethods (); 부울 플래그 = test.isannotationPresent (description.class); if (flag) {description des = (description) test.getAnnotation (description.class); System.out.println ( "설명 :"+des.value ()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- hashset <todern () System.out.println ( "+이름. 주석 API*/ public static void main (String [] args)은 예외 {string class_name = "lighter.javaeye.com.javaeyer"; 클래스 test = class.forname (class_name); 메소드 [] 메소드 = test.getMethods (); 부울 플래그 = test.isannotationPresent (description.class); if (flag) {description des = (description) test.getAnnotation (description.class); System.out.println ( "설명 :"+des.value ()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { Boolean OtherFlag [i]. 실행 결과 :
설명 : Javaeye, Best Software Development Exchange 커뮤니티 설립자 : Robbin Creation Community : Javaeye 설립자 : Javaeye Community : Springside