자바-자바 5.0 주해 전면 해독
자바 5.0 주 해 는 자바 doc 와 Xdoclet 태그 의 연장 과 발전 으로 볼 수 있 습 니 다.자바 5.0 에서 이 태그 들 을 사용자 정의 하고 자바 언어의 반사 체 제 를 통 해 클래스 에 표 시 된 주 해 를 가 져 와 특정한 기능 을 수행 할 수 있 습 니 다.
주 해 는 코드 의 부속 정보 로 기본 적 인 원칙 에 따른다.주 해 는 프로그램 코드 의 운행 을 직접적 으로 방해 할 수 없고 주 해 를 증가 하거나 삭제 하 더 라 도 코드 는 정상적으로 운행 할 수 있다.
자바 언어 해석 기 는 이러한 주 해 를 무시 하고 제3자 도구 가 주 해 를 처리 합 니 다.제3자 도 구 는 코드 중의 주 해 를 이용 하여 프로그램 코드 의 운행 을 간접 적 으로 제어 할 수 있 으 며,자바 반사 체 제 를 통 해 주 해 된 정 보 를 읽 고,이러한 정보 에 따라 목표 프로그램의 논 리 를 변경 할 수 있다.
메타 주석 메타 주석
원 주해 의 역할 은 바로 다른 주 해 를 주석 하 는 것 이다.
자바 5.0 은 4 개의 표준 meta-annotation 형식 을 정의 합 니 다.다른 annotation 형식 에 대한 설명 을 제공 하 는 데 사 용 됩 니 다.
자바 5.0 에서 정의 하 는 메타 설명:
@Target
@Retention
@Documented
@Inherited
@Target
@Target 은 주로 Annotation 이 수식 하 는 대상 범 위 를 설명 합 니 다.
Annotation 은 packages,types(클래스,인터페이스,매 거 진,Annotation 유형),유형 구성원(방법,구조 방법,구성원 변수,매 거 진 값),방법 매개 변수 와 로 컬 변수(예 를 들 어 순환 변수,catch 매개 변수)에 사용 할 수 있 습 니 다.
Annotation 형식의 성명 에서 target 을 사용 하면 수식 목 표를 더욱 명확 하 게 할 수 있 습 니 다.
역할:주해 의 사용 범 위 를 설명 하 는 데 사 용 됩 니 다.즉,설명 되 는 주 해 는 어디 에 사용 할 수 있 습 니까?
값(Element Type)은 다음 과 같 습 니 다:@Target(Element Type.XXX)값 은 다음 과 같 습 니 다.
류,인터페이스,주해 류,Enum 성명 처,해당 주 해 를 유형 주해 라 고 한다클래스 구성원 변수 또는 상수 성명 처,해당 하 는 주 해 는 도 메 인 값 주해 라 고 합 니 다방법 처 성명 에 해당 하 는 주 해 를 방법 주해 라 고 한다
TYPE
매개 변수 성명 처 에 해당 하 는 주 해 를 매개 변수 주해 라 고 한다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)는 다음 과 같 습 니 다.
@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 수식 자 를 사용 하여 주해 류 를 정의 합 니 다.하나의 주 해 는 여러 명의 구성원 을 가 질 수 있 습 니 다.구성원 성명 과 인터페이스 방법 성명 이 유사 합 니 다.여 기 는 한 명의 구성원 만 정의 합 니 다.구성원 성명 아래 몇 가지 제한:
사용 할 때 구성원 과 할당 번호(=)를 무시 할 수 있 습 니 다.예 를 들 어@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 등 반사 대상 이 주석 정 보 를 방문 하 는 방법 을 추가 하 였 습 니 다.
다음은 반 사 를 통 해 주 해 를 방문 하여 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 테스트 필요
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.