programing

Java 클래스가 구현된 인터페이스에서 주석을 상속하지 않는 이유는 무엇입니까?

goodjava 2022. 10. 22. 21:18

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