자바-자바 5.0 주해 전면 해독

11810 단어 Java주해Java5.0
개술
자바 5.0 주 해 는 자바 doc 와 Xdoclet 태그 의 연장 과 발전 으로 볼 수 있 습 니 다.자바 5.0 에서 이 태그 들 을 사용자 정의 하고 자바 언어의 반사 체 제 를 통 해 클래스 에 표 시 된 주 해 를 가 져 와 특정한 기능 을 수행 할 수 있 습 니 다.
주 해 는 코드 의 부속 정보 로 기본 적 인 원칙 에 따른다.주 해 는 프로그램 코드 의 운행 을 직접적 으로 방해 할 수 없고 주 해 를 증가 하거나 삭제 하 더 라 도 코드 는 정상적으로 운행 할 수 있다.
자바 언어 해석 기 는 이러한 주 해 를 무시 하고 제3자 도구 가 주 해 를 처리 합 니 다.제3자 도 구 는 코드 중의 주 해 를 이용 하여 프로그램 코드 의 운행 을 간접 적 으로 제어 할 수 있 으 며,자바 반사 체 제 를 통 해 주 해 된 정 보 를 읽 고,이러한 정보 에 따라 목표 프로그램의 논 리 를 변경 할 수 있다.
메타 주석 메타 주석
원 주해 의 역할 은 바로 다른 주 해 를 주석 하 는 것 이다.
자바 5.0 은 4 개의 표준 meta-annotation 형식 을 정의 합 니 다.다른 annotation 형식 에 대한 설명 을 제공 하 는 데 사 용 됩 니 다.
자바 5.0 에서 정의 하 는 메타 설명:
  • - @Target
  • - @Retention
  • - @Documented
  • - @Inherited
  • 이 몇 가지 종 류 는 모두 java.lang.annotation 패키지 에 있 습 니 다.
    @Target
    @Target 은 주로 Annotation 이 수식 하 는 대상 범 위 를 설명 합 니 다.
    Annotation 은 packages,types(클래스,인터페이스,매 거 진,Annotation 유형),유형 구성원(방법,구조 방법,구성원 변수,매 거 진 값),방법 매개 변수 와 로 컬 변수(예 를 들 어 순환 변수,catch 매개 변수)에 사용 할 수 있 습 니 다.
    Annotation 형식의 성명 에서 target 을 사용 하면 수식 목 표를 더욱 명확 하 게 할 수 있 습 니 다.
    역할:주해 의 사용 범 위 를 설명 하 는 데 사 용 됩 니 다.즉,설명 되 는 주 해 는 어디 에 사용 할 수 있 습 니까?
    값(Element Type)은 다음 과 같 습 니 다:@Target(Element Type.XXX)값 은 다음 과 같 습 니 다.
    류,인터페이스,주해 류,Enum 성명 처,해당 주 해 를 유형 주해 라 고 한다클래스 구성원 변수 또는 상수 성명 처,해당 하 는 주 해 는 도 메 인 값 주해 라 고 합 니 다방법 처 성명 에 해당 하 는 주 해 를 방법 주해 라 고 한다
  • -TYPE매개 변수 성명 처 에 해당 하 는 주 해 를 매개 변수 주해 라 고 한다
  • 구조 함수 성명 처,해당 주 해 를 구조 함수 주해 라 고 한다4.567917.-4.567914.부분 변수 성명 처 에 해당 하 는 주 해 를 국 역 비 납량 주해 라 고 한다
  • -FIELD가방 소리 가 밝 은 곳 에 해당 하 는 주 해 는 가방 주해 라 고 불 린 다
  • 예:
    
    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;
    /**
     *
     * @Description:   @DataSource        ,                
     *              
     * 
     * @author: Mr.Yang
     * @date: 2017 7 24    9:59:29
     */
    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataSource {
        //        dynamicDatasourceMap  key    
        public static String PR_RB = "dataSourcePR";
        public static String DR_RB = "dataSourceDR";
        public static String PR_CC = "dataSourceCC";
        /**
         * 
         * 
         * @Title: name
         * 
         * @Description:      @DataSource    PR_RB     
         * 
         * @return
         * 
         * @return: String
         */
        String name() default DataSource.PR_RB;
    }
    
    @Retention
    @Retention 은 이 Annotation 이 보류 되 는 시간의 길 이 를 정의 합 니 다.
    일부 Annotation 은 원본 코드 에 만 나타 나 고 컴 파일 러 에 의 해 버 려 집 니 다.
    다른 일 부 는 class 파일 에 컴 파일 되 어 있 습 니 다.class 파일 에 컴 파일 된 Annotation 은 가상 컴퓨터 에 의 해 무 시 될 수 있 습 니 다.
    다른 일 부 는 class 가 불 러 올 때 읽 혀 집 니 다(class 의 실행 에 영향 을 주지 않 습 니 다.Annotation 과 class 는 사용 에 있어 서 분리 되 어 있 기 때 문 입 니 다).
    이 meta-Annotation 을 사용 하면 Annotation 의'생명주기'를 제한 할 수 있 습 니 다.
    역할:이 주석 정 보 를 어느 단계 에 저장 해 야 하 는 지 를 표시 합 니 다.주석 의 수명 주 기 를 설명 하 는 데 사용 합 니 다.(즉,설명 되 는 주석 이 어느 범위 내 에서 유효 합 니까?)
    Retention meta-annotation 형식 은 유일한 value 를 구성원 으로 합 니 다.이 값 은 자바.lang.annotation.RetentionPolicy 의 매 거 진 형식 값 에서 추출 합 니 다.
    这里写图片描述
    수치(Retention Poicy)는 다음 과 같 습 니 다.
  • SOURCE:원본 파일 에서 유효 합 니 다(즉,원본 파일 보존).대응 하 는 바이트 파일 만 더 이상 보류 하지 않 습 니 다
  • CLASS:class 파일 에서 유효 합 니 다(즉,class 보류).그러나 클래스 의 애 처가 바이트 파일 을 불 러 올 때 주 해 를 JVM 에 불 러 오지 않 습 니 다.즉,실행 기간 에 주 해 를 가 져 올 수 없습니다
  • 런 타임:실행 시 유효 합 니 다(즉,실행 시 보류).주해 정 보 는 대상 클래스 에서 JVM 에 불 러 온 후에 도 보류 합 니 다.실행 기간 에 반사 체 제 를 통 해 클래스 의 주해 정 보 를 읽 을 수 있 습 니 다
  • 예 를 들 면
    
    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataSource {
        .......
    }
    @Documented
    @Documented 는 다른 유형의 annotation 이 표 시 된 프로그램 구성원 의 공공 API 로 표시 되 어야 하기 때문에 자바 doc 와 같은 도구 로 문서 화 될 수 있 습 니 다.Documented 는 구성원 이 없 는 태그 주석 입 니 다.
    
    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataSource {
        .......
    }
    @Inherited
    @Inherited 원 주 해 는 태그 주석 입 니 다.@Inherited 는 표 시 된 유형 이 계승 되 었 음 을 논술 하 였 습 니 다.@Inherited 수식 을 사용 한 annotation 형식 이 class 에 사용 되면 이 annotation 은 class 의 하위 클래스 에 사 용 됩 니 다.
    @Inherited annotation 형식 은 표 시 된 class 의 하위 클래스 가 계승 합 니 다.이 루어 진 인터페이스 에서 annotation 을 계승 하지 않 습 니 다.방법 은 다시 불 러 오 는 방법 에서 annotation 을 계승 하지 않 습 니 다.
    @Inherited annotation 형식 에 표 시 된 annotation 의 Retention 이 Retention Policy.RUNTime 이면 반사 API 가 이러한 계승 성 을 강화 합 니 다.자바.lang.reflect 를 사용 하여@Inherited annotation 형식의 annotation 을 조회 할 때 반사 코드 검 사 는 class 와 부모 클래스 를 검사 하고 지정 한 annotation 형식 이 발견 되 거나 클래스 계승 구조의 맨 위 에 도달 할 때 까지 작업 을 진행 합 니 다.
    사용자 정의 주석
    @interface 사용자 정의 주 해 를 사용 할 때 자바.lang.annotation.annotation 인 터 페 이 스 를 자동 으로 계승 하여 컴 파일 러 가 다른 디 테 일 을 자동 으로 완성 합 니 다.
    주 해 를 정의 할 때 다른 주해 나 인 터 페 이 스 를 계승 할 수 없습니다.
    @interface 는 주 해 를 설명 하 는 데 사 용 됩 니 다.그 중의 모든 방법 은 실제 적 으로 하나의 설정 파 라 메 터 를 설명 합 니 다.
    방법의 이름 은 매개 변수의 이름 이 고 반환 값 유형 은 매개 변수의 유형 입 니 다.(반환 값 유형 은 기본 유형,Class,String,enum 만 있 을 수 있 습 니 다.)
    default 을 통 해 인자 의 기본 값 을 설명 할 수 있 습 니 다.
    설명 형식 정의:
    
     public @interface     {   }
    주해 파라미터 의 지원 가능 한 데이터 형식
    모든 기본 데이터 형식(int,float,boolean,byte,double,char,long,short)
    String type클래스 유형
    enum 유형
    Annotation 유형이상 모든 유형의 배열Annotation 형식 에 있 는 인자 설정 규칙:
    첫째,Public 또는 기본 값(default)두 개의 접근 권 으로 만 수식 할 수 있 습 니 다.예 를 들 어 String value();방법 을 defaul 기본 형식 으로 설정 합 니 다.   
    둘째,매개 변수 구성원 은 기본 형식 byte,short,char,int,long,float,double,boolean 8 가지 기본 데이터 형식 과 String,Enum,Class,annotations 등 데이터 형식 과 이 유형의 배열 만 사용 할 수 있 습 니 다.예 를 들 어 String value();이 인자 의 구성원 은 String 입 니 다.  
    셋째,매개 변수 구성원 이 하나 밖 에 없다 면 매개 변수 이름 을'value'로 설정 하고 괄호 를 넣 는 것 이 좋 습 니 다.
    실례
    코드 가 Github 에 위탁 되 었 습 니 다.>https://github.com/yangshangwei/SpringMaster
    일반적으로 제3자 도 구 는 특정한 주 해 를 처리 할 뿐만 아니 라 그 자체 가 이러한 주해 의 정 의 를 제공한다.사실 주해 류 를 정의 하 는 것 자체 가 어렵 지 않 습 니 다.자바 는 주 해 를 정의 하 는 문법 을 제공 합 니 다.위 와 같 습 니 다.
    주석 클래스 작성
    우 리 는 간단 한 주해 류 를 만 들 기 시작 했다.
    
    package com.xgj.aop.spring.advisor.anno;
    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;
    /**
     * 
     * 
     * @ClassName: NeedTest
     * 
     * @Description:      
     * 
     * @author: Mr.Yang
     * 
     * @date: 2017 8 23    4:50:11
     */
    //          
    @Retention(RetentionPolicy.RUNTIME)
    //               
    @Target(ElementType.METHOD)
    //    javadoc        
    @Documented
    public @interface NeedTestAnnotation { //     
        //       
        boolean value() default false;
    }
    
    자바 의 새로운 문법 규정 은@interface 수식 자 를 사용 하여 주해 류 를 정의 합 니 다.하나의 주 해 는 여러 명의 구성원 을 가 질 수 있 습 니 다.구성원 성명 과 인터페이스 방법 성명 이 유사 합 니 다.여 기 는 한 명의 구성원 만 정의 합 니 다.
    구성원 성명 아래 몇 가지 제한:
  • 구성원 들 은 참여 하지 않 고 이상 을 던 지지 않 는 방식 으로 성명 한다.다음 과 같은 방식 은 비합법적 이다.예 를 들 어 boolean value(String xx),boolean value()throws Exception 등 은 불법이다
  • default 멤버 를 통 해 String level()defalut"LOW 와 같은 기본 값 을 지정 할 수 있 습 니 다.LEVEL",int high()default 2 는 합 법 적 이 며 기본 값 을 지정 하지 않 아 도 됩 니 다
  • 구성원 유형 은 제한 을 받 습 니 다.구성원 은 기본 형식 byte,short,char,int,long,float,double,boolean 8 가지 기본 데이터 형식 과 String,Enum,Class,annotations 등 데이터 형식 과 이 유형의 배열 만 사용 할 수 있 습 니 다.예 를 들 어 String value();이 인자 의 구성원 은 String 입 니 다.한편,List foo(),ForumServer value()는 비합법적 이다
  • 주석 이 한 멤버 만 있 으 면 멤버 이름 은 value()를 권장 합 니 다.
    사용 할 때 구성원 과 할당 번호(=)를 무시 할 수 있 습 니 다.예 를 들 어@NeedTestAnnotation(true).
    주해 류 가 여러 구성원 을 가지 고 있 을 때 value 구성원 만 할당 하면 할당 번 호 를 사용 하지 않 을 수 있 습 니 다.
    여러 구성원 에 게 동시에 값 을 부여 하려 면@DecalreParents(value="XXX",defaultImpl=XXX)와 같은 할당 번 호 를 사용 해 야 합 니 다.
    주해 류 는 구성원 이 없 을 수 있 고 구성원 이 없 는 주 해 를 표시 주해 라 고 하 며 해석 절 차 는 표지 주해 의 존재 여 부 를 상응 하 게 처리 할 수 있다.
    또한,모든 주 해 는 자바.lang.annotation.annotation 과 암시 적 으로 계승 되 지만,주 해 는 다른 인 터 페 이 스 를 표시 할 수 없습니다.
    주 해 를 사용 하 다
    저 희 는 업무 클래스 에서 NeedTest Annotation 주 해 를 사용 하여 업무 방법 을 테스트 해 야 하 는 지 여 부 를 표시 합 니 다.
    아래 와 같다
    
    package com.xgj.aop.spring.advisor.anno;
    /**
     * 
     * 
     * @ClassName: ForumService
     * 
     * @Description:          @NeedTestAnnotation
     * 
     * @author: Mr.Yang
     * 
     * @date: 2017 8 23    5:15:18
     */
    public class ForumService {
        @NeedTestAnnotation
        public void removeTopicId(int topicId) {
            System.out.println("remove topicId" + topicId);
        }
        @NeedTestAnnotation(true)
        public void removeForumId(int forumId) {
            System.out.println("remove forumId" + forumId);
        }
    }
    
    주해 류 와 목표 류 가 같은 가방 에 없 으 면 improt 를 통 해 주해 류 를 참조 해 야 합 니 다.
    주 해 를 표시 할 때 아래 형식 을 통 해 주해 구성원 에 게 값 을 부여 할 수 있 습 니 다.
    
    @<   >(<   1>=<   1>,<   2>=<   2>,.....)
    구성원 이 배열 형식 이 라면{}을 통 해 할당 할 수 있 습 니 다.예 를 들 어 boolean 배열 의 구성원 은{true,false,true}으로 설정 할 수 있 습 니 다.
    접근 주석
    주 해 는 프로그램의 운행 에 직접적인 영향 을 주지 않 는 다 고 말 했 지만 제3자 프로그램 이나 도 구 는 코드 의 주 해 를 이용 하여 특수 한 임 무 를 완성 하고 프로그램의 운행 을 간접 적 으로 제어 할 수 있다.RetentionPolicy.RUNTIME 보류 기한 에 대한 주 해 는 반사 메커니즘 을 통 해 클래스 의 주 해 를 방문 할 수 있 습 니 다.
    자바 5.0 에 서 는 Package,Class,Constructor,Method,Field 등 반사 대상 이 주석 정 보 를 방문 하 는 방법 을 추가 하 였 습 니 다.T getAnnotation(Classannotation Class)이 방법 은 일반적인 방식 으로 주석 대상 을 직접 되 돌려 주 는 것 을 지원 합 니 다.
    다음은 반 사 를 통 해 주 해 를 방문 하여 ForumService 류 에서@NeedTestAnnotation 주 해 를 통 해 탑 재 된 테스트 수 요 를 얻 을 수 있 습 니 다.
    
    package com.xgj.aop.spring.advisor.anno;
    import java.lang.reflect.Method;
    import org.junit.Test;
    /**
     * 
     * 
     * @ClassName: AnnotaitionSelfDefineTool
     * 
     * @Description:     
     * 
     * @author: Mr.Yang
     * 
     * @date: 2017 8 23    5:18:26
     */
    public class AnnotaitionSelfDefineTool {
        @Test
        public void test() {
            //      Class
            Class<ForumService> clazz = ForumService.class;
            //         ,          
            Method[] methods = clazz.getDeclaredMethods();
            System.out.println(clazz.getName() + "   " + methods.length + "    ");
            //     
            for (Method method : methods) {
                //         
                NeedTestAnnotation needTestAnnotation = method
                        .getAnnotation(NeedTestAnnotation.class);
                //           
                if (needTestAnnotation != null) {
                    //          ,   
                    if (needTestAnnotation.value()) {
                        System.out.println(method.getName() + "    ");
                    } else {
                        System.out.println(method.getName() + "     ");
                    }
                }
            }
        }
    }
    
    유닛 테스트 결과:
    com.xgj.aop.spring.advisor.anno.ForumService 는 두 가지 방법 이 있 습 니 다.
    removeTopicId 테스트 필요 없어 요.
    removeForumId 테스트 필요
    이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기