>source

다음 코드가 코드베이스에서 자주 보인다고 가정합니다.

// old wet code
@AnnotationA
@AnnotationB
@AnnotationC
class SomeClass {
   // ...
}

주석을 만들 수 있습니까? AnnotationBundle 다른 주석 (A, B, C)을 적용하고 동일한 기능을 생성합니까? 이것은 코드베이스를 건조시키는 데만 사용되며 실수로 클래스에 대한 단일 주석을 잊지 않습니다.

// new DRY code
@AnnotationBundle
class SomeClass {
   // ...
}


  • 답변 # 1

    짧은 대답

    아니 당신은 할 수 없습니다. Java에는 메타 주석의 개념이 없습니다.

    대안 1 : Spring 주석

    누군가 Spring 메타 주석을 언급했습니다. 예, Spring에서는이를 수행 할 수 있지만 Spring이 개념을 구현하기 위해 반사 및 기타 메커니즘을 포함하는 매우 인상적인 내부 기계를 구현하기 때문입니다. 그래서

    Spring을 사용하고 그 기능에 의존하거나

    또는 비슷한 것을 다시 빌드하고 자신의 애플리케이션이 빌드중인 프레임 워크를 사용하는지 확인합니다.

    또는 Spring 주석 항목을 추출하여 Spring 외부에서 사용하십시오.

    후자는 얼마 전에 손가락 운동으로했는데 추출이 가능한지보고 싶었 기 때문입니다. 다른 Spring 물건들과 아주 깊게 얽혀있어 꽤 어려웠지만 결국에는 해냈다.

    결과는여기서 Spring 외부에서 사용할 수있는 독립 실행 형 버전의 Spring 주석 유틸리티입니다.Readme를 읽으면 향후 유사한 추출을위한 템플릿으로 문서화했기 때문에 어떻게 수행했는지 알 수 있습니다. 나는 실제로 독립 실행 형 Spring 주석 유틸리티를 사용한 적이 없지만 그렇게하도록 초대합니다. Spring이 주석으로 할 수있는 일이 더 많이 있습니다. 클래스에 의해 구현 된 인터페이스에 대한 주석, 수퍼 클래스 메소드에 대한 주석 등이 있는지 확인하십시오. 이것은 매우 강력하며 Spring이 JRE에서 불가능한 일부 주석 기반 항목을 즉시 구현할 수있는 이유를 설명합니다. 예 : JDK는 (선택적으로) 수퍼 클래스에서 서브 클래스로의 주석을 상속하는 개념이 없지만 인터페이스에서 클래스로, 메소드에서 메소드로의 대체가 아닙니다.

    내 GitHub 저장소를 복제하고 빌드하고 원하는 작업을 수행하는 데 도움이되는지 확인할 수 있습니다. 하지만 마법처럼 저절로 발생하는 것은 아닙니다. 이와 같은 정보를 수집하려면 해당 메서드를 호출해야합니다.

    대안 2 : AspectJ

    대안으로 AspectJ (Spring AOP가 아닌 실제 AspectJ에 대해 이야기하고 있음)를 사용하고 ITD (inter-type definitions)를 사용할 수 있습니다. 클래스가 인터페이스를 구현하거나 유형에 대한 주석을 선언하도록합니다. 이런 식으로 메타 주석을 에뮬레이트하는 측면을 구현할 수 있습니다. 측면은 모든 것을 처리 할 것이며 응용 프로그램은 그것에 대해 알 필요가 없습니다. 하지만 이것을하기 위해 AOP를 배우고 싶은지 확실하지 않습니다.

  • 답변 # 2

    이것은 Java에서 기술적으로 가능한 것 같습니다.가짜메타 주석 (예 : Spring MVC-Meta Annotations, What Are Meta-Annotations in Java?)).

    그러나 이것은 모든 주석에 해당되는 것은 아닙니다. 예를 들어, lombok은 아직이를 허용하지 않고 주석을 클래스 유형으로 제한합니다. @interface ).

관련 자료

  • 이전 amazon web services - EKS/KOPS 클러스터에서 실행되는 포드에서 AWS에 액세스하려면 어떻게해야합니까?
  • 다음 파이썬 - re 기반 대체