커스텀 - Java 추가를 확장하는 방법?




커스텀 어노테이션 예제 (4)

내 프로젝트에서는 미리 정의 된 주석 @With .

@With(Secure.class)
public class Test { //....

@With 의 소스 코드 :

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface With { 

    Class<?>[] value() default {};
}

나는 사용자 정의 어노테이션 @Secure 를 작성하여 @With@With 어노테이션에 자동으로 배치한다. 그렇게하는 방법?

내가 이것을 좋아한다면? 작동할까요?

@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

https://code.i-harness.com


Java 언어 스펙에서, Chapter 9.6 Annotation Types :

extends 절은 허용되지 않습니다. 주석 유형은 annotation.Annotation 암시 적으로 확장합니다. annotation.Annotation .

따라서 주석을 확장 할 수 없습니다. 다른 메커니즘을 사용하거나 자신의 주석을 인식하고 처리하는 코드를 만들어야합니다. Spring은 다른 Spring의 주석을 사용자 정의 주석으로 그룹화 할 수있게 해준다. 그러나 여전히 확장은 없습니다.


Muhammad Abdurrahman의 대답을 확장하려면 -

@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

이것은 기본적으로 작동하지 않지만 Spring의 AnnotationUtils 와 함께 사용할 있습니다.

예를 보려면 이 SO 답변 을 참조하십시오.


다음과 같이 주석에 주석을 사용할 수 있습니다.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithSecurityContext(factory = WithCustomUserSecurityContextFactory.class)
public @interface WithCustomUser {
  String username() default "[email protected]";
  String password() default "demo";
  String[] authorities() default {Authority.USER};
}

그리고 그 "자식"에 정확한 상태를 정의하십시오.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithCustomUser(username = "[email protected]",
                password = "admin",
                authorities = {Authority.USER, Authority.ADMINISTRATOR})
public @interface WithAdminUser {
}

이 경우 어떤 종류의 "상태"가 있고 반사 / 애스펙트를 통해 부모 주석 필드에 액세스 할 수 있습니다.


@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

이것은 효과가있다.





annotations