Java 클래스가 구현된 인터페이스에서 주석을 상속하지 않는 이유는 무엇입니까?
의존성 주입 프레임워크를 사용하고 있습니다(Guice의 AOP를 사용하여 메서드 호출을 대행 수신합니다).클래스는 인터페이스를 구현하고 있으며 프레임워크가 올바른 메서드를 선택할 수 있도록 인터페이스 메서드에 주석을 붙이고 싶습니다.주석 유형이 Inherited annotation implementing 클래스가 Inherited의 Java doc에 설명된 대로 주석을 상속하지 않는 경우:
또한 이 메타 주석으로 인해 슈퍼클래스에서 주석이 상속될 뿐 구현된 인터페이스 상의 주석에는 영향이 없습니다.
이유가 뭘까요?객체의 클래스가 런타임에 구현되는 모든 인터페이스를 이해하는 것은 그리 어려운 일이 아니기 때문에 이 결정에는 타당한 이유가 있을 것입니다.
그렇지 않으면 다중 상속 문제가 발생할 수 있기 때문이라고 생각합니다.
예:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) @Inherited
public @interface Baz { String value(); }
public interface Foo{
@Baz("baz") void doStuff();
}
public interface Bar{
@Baz("phleem") void doStuff();
}
public class Flipp{
@Baz("flopp") public void doStuff(){}
}
public class MyClass extends Flipp implements Foo, Bar{}
이렇게 하면:
MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()
결과는 어떻게 될까요?'바즈', '필림', '플로프'?
이 때문에, 인터페이스의 주석은 거의 도움이 되지 않습니다.
자바독에서 @Inherited:
주석 유형이 자동으로 상속됨을 나타냅니다.주석 유형 선언에 상속된 메타 주석이 있고 사용자가 클래스 선언에 대한 주석 유형을 쿼리하고 클래스 선언에 이 유형에 대한 주석이 없는 경우 주석 유형에 대해 클래스의 수퍼 클래스가 자동으로 쿼리됩니다.이 프로세스는 이 유형의 주석을 찾거나 클래스 계층(개체)의 맨 위에 도달할 때까지 반복됩니다.이 유형에 대한 주석이 있는 슈퍼클래스가 없는 경우 쿼리는 해당 클래스에 해당 주석이 없음을 나타냅니다.주석 유형이 클래스 이외의 항목에 주석을 달기 위해 사용되는 경우 이 메타 주석 유형은 효과가 없습니다.또한 이 메타 주석으로 인해 슈퍼클래스에서 주석이 상속될 뿐 구현된 인터페이스 상의 주석에는 영향이 없습니다.
한편 JSR 305 검증자는 일종의 상속 검색을 수행합니다.클래스 계층이 있는 경우:
//Person.java
@Nonnull
public Integer getAge() {...}
//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}
후, 「」, 「」의 .Student.getAge()@Nonnull @Min(5)@Nonnull@Inherited메타 변환
언급URL : https://stackoverflow.com/questions/4745798/why-java-classes-do-not-inherit-annotations-from-implemented-interfaces
'programing' 카테고리의 다른 글
| 지정된 디렉토리의 파일을 반복하려면 어떻게 해야 합니까? (0) | 2022.10.22 |
|---|---|
| 타임스탬프를 읽을 수 있는 날짜/시간 PHP로 변환 (0) | 2022.10.22 |
| mariadb 서버 로컬 설치로 mariadb의 도커를 실행할 수 있습니까? (0) | 2022.10.22 |
| 애플리케이션 스레드를 안전하게 만드는 방법 (0) | 2022.10.22 |
| PHP를 통해 이메일로 HTML 전송 (0) | 2022.10.22 |