2013-06-02 6 views
4

즐거운 시간을 보낸 후에도 주석 처리의 목적을 이해할 수 없습니다. 내가 생각할 수있는Java Annotation Processing - 목적 및 예

주석이 런타임에 필요한 이유를 이해

, 간단한 예는 다음과 같습니다 마커 인터페이스의

  1. 교체.
  2. 유형의 시장 속성 대체 (예 : 일시적)
  3. 일반적으로 런타임에 수행 할 수있는 유용성.

하지만 불행히도 컴파일 타임에 주석을 사용하는 이유에 대해 이해할 수 없습니다 (JDK에서 제공하는 기본 주석 (예 : @Override 등) 제외).

내가 주석 처리기를 사용하여 '코드 생성'의 목적/필요성을 이해하지 못했습니다.

편집 : Javadoc/Custom Java doc은 어노테이션 프로세서를 사용하는 목적으로 생각할 수있는 하나의 유틸리티입니다.

+0

이 질문은 컴파일시 주석을 사용하는 일반적인 개념 또는 javax.annotation.processing API와 그 용도에 대해 무엇입니까? –

+0

컴파일시 주석의 일반 처리. –

답변

4

모든 종류의 작업에 사용할 수 있습니다.

두 가지 간단한 예

  1. Lombock project. 수천 명의 게터와 세터를 작성하는 것에 지쳤습니까? 어노테이션 프로세서가 컴파일 할 때 왜 그렇게할까요?
  2. AOP. 특수 효과에 따라 코드를 짜는 데 AspectJ과 같은 것을 사용할 수 있습니다. 이것은 컴파일 후 완료되지만 컴파일 프로세스의 일부로 수행됩니다. 예를 들어 Spring AOP은 AspectJ와 함께 @Transactional 주석을 사용하여 주석이 표시된 메소드 주위에 트랜잭션 코드를 짜기 위해 사용됩니다.

다른 많은 용도가 있지만, 그들은 일반적으로 보일러 플레이트 코드를 줄이기 위해 두 가지 범주

  1. 로 분해.
  2. 교차 절단 관련 문제.
+0

설명 주셔서 감사합니다. "Lombock 프로젝트"는 많은 의미가 있습니다. 하지만 @Transactional은 "런타임 속성"이라고 생각했습니다. Spring AOP가 소스 코드에서 Annotation Processing을 수행하고 트랜잭션을 만들기 위해 코드를 업데이트한다는 것을 의미합니까? –

+0

[It can, yes] (http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/). 엄밀히 말하면 대안은 _ 시간 _ 직조입니다. 클래스가로드 될 때. –

1

주석 처리 환경에는 분석 및 코드 생성이라는 두 가지 주요 목적이 있습니다.

분석을 통해 Java 컴파일러의 기능을 확장하고 컴파일 할 때 프로그램 요소를 분석하고 추가 제약 조건, 유효성 검사 및 이러한 제약 조건 위반에 대한 경고 오류 및 경고를 추가 할 수 있습니다.

코드 생성을 사용하면 기존 손으로 작성한 코드의 신호에서 추가로 보조 코드를 생성 할 수 있습니다 (주로 독점적 인 것은 아니지만).

일부 예제에는 코드 컴파일 중 런타임에 일반적으로 발견되는 오류 및 경고를보고하는 컴파일 타임 분석 종속성 삽입의 시스템 인 Dagger이 포함됩니다. Dagger는 일반적으로 리플렉션 또는 손 글 쓰기 코드로 수행되는 모든 코드를 생성하여 실질적인 성능상의 이점 (경우에 따라) 및 단계별 디버깅 등에 사용할 수있는 인프라 코드도 제공합니다.

다른 예는 널 안전 포함한 코드에 대한 검사의 다양한 평가합니다 Checker Framework를 등등

제 3 예는 물품 작고 치형 거의 사소한하도록 의도 Auto-Value이다.

주석 처리 환경이 현존하는 코드의 변경이나 현재 편집중인 코드의 변경에 적합하지 않다는 사실이 분명합니다. 일부 프로젝트에서는이 작업을 수행하지만 주석 프로세서 API는 실제로 사용하지 않고 내부 컴파일러 유형으로 캐스팅합니다. 이것은 분명히 가능하지만, 잠재적으로 취성이고 버전마다 또는 컴파일러에서 안정적으로 작동하지 않을 수 있으며 각 버전 및 컴파일러 공급 업체에 대한 맞춤 처리가 필요합니다.