Java 사용자 정의 주석
Java 주석은 코드에 첨부 된 일부 메타 정보로, 컴파일 및 런타임 중 일부 도구를 구문 분석하고 사용하는 데 사용되며 설명 및 구성 기능 역할을합니다.
주석은 코드의 실제 논리에 영향을 미치지 않으며 보조 역할 만 수행 할 수 없습니다. java.lang.annotation 패키지에 포함되어 있습니다.
1. 메타 메모
메타 공장은 주석의 주석을 나타냅니다. 네 가지 유형 포함 : @retention @target @document @inherited.
1.1. @retention : 주석의 유지 전략을 정의합니다
@retention (rendentionpolicy.source) // 주석은 소스 코드에만 존재하며 @retention (rendentionpolicy.class)을 포함하지 않습니다. // 기본 유지 정책이 사용됩니다. 주석은 클래스 바이트 코드 파일에 존재하지만 런타임에는 얻을 수 없습니다. @retention (rendentionpolicy.runtime) // 주석은 클래스 바이트 코드 파일에 존재하며 런타임에 반사를 통해 얻을 수 있습니다.
주석 수업 :
@retention (retentionpolicy.runtime) // 주석은 클래스 바이트 코드 파일에 존재합니다. @TARGET ({ElementType.field, ElementType.Method}는 런타임의 반사를 통해 얻을 수 있습니다. // 주석의 대상을 정의 ** 필드의 범위와 열거 상수/메소드 @documented //는 주석이 Javadoc public @interface fieldmeta에 포함되어 있음을 나타냅니다. false;/*** 필드 이름* @return*/string name () default "";/*** IT ititable* @return*/boolean editable () default true;/*** 목록에 표시할지 여부* @return*/boolean summary () 기본값;/*** 필드 설명* @return*/string description () defator ";/** ** *** @retrun*/int order"; 0;} 엔티티 클래스 :
public class anno {@fieldmeta (id = true, name = "serial number", order = 1) private int id; @fieldmeta (name = "name", order = 3) 개인 문자열 이름; @fieldmeta (name = "age", order = 2) private int age; @fieldmeta (description = "description", public string desc () {retafe of java reflection " {return id;} public void setId (int id) {this.id = id;} public String getName () {return name;} public void setName (string name) {this.name = name;} public int getage ()} public void setage (int age) {this.age = age}} 주석에 대한 도움말 클래스를 얻으십시오.
public class sortablefield {public sortablefield () {} public sortablefield (Fieldmeta 메타, 필드 필드) {super (); this.meta = meta; this.field = field; this.name = field.getname (); this.type = field.gettype ();} public sortablefield (fieldmeta meta, String name, class) {super. (); meta; this.name = name; this.type = type;} private fieldmeta meta; private field 필드; 개인 문자열 이름; 개인 문자열 이름; 개인 클래스 <?> 유형; public fieldmeta getmeta () {return meta;} public void setmeta (publicmeta meta) {this.meta = meta;} public field getfield () {retion set field;}) getName () {return name;} public void setName (문자열 이름) {this.name = name;} public class <?> gettype () {return type;} public void settype (class <?> type) {this.type = type;}} 런타임에 주석을 얻으려면 먼저 기본 클래스를 만듭니다.
공개 클래스 부모 <t> {private class <t> Entity; public parent () {init ();}@suppresswarnings ( "uncecked") public list <sortablefield> init () {list <sortablefield> list = new arraylist <sortablefield> ();/** getclass (). getgenericsuclass (getgenericuclass)를 반환합니다. 클래스 (클래스, 인터페이스, 원시 유형 또는 무효) *후 ParameterizedType로 변환합니다. . * getActualTyPearGuments ()이 유형의 실제 유형 매개 변수를 나타내는 유형의 배열을 반환합니다. * [0] 은이 배열에서 첫 번째입니다. . * 요컨대, 슈퍼 클래스의 실제 유형의 일반 매개 변수를 얻는 것입니다. . */entity = (class <t>) ((ParameterizedType) this.getClass (). getGenericSuperClass ()). getActualTyPearGuments () [0]; // fieldmeta filed = entity.getAnnotation (fieldmeta.class); if (this.entity! = null) {Probloth, Proversited, Proocted, Proocted, Proocted, Protected, Propected, Propected, Propected, Propected) 필드이지만 상속 된 필드* entity.getFields (); 클래스 getDeclared ** () 메소드에서 객체*로 표시되는 클래스 또는 인터페이스의 모든 액세스 가능한 공공 필드 만 반환합니다. * API * */field [] fields = entity.getDeclaredFields (); // for (field f : fields) {// fieldmeta fieldmeta meta = f.getAntation (fieldmeta.class); if (meta! = null) {sortablefield sf = new Sortable Field (Meta, F); 객체 메소드 [] method = entity.getMethods ()로 표시되는 클래스 또는 인터페이스의 모든 액세스 가능한 공개 메소드; for (method m : methods) {fieldmeta meta = m.getAntoTation (fieldmeta.class); if (meta! = null) {sortablefield sf = new SortableField (Meta, M.GetName (), M.GetReturnType (); List.Add (sf);}} // 비교를 구현하기위한 새로운 필드 클래스를 구현하는 것입니다. 정렬 // collections.sort (list, new fieldsortcom ()); collections.sort (list, new comporator <sortablefield> () {@overridepublic int compar (sortablefield s1, sortablefield s2) {return s1.getmeta (). Order ()-s2.getmeta (). // returnname (). 비교를 위해 비교를 사용할 수 있습니다}});} 반환 목록;}} 기본 클래스를 상속하기 위해 서브 클래스를 만듭니다.
공공 계급 아동이 학부모 <NANO> {} 확장 테스트 클래스 :
공개 클래스 testAnnotation {@suppresswarnings ({ "unchecked", "rawtypes"}) public static void main (string [] args) {parent c = new child (); list <sortablefield> list = c.init (); generics // output results (list) {System.OUT.OUT. "+l.getName ()+"/t 필드 유형 : "+l.getType ()+"/t 주석 이름 : "+l.getmeta (). name ()+"/t 주석 설명 : "+l.getmeta (). description ();}}}////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////4 //////////////////////////////////////////////////////////////////4
1. 주석의 작동 원리 :
JDK5.0은 주석 기능을 제공하여 개발자가 자신의 주석 유형을 정의하고 사용할 수 있습니다. 이 기능은 주석 유형을 정의하는 구문 및 주석 선언, 주석을 읽는 API, 주석을 사용하여 수정을 사용하는 클래스 파일 및 주석 처리 도구를 설명하는 구문으로 구성됩니다.
주석은 코드의 의미에 직접적인 영향을 미치지 않지만 프로그램의 도구 또는 클래스 라이브러리로 간주 될 수 있습니다. 실행 프로그램 시맨틱에 영향을 미칩니다.
주석은 런타임 동안 반사 메커니즘을 통해 다양한 방식으로 읽을 수 있습니다.
2. @override 주석 :
Java.lang
주석 유형 재정의
@target (value = method)
@retention (value = source)
public @interface override는 메소드 선언이 슈퍼 클래스에서 다른 메소드 선언을 무시할 계획입니다. 메소드 가이 주석 유형에 주석을 달지 만 슈퍼 클래스 메소드를 무시하지 않으면 컴파일러는 오류 메시지를 생성합니다.
@override 주석은 서브 클래스가 상위 클래스의 해당 메소드를 무시해야 함을 의미합니다.
오버라이드는 주석을 식별하는 데 사용되는 마커 주석입니다. 주석 이름 자체는 도구 프로그램에 제공 될 정보를 나타냅니다.
다음은 @override 주석을 사용하는 예입니다.
클래스 A {개인 문자열 ID; a (문자열 ID) {this.id = id; } @override public String toString () {return id; }}3. @deprecated 주석 :
Java.lang
댓글 유형이 감가 상승합니다
@documented
@retention (value = runtime)
@deprecated와 함께 주석을 달고있는 public @interface 이상한 프로그램 요소, 프로그래머는 일반적으로 위험하거나 더 나은 옵션이 있기 때문에 그러한 요소를 사용하지 못하게됩니다. 컴파일러는 승인되지 않은 프로그램 요소를 사용할 때 또는 승인되지 않은 코드로 다시 작성할 때 경고합니다.
@Deprecated Annotation 표현 방법은 권장되지 않습니다.
더 이상 사용되지 않은 마커 주석입니다.
다음은 @deprecated 주석을 사용하는 예입니다.
클래스 A {개인 문자열 ID; a (문자열 ID) {this.id = id; } @deprecated public void execute () {system.out.println (id); } public static void main (String [] args) {a a = new A ( "A123"); A.Execute (); }}4. @suppresswarnings 주석 :
Java.lang
주석 유형 uppresswarnings
@target (value = {유형, 필드, 메소드, 매개 변수, 생성자, local_variable})
@retention (value = source)
public @interface suppresswarnings는 지정된 컴파일러 경고가 주석 요소 (및 해당 주석 요소에 포함 된 모든 프로그램 요소)에서 비위를 비축해야 함을 나타냅니다. 주어진 요소에서 비위장이없는 경고 세트는 요소에서 비위장이없는 모든 경고의 슈퍼 세트입니다. 예를 들어, 클래스에 댓글을 달아서 경고를 풀고 다른 경고를 외치는 방법에 주석을 달면 두 경고 가이 방법에서는 쇼를하지 않습니다.
스타일에 따라 프로그래머는 항상 가장 안쪽 중첩 요소 에이 주석을 사용해야하며, 사용하는 경우에만 작동합니다. 특정 방법으로 경고를 외치지 않으려면 클래스 대신 메소드에 주석해야합니다.
@suppresswarnings 주석은 억제 경고를 나타냅니다.
다음은 @suppresswarnings 주석을 사용하는 예입니다.
@SuppressWarnings ( "선택 취소") public static void main (String [] args) {list list = new arraylist (); list.add ( "abc");}5. 사용자 정의 주석 :
사용자 정의 주석에 @interface를 사용하면 java.lang.annotation.annotation 인터페이스가 자동으로 상속되고 다른 세부 사항이 컴파일러에 의해 자동으로 완료됩니다. 주석을 정의 할 때 다른 주석 또는 인터페이스를 상속받을 수 없습니다.
가장 쉬운 주석을 사용자 정의하십시오.
public @Interface myAnnotation {} 사용자 정의 주석 사용 : public class annotationTest2 {@MyAnnotation public void execute () {system.out.println ( "method"); }} 5.1. 변수 추가 :
public @interface myAnnotation {String value1 ();} 사용자 정의 주석 사용 : public class annotationTest2 {value1 = "abc") public void execute () {system.out.println ( "method"); }}주석에 사용 된 속성 이름이 값이면 속성 값 인터페이스를 할당 할 때 속성의 이름을 지정하지 않고 직접 작성할 수 있습니다. 예상치 못한 값의 변수 이름을 제외하고 모든 변수 이름은 name = value를 사용하여 할당해야합니다.
5.2. 기본값 추가 :
public @interface myAnnotation {String value1 () 기본 "ABC";}5.3. 다변량 사용 열거 :
public @interface myAnnotation {String value1 () 기본 "ABC"; myenum value2 () default myenum.sunny;} enum myenum {Sunny, Rainy} 사용자 정의 주석 사용 :
public class annotationTest2 { @myAnnotation (value1 = "a", value2 = myenum.sunny) public void execute () {system.out.println ( "method"); }} 5.4. 배열 변수 :
public @interface myAnnotation {string [] value1 () 기본 "ABC";} 사용자 정의 주석 사용 :
public class annotationTest2 { @myAnnotation (value1 = { "a", "b"}) public void execute () {system.out.println ( "method"); }}6. 주석의 범위를 설정하십시오.
@documented
@retention (value = runtime)
@target (value = annotation_type)
public @interface restention은 주석 유형의 주석이 얼마나 오래 유지되어야하는지를 나타냅니다. 주석 유형 선언에 보존 주석이 존재하지 않으면 유지 정책은 resentpolicy.class로 기본적으로 기본적으로 표시됩니다.
대상 메타 주석은 메타 주석 유형이 주석에 직접 사용되는 경우에만 유효합니다. 메타 주석 유형이 다른 주석 유형의 구성원으로 사용되면 유효하지 않습니다.
공개 열거 정제 정책
ENUM <resentionPolicy> 주석 보존 정책을 확장합니다. 이 열거 유형의 상수는 의견을 유지하기위한 다른 전략을 설명합니다. 유지 메타 주석 유형과 함께 사용되어 주석이 길어지는 기간을 지정합니다.
수업
컴파일러는 클래스 파일에 주석을 기록하지만 vm은 런타임에 주석을 유지할 필요가 없습니다.
실행 시간
컴파일러는 클래스 파일에 주석을 기록하고 VM은 런타임에 주석을 유지하므로 반사적으로 읽을 수 있습니다.
원천
컴파일러를 버리는 주석. @retentional 주석은 주석을 정의 할 때 컴파일러에 대한 주석 보존 정책을 제공 할 수 있습니다.
클래스 유지 정책에 속하는 주석은 @SuppressWarnings이며 .class 파일에 저장되지 않습니다.
6.1. 사용자 정의 주석에서 사용의 예 :
@retention (retentionpolicy.class) public @interface myAnnotation {string [] value1 () 기본 "ABC";}7. 반사를 사용하여 런타임 유지 정책의 주석 정보를 읽는 예 :
java.lang.reflect
인터페이스 주석이 있습니다
알려진 모든 구현 클래스 :
AccessibleObject, 클래스, 생성자, 필드, 메소드, 패키지는 현재이 VM에서 실행되는 프로그램의 주석 요소를 나타냅니다. 이 인터페이스는 주석을 반사적으로 읽을 수 있습니다. 이 인터페이스의 메소드에 의해 반환 된 모든 의견은 불변적이고 직렬화 가능합니다. 발신자는 할당 된 배열 열거 된 멤버의 액세서가 반환 한 배열을 수정할 수 있습니다. 이것은 다른 발신자가 반환 한 배열에 영향을 미치지 않습니다.
이 인터페이스의 메소드 가이 VM에서 액세스 할 수없는 클래스를 참조하는 지정된 클래스 멤버가 포함 된 주석 (직접 또는 간접적으로)을 반환하는 경우, 반환 된 주석에서 관련 클래스가 반환 한 메소드를 호출하여 클래스를 읽으려고 시도하면 타당성이 나타납니다.
isannotationationpresent
Boolean isannotationPresent (class <? extends annotation> annotationclass) 지정된 유형의 주석 이이 요소에 존재하는 경우 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 이 방법은 주로 태그 주석에 대한 액세스를 용이하게하도록 설계되었습니다.
매개 변수 :
주석 클래스 - 주석 유형에 해당하는 클래스 객체
반품:
지정된 주석 유형의 주석 이이 개체에 존재하는 경우 true를 반환합니다.
던지다:
nullPointerException- 주어진 주석 클래스가 null 인 경우
다음 버전으로 시작하십시오.
1.5
getannotation
<t extends annotation> t getAnnotation (class <t> annotationclass)이 댓글이 지정된 유형 의이 요소에 대한 주석이있는 경우이 주석을 반환합니다. 그렇지 않으면 null이 반환됩니다.
매개 변수 :
주석 클래스 - 주석 유형에 해당하는 클래스 객체
반품:
이 개체에 지정된 주석 유형의 주석이 존재하는 경우이 댓글이 반환됩니다. 그렇지 않으면 NULL
던지다:
nullPointerException- 주어진 주석 클래스가 null 인 경우
다음 버전으로 시작하십시오.
1.5
getannotations
주석 [] getAnnotations ()이 요소에 존재하는 모든 주석을 반환합니다. (이 요소가 댓글을 달지 않으면 길이 0의 배열이 반환됩니다.)이 메소드의 발신자는 반환 된 배열을 마음대로 수정할 수 있습니다. 이것은 다른 발신자가 반환 한 배열에 영향을 미치지 않습니다.
반품:
이 요소에 존재하는 모든 의견
다음 버전으로 시작하십시오.
1.5
GetDeclaredAnnotations
주석 [] getDeclaredAnnotations ()이 요소에 직접 존재하는 모든 주석을 반환합니다. 이 인터페이스의 다른 방법과 달리이 방법은 상속 된 주석을 무시합니다. (이 요소에 직접 주석이 없으면 길이 0의 배열이 반환됩니다.)이 메소드의 발신자는 반환 된 배열을 마음대로 수정할 수 있습니다. 이것은 다른 발신자가 반환 한 배열에 영향을 미치지 않습니다.
반품:
이 요소에 직접 존재하는 모든 의견
다음 버전으로 시작하십시오.
1.5
다음은 반사를 사용하여 런타임 보유 정책의 주석 정보를 읽는 예입니다.
사용자 정의 주석 :
@retention (retentionpolicy.runtime) public @interface myAnnotation {string [] value1 () 기본 "ABC";} 사용자 정의 주석 사용 :
public class annotationTest2 { @myAnnotation (value1 = { "a", "b"}) @deprecated public void execute () {system.out.println ( "method"); }} 주석의 정보 읽기 :
Public STATIC VOID MAIN (String [] args)은 보안 소집, NOSUCHMETHODEXCEPTION, INLEGALARGUMENTEXCEPTION, INGEGALACCESSEXCEPTion, invocationTarGeteXception {AnnotationTest2 AnnotationTest2 = New AnnotationTest2 (); // annotationTest2class의 getClass 인스턴스 <NANTOTINATIONTEST2> c = AnnotationTest2.class; // getMethodInstance 메소드 메소드 메소드 방법 = C.getMethod ( "Execute", New Class [] {}); // 메소드에 myAnnotation 주석이 포함되어 있는지 결정합니다. // 메소드 메소드를 실행합니다. // myAnnotation String을 얻습니다 [] value1 = myAnnotation.value1 (); System.out.println (value1 [0]); } // 메소드 주석에서 모든 주석을 가져옵니다 [] annotations = method.getannotations (); for (주석 주석 : 주석) {System.out.println (주석); }}8. 제한된 주석 사용 :
제한된 주석은 @target을 사용합니다.
@documented
@retention (value = runtime)
@target (value = annotation_type)
public @interface 대상은 주석 유형이 적용되는 프로그램 요소의 유형을 나타냅니다. 주석 유형 선언에 대상 메타 댓글이 존재하지 않으면 선언 된 유형을 모든 프로그램 요소에 사용할 수 있습니다. 이러한 메타 주석이 존재하는 경우 컴파일러는 지정된 사용 제한을 시행합니다. 예를 들어,이 메타 주석은 선언 유형 자체, 즉 메타 주석 유형임을 나타냅니다. 주석 유형 선언에만 사용할 수 있습니다.
@TARGET (ElementType.annotation_type) public @interface metaannotationtype {...} 이 메타 의견은 선언 유형이 복잡한 주석 유형 선언에서 멤버 유형으로 만 사용할 수 있음을 나타냅니다. 주석에는 직접 사용할 수 없습니다.
@target ({}) public @interface membertype {...} 이는 ElementType 상수가 대상 주석에 두 번 이상 나타나는 컴파일 타임 오류입니다. 예를 들어, 다음 메타 의견은 불법입니다.
@TARGET ({ElementType.field, ElementType.Method, ElementType.field}) public @interface bogus {...} public enum elementtypeEnum <ElementType> 프로그램 요소 유형을 확장합니다. 이 열거 유형의 상수는 Java 프로그램에서 선언 된 요소의 간단한 분류를 제공합니다.
이러한 상수는 대상 메타 주석 유형과 함께 사용되어 주석 유형을 사용하는 것이 합법적 인 상황을 지정합니다.
annotation_type
주석 유형 선언
건설자
생성자 방법 문
필드
필드 선언 (열거 상수 포함)
local_variable
로컬 변수 선언
방법
메소드 명령문
패키지
패키지 문
매개 변수
매개 변수 선언
유형
클래스, 인터페이스 (주석 유형 포함) 또는 열거 선언
주석 사용에 대한 제한의 예 :
@TARGET (ElementType.Method) public @Interface myAnnotation {string [] value1 () 기본 "ABC";}9. 도움말 문서에 메모 추가 :
Javadoc 파일을 작성하는 동안 API 파일에 주석 정보를 추가하려면 java.lang.annotation.documented를 사용할 수 있습니다.
사용자 정의 주석으로 빌드 주석 문서를 선언하십시오.
@documentedPublic @Interface myAnnotation {string [] value1 () 기본 "ABC";} 사용자 정의 주석 사용 :
public class annotationTest2 { @myAnnotation (value1 = { "a", "b"}) public void execute () {system.out.println ( "method"); }}10. 주석의 상속 사용 :
기본적으로 주석은 서브 클래스에 상속되지 않습니다. 사용자 정의 주석이 사용될 때 java.lang.annotation.inherited 주석 선언을 추가 할 수 있습니다.
@documented
@retention (value = runtime)
@target (value = annotation_type)
public @Interface 상속은 주석 유형이 자동으로 상속되었음을 나타냅니다. 주석 유형 선언에 상속 메타 주석이 존재하고 사용자가 클래스 선언에서 주석 유형을 쿼리하고 클래스 선언에는이 유형에 대한 주석이 없으면 주석 유형은 클래스의 슈퍼 클래스에서 자동으로 쿼리됩니다. 이 프로세스는 이러한 유형의 주석이 발견되거나 클래스 계층의 최상위 레벨에 도달 할 때까지 반복됩니다. 슈퍼 클래스에 해당 유형의 주석이없는 경우 쿼리는 현재 클래스에 그러한 주석이 없음을 나타냅니다.
주석 유형을 사용하여 클래스 이외의 다른 내용을 사용하는 경우이 메타 주석 유형이 유효하지 않습니다. 또한이 메타 주석은 슈퍼 클래스의 의견 상속 만 용이합니다. 댓글이 구현 된 인터페이스에 유효하지 않습니다.
위의 기사는 Java 사용자 정의 주석에 대해 간략하게 이야기하고 런타임 중에 주석을 얻기 위해 반사를 사용하는 것은 내가 공유하는 모든 컨텐츠입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.