자바 에서 @ Inherited 주해 의 활용

5629 단어 자바
사용자 정의 주석 (Annotation) 을 사용 할 때 사용자 정의 주석 을 부모 클래스 에 표시 하면 하위 클래스 에 계승 되 지 않 지만, 주석 을 정의 할 때 사용자 정의 주석 에 @ Inherited 주석 을 표시 하여 주석 계승 을 실현 할 수 있 습 니 다.
사용자 정의 주석 코드 는 다음 과 같 습 니 다.


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 주석 이 표 시 된 자 보 의 주 해 를 클래스 등급 에 표시 하면 하위 클래스 는 부모 클래스 등급 의 주 해 를 계승 할 수 있 고 그렇지 않 으 면 안 됩 니 다.

좋은 웹페이지 즐겨찾기