6

구현 한 사용자 정의 주석이 있고 주석 프로세서를 사용하여 내 응용 프로그램에서 사용하는 모든 클래스 목록을 생성하고 싶습니다. 해당 특수 주석.주석 프로세서를 사용하여 특정 주석이있는 클래스 목록 만들기

주석 처리기를 사용하여 클래스 파일을 생성하는 방법을 설명하는 this tutorial을 찾았으므로 주석을 사용하여 각 클래스에 대한 클래스를 생성하는 것이 매우 쉽습니다.

내가 알 수없는 것은 모든 정보를 단일 클래스로 수집하는 방법입니다. 클래스를 수정하는 방법이없는 것 같아 클래스가 처음 생성되면 목록에 새 항목을 추가 할 수 없습니다.

주석 처리기를 사용하여 특정 주석으로 주석 처리 된 앱의 모든 클래스 목록을 반환하는 메소드를 생성하는 방법이 있습니까?

답변

4

생성 된 클래스가 처리되는 입력 클래스와 일대일로 반드시 일치 할 필요는 없습니다. 게다가, 당신은 RoundEnvironment를 통해 지정된 주석 주석되는 클래스 (요소)을 검색 할 수 있습니다 :이에서

roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class) 

당신이 볼 수있는 클래스의 컬렉션을 반환하는 방법으로 하나의 클래스를 생성 할 수 있습니다. 이 약

몇 가지 문제가 강조 표시 :

  • 주석 프로세서는 다른 주석 프로세서와 함께 실행하여 컴파일시에 생성 된 클래스를 처리 할 수 ​​있습니다. 이를 돕기 위해 프로세서에서 다른 사람들의 출력을 포착 할 수 있도록 라운드에서 Java 주석 처리가 수행됩니다. 다른 프로세서와 호환되도록하려면 ErrorType을 정상적으로 처리해야합니다.
  • 현재 컴파일 패스의 클래스 만 RoundEnvironmnet 메서드에서 반환되므로 외부 라이브러리의 클래스는 포함되지 않습니다.
  • IDE (Cough Cough Eclipse)는 Java의 주석 처리 기능을 다르게 구현합니다. 이는 앞서 설명한 것처럼 전체 부분 컴파일을 필요로하는 프로세서에서 문제가 될 수 있습니다.

    https://github.com/johncarl81/silver

    실버 대단히 WIP하고 작업을 수행하는 라이브러리 코드를 많이 사용하지만 :

공교롭게도, 난 당신이 찾고있는 무슨 않는 최근 유사한 프로젝트를 생성 당신에게 가능한 일에 대한 아이디어를 줄 수 있습니다.

+1

안녕하세요 John! 당신에게서 듣기 좋은데 :) Silver는 꽤 멋져 보인다. SilverUtils.getAnnotated()의 런타임 영향은 무엇인가? 또한 런타임에 클래스에 주석이 달린 클래스를 넘어 클래스 로더를 가져와야하는 것은 무엇입니까? – emmby

+0

마이크도 잘 듣기 좋습니다. 마이크! 이 접근법에서 가장 멋진 점은 런타임이 가능한 한 빠르다는 것입니다. Example의 인스턴스를 얻은 후에는 런타임에만 정적 변수를 반환합니다. SiverUtil.get()은 Look-up 클래스 (Class.forName()에 대한 호출)에 약간의 반사를 수행하지만이 호출은 캐시되므로 한 번만 생성됩니다. 어쨌든 편의를 위해 SilverUtil이 실제로 존재하므로 기술적으로 생성 된 코드를 사용하지 않아도됩니다. –