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
'IT story' 카테고리의 다른 글
산점도를 위해 개별 태그를 넣는 방법 (0) | 2020.04.28 |
---|---|
파이썬에서 Xpath를 사용하는 방법? (0) | 2020.04.28 |
할당과 평등 검사를 결합한 if 문이 왜 true를 반환합니까? (0) | 2020.04.28 |
루비에서 낙타 케이스를 밑줄 케이스로 변환 (0) | 2020.04.26 |
안드로이드 액션 바 제목과 아이콘을 변경하는 방법 (0) | 2020.04.26 |