IT story

Java 어노테이션 멤버에 어떤 유형을 사용할 수 있습니까?

hot-time 2020. 4. 28. 08:23
반응형

Java 어노테이션 멤버에 어떤 유형을 사용할 수 있습니까?


오늘 이 문서에 따라 첫 번째 주석 인터페이스를 만들고 싶었고이 컴파일러 오류가 발생했습니다.

Invalid type for annotation member":
public @interface MyAnnotation {
    Object myParameter;
    ^^^^^^
}

분명히 Object주석 멤버의 유형으로 사용할 수 없습니다. 불행히도 나는 일반적으로 사용할 수있는 유형에 대한 정보를 찾을 수 없었습니다.

이것은 시행 착오를 사용하여 알게되었습니다.

  • String → 유효
  • int → 유효
  • Integer → 유효하지 않음 (놀랍게도)
  • String[] → 유효 (놀랍게도)
  • Object → 무효

아마도 어떤 유형이 실제로 허용되고 왜 그런지에 대해 누군가가 밝힐 수 있습니다.


JLS 섹션 9.6.1에 의해 지정됩니다 . 주석 멤버 유형은 다음 중 하나 여야합니다.

  • 원선
  • 열거 형
  • 다른 주석
  • 위의 배열
  • 수업

그것은 제한적으로 보이지만 의심 할 여지가 없습니다.

또한 다차원 배열 (예 String[][]:)은 위 규칙에 따라 암시 적으로 금지됩니다.

이 답변에 설명 된대로 클래스 배열은 허용되지 않습니다 .


사용 가능한 유형에 대해 Skaffman에 동의합니다.

추가 제한 사항 : 컴파일 타임 상수 여야합니다 .

예를 들어 다음은 금지되어 있습니다.

@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())

또한 주석 자체가 주석 정의의 일부가 될 수 있음을 잊지 마십시오 . 이를 통해 간단한 주석 중첩이 가능합니다. 하나의 주석을 여러 번 제시하려는 경우에 유용합니다.

예를 들면 다음과 같습니다.

@ComplexAnnotation({
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3)
})
public Object foo() {...}

SimpleAnnotation이다

@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
    public String a();
    public int b();
)

ComplexAnnotation이다

@Target(ElementType.METHOD)
public @interface ComplexAnnotation {
    public SimpleAnnotation[] value() default {};
)

Examples taken from: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

(original URL: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations)


The concept of annotations fits really well with the design of my project, until I realized you can't have complex datatypes in the annotation. I got around it by using the class of what I wanted to instantiate rather than an instantiated object of that class. It's not perfect, but java rarely is.

@interface Decorated { Class<? extends PropertyDecorator> decorator() }

interface PropertyDecorator { String decorate(String value) }

class TitleCaseDecorator implements PropertyDecorator {
    String decorate(String value)
}

class Person {
    @Decorated(decorator = TitleCaseDecorator.class)
    String name
}

참고URL : https://stackoverflow.com/questions/1458535/which-types-can-be-used-for-java-annotation-members

반응형