자바 에서 @ Inherited 주해 의 활용
5629 단어 자바
사용자 정의 주석 코드 는 다음 과 같 습 니 다.
package com.xdf.annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
@Inherited
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
String value();
}
이어서 추상 적 인 부류 를 정의 하 다
코드 는 다음 과 같 습 니 다:
package com.xdf.annotation;
public abstract class AbstractParent {
@InheritedAnnotation(value = "parent abstractMethod ")
public abstract void abstractMethod();
@InheritedAnnotation(value = "Parent's doExtends")
public void doExtends() {
System.out.println(" AbstractParent doExtends ...");
}
}
우 리 는 부모 클래스 의 방법 을 사용자 정의 로 설명 합 니 다.
이 어 추상 적 인 부모 클래스 (AbstractParent) 를 계승 하 는 하위 클래스 를 정의 합 니 다.
코드 는 다음 과 같 습 니 다:
package com.xdf.annotation;
public class SubClassImpl extends AbstractParent{
@Override
public void abstractMethod() {
System.out.println(" ");
}
}
하위 클래스 에서 abstractMethod 추상 적 인 방법 을 실 현 했 고 doExtendes 방법 을 다시 쓰 지 않 았 습 니 다.
테스트 클래스 코드 는 다음 과 같 습 니 다:
package com.xdf.annotation;
import java.lang.reflect.Method;
public class InheritedAnnotationTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class<SubClassImpl> clazz=SubClassImpl.class;
//abstractMethod
Method method = clazz.getMethod("abstractMethod", new Class[]{});
if(method.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation ma = method.getAnnotation(InheritedAnnotation.class);
System.out.println(" Annotation, :");
System.out.println(ma.value());
}else{
System.out.println(" Annotation");
}
Method methodOverride = clazz.getMethod("doExtends", new Class[]{});
if(methodOverride.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation ma = methodOverride.getAnnotation(InheritedAnnotation.class);
System.out.println(" doExtends doExtends Annotation, :");
System.out.println(ma.value());
}else{
System.out.println(" doExtends doExtends Annotation");
}
}
}
실행 결 과 는 다음 과 같 습 니 다.
Annotation
doExtends doExtends Annotation, :
Parent's doExtends
상기 코드 가 실 행 된 결 과 를 통 해 다음 과 같은 결론 을 얻 을 수 있 습 니 다.
1. 만약 에 자 류 가 부 류 를 계승 하고 부 류 중의 주해 가 있 는 방법 을 다시 썼 다 면 부 류 방법의 주 해 는 자 류 에 의 해 계승 되 지 않 을 것 이다.
2. 자 류 가 부 류 를 계승 하지만 부 류 를 다시 쓰 는 방법 이 없다 면 부 류 방법 에 대한 주 해 는 자 류 에 의 해 계승 된다. 즉, 자 류 에서 부 류 방법 에 대한 주 해 를 얻 을 수 있다 는 것 이다.
하지만.......................................................................................이게 무슨 상황 이 죠?
이어서 나 는 @ Inherited 주석 이 표시 되 지 않 은 사용자 정의 주석 을 클래스 단계 (방법 단계 가 아 닌) 에 표시 하고 추상 적 인 부 류 를 다음 과 같이 바 꾸 었 다.
package com.xdf.annotation;
@InheritedAnnotation(value="parent") //
public abstract class AbstractParent {
@InheritedAnnotation(value = "parent abstractMethod ")
public abstract void abstractMethod();
@InheritedAnnotation(value = "Parent's doExtends")
public void doExtends() {
System.out.println(" AbstractParent doExtends ...");
}
}
그리고 테스트 클래스 의 main 방법 에 다음 과 같은 테스트 코드 를 추가 하 였 습 니 다.
if(clazz.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation cla = clazz.getAnnotation(InheritedAnnotation.class);
System.out.println(" Annotation, :");
System.out.println(cla.value());
}else{
System.out.println(" Annotation");
}
이것 은 상황 이 발생 했 습 니 다. main 방법 을 실행 하여 결 과 를 얻 었 습 니 다.
Annotation
doExtends doExtends Annotation, :
Parent's doExtends
Annotation
실행 결과 에서 하위 클래스 가 부모 클래스 등급 의 주 해 를 계승 하지 않 은 것 을 발견 할 수 있 습 니 다. 그래서 저 는 @ Inherited 주 해 를 사용자 정의 주해 에 표시 한 다음 에 실행 하여 다음 과 같은 결 과 를 얻 었 습 니 다.
Annotation
doExtends doExtends Annotation, :
Parent's doExtends
Annotation, :
parent
운행 결과 에 주의 하 세 요. 하위 클래스 는 부모 클래스 의 주 해 를 계승 하 였 습 니 다.
이게 뭘 설명 하 는 거 죠?
이 는 @ Inherited 주석 이 표 시 된 사용자 정의 주 해 를 클래스 등급 과 방법 등급 에 적용 하 는 것 이 다르다 는 것 을 설명 합 니 다. @ Inherited 주석 이 표 시 된 자 보 의 주 해 를 클래스 등급 에 표시 하면 하위 클래스 는 부모 클래스 등급 의 주 해 를 계승 할 수 있 고 그렇지 않 으 면 안 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.