당신은 주석을 사용하고,하지만 당신은 그것을 달성하기 위해 그것의 원리를 알고?

자바 주석을 내장하고 우리가 더 잘 알고있는, 그리고 지금, 실현 음의 원리를 보면 다음과 같은 Java 시스템을보고 사용자 정의 주석이 주석을 지원하는 방법입니다.

보고 정의 주석의 일례를 설명하기 전에, 이러한 사용자 주석을 달성하기 위하여 주사를 @Test에 특정 문자열이, 메소드 @TestMethod 문자열을 주입.

① 클래스의 역할에 대한 테스트 주석 문을 작성하고 실행 예약, 기본값은 기본값입니다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    String value() default "default";
}

TestMethod 노트를 만들 ②, 선언 및 예약 방법 런타임에 따라 행동합니다.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestMethod {
    String value();
}

③ 테스트 클래스, 기본 및 들어오는 @Test 값 보낸 두 문자열 톰캣 메소드를 실행 한 후 출력 기본값의 출력 및 출력 주입 문자열 @TestMethod.

@Test()
public class AnnotationTest {
    @TestMethod("tomcat-method")
    public void test(){
    }
    public static void main(String[] args){
        Test t = AnnotationTest.class.getAnnotation(Test.class);
        System.out.println(t.value());
        TestMethod tm = null;
        try {
            tm = AnnotationTest.class.getDeclaredMethod("test",null).getAnnotation(TestMethod.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(tm.value());
    }
}

클래스는 테스트 클래스 구조로부터 취득되는 상기 문장에서 알 수있는 런타임 AnnotationTest.class.getAnnotation 주석 값 선언 (Test.class라는)에 의해 획득 될 수 있는지에 대한 테스트 주석, 주석을 AnnotationTest 그것은 어떤 시점 주석에 있어야하므로 주석, 클래스 구조의 이동에 추가됩니다.

@Test("test")
public class AnnotationTest {
    public void test(){
    }
}

클래스 자바 바이트 코드에 소스가 컴파일러에 의해 수행에서, 컴파일러는 소스 코드를 분석하고 자바 클래스 파일을 생성하고, 주석은 주석 기호에 컴파일시에 컴파일러에 의해, 컴파일러가 처리 할 가공 및 부착합니다 클래스 구조는, JVM의 사양에 따라, 클래스 파일 구조는 엄격하고 질서 형식, 속성에 클래스 구조 속성 저장되는 계급 구조에 대한 추가 정보의 유일한 방법입니다.

우리는 클래스의 구조 클래스, 필드, 메소드에 대한 자신의 특정 테이블의 구조를 가지고 있음을 알고, 각각 고유의 특성을 가지고 있으며, 주석, 행동의 범위는 클래스에 따라 행동 할 수있다 다를 수 있습니다에 대한, 또한 역할을 할 수 있습니다 필드 나 메소드에 다음 컴파일러는 클래스, 필드, 메소드, 자신의 특성에 주석 정보를 저장해야합니다.

우리 AnnotationTest 클래스를 컴파일 한 후이 클래스의 역할에 대한 의견은, 그래서이 속성이 클래스의 속성 세트에 추가되기 때문에, 해당 AnnotationTest.class 파일에하는 RuntimeVisibleAnnotations 속성이 포함됩니다.

키 - 값 쌍의 값 테스트 주석 = 시험 함께 기록한다. 의 속성 값 RuntimeVisibleAnnotations 클래스 객체 AnnotationTest에 저장됩니다 AnnotationTest.class JVM 바이트 코드 파일을로드, 그래서 그는 시험 AnnotationTest.class.getAnnotation (Test.class라는)를 통해 주석 객체를 얻을 수있을 때, 추가를 통해 테스트 주석 객체는 속성 값 테스트 내에서 얻을 수 있습니다.

다음은 의심 할 수있다, 어떤 시험 주석 객체?

사실, 컴파일 주석의 특성상 사실 @Test 공중 인터페이스 테스트 주석 연장 우리가 AnnotationTest.class.getAnnotation (Test.class라는)에서 호출 할 때, JDK 동적 프록시 생성에 의해 달성되며, 상속 인터페이스 주석 인터페이스 시험 물체의 인터페이스 및 대상물이 RuntimeVisibleAnnotations 속성 값으로 설정되고, 목적은 특수 값을 취득 할 수있다 ()에있어서의 값을 테스트 주석 목적이다.

그 구현에 도시되고 상술 JVM과 컴파일러를 필요로하는 프로세스의 구현을 자바 특수기구.

추천

출처blog.51cto.com/14230003/2421308