AbstractAnnotationValueVisitor9 클래스는 다음과 같은 메서드들을 제공합니다:
1. public R visitUnknown(AnnotationValue av, P p)
- 어노테이션 값이 알 수 없는 타입인 경우 호출됩니다.
- av: 어노테이션 값
- p: 사용자가 정의한 파라미터
2. public R visitBoolean(boolean b, P p)
- 어노테이션 값이 boolean 타입인 경우 호출됩니다.
- b: 어노테이션 값
- p: 사용자가 정의한 파라미터
3. public R visitByte(byte b, P p)
- 어노테이션 값이 byte 타입인 경우 호출됩니다.
- b: 어노테이션 값
- p: 사용자가 정의한 파라미터
4. public R visitChar(char c, P p)
- 어노테이션 값이 char 타입인 경우 호출됩니다.
- c: 어노테이션 값
- p: 사용자가 정의한 파라미터
5. public R visitDouble(double d, P p)
- 어노테이션 값이 double 타입인 경우 호출됩니다.
- d: 어노테이션 값
- p: 사용자가 정의한 파라미터
6. public R visitFloat(float f, P p)
- 어노테이션 값이 float 타입인 경우 호출됩니다.
- f: 어노테이션 값
- p: 사용자가 정의한 파라미터
7. public R visitInt(int i, P p)
- 어노테이션 값이 int 타입인 경우 호출됩니다.
- i: 어노테이션 값
- p: 사용자가 정의한 파라미터
8. public R visitLong(long i, P p)
- 어노테이션 값이 long 타입인 경우 호출됩니다.
- i: 어노테이션 값
- p: 사용자가 정의한 파라미터
9. public R visitShort(short s, P p)
- 어노테이션 값이 short 타입인 경우 호출됩니다.
- s: 어노테이션 값
- p: 사용자가 정의한 파라미터
10. public R visitString(String s, P p)
- 어노테이션 값이 String 타입인 경우 호출됩니다.
- s: 어노테이션 값
- p: 사용자가 정의한 파라미터
11. public R visitType(TypeMirror t, P p)
- 어노테이션 값이 TypeMirror 타입인 경우 호출됩니다.
- t: 어노테이션 값
- p: 사용자가 정의한 파라미12. public R visitEnumConstant(VariableElement c, P p)
- 어노테이션 값이 열거형 상수(Enumeration constant)인 경우 호출됩니다.
- c: 어노테이션 값
- p: 사용자가 정의한 파라미터
13. public R visitAnnotation(AnnotationMirror a, P p)
- 어노테이션 값이 다른 어노테이션인 경우 호출됩니다.
- a: 어노테이션 값
- p: 사용자가 정의한 파라미터
14. public R visitArray(List<? extends AnnotationValue> vals, P p)
- 어노테이션 값이 배열인 경우 호출됩니다.
- vals: 어노테이션 값
- p: 사용자가 정의한 파라미터
AbstractAnnotationValueVisitor9 클래스는 위의 메서드들을 추상 메서드로 선언하고 있기 때문에, 이 클래스를 상속받아서 메서드를 구현해야 합니다. 이를 통해 어노테이션 값의 타입에 따라 다른 처리 로직을 구현할 수 있습니다.
예를 들어, 다음과 같은 어노테이션 클래스가 있다고 가정해보겠습니다.
public @interface MyAnnotation {
String value();
int count();
}
이 경우, MyAnnotation 어노테이션의 value 값은 String 타입이고, count 값은 int 타입입니다. 이를 처리하기 위해 AbstractAnnotationValueVisitor9 클래스를 상속받은 다음과 같은 Visitor 클래스를 만들 수 있습니다.
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.AbstractAnnotationValueVisitor9;
public class MyAnnotationVisitor extends AbstractAnnotationValueVisitor9<Void, Void> {
@Override
public Void visitString(String s, Void p) {
System.out.println("String value: " + s);
return null;
}
@Override
public Void visitInt(int i, Void p) {
System.out.println("Int value: " + i);
return null;
}
@Override
public Void visitUnknown(javax.lang.model.element.AnnotationValue av, Void p) {
System.out.println("Unknown value: " + av);
return null;
}
}
이 Visitor 클래스는 MyAnnotation 어노테이션의 value 값이 String 타입일 경우 visitString 메서드를 호출하고, count 값이 int 타입일 경우 visitInt 메서드를 호출합니다. 그리고 다른 타입일 경우 visitUnknown 메서드를 호출하여 처리합니다.
이처럼 AbstractAnnotationValueVisitor9 클래스는 어노테이션 값의 타입에 따라 다른 처리 로직을 구현할 수 있도록 도와주는 유용한 클래스입니다.앞서 설명드린 Visitor 클래스의 예제 코드와 함께, AbstractAnnotationValueVisitor9 클래스의 사용 예시를 보여드리겠습니다.
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.AbstractAnnotationValueVisitor9;
public class MyAnnotationVisitor extends AbstractAnnotationValueVisitor9<Void, Void> {
@Override
public Void visitString(String s, Void p) {
System.out.println("String value: " + s);
return null;
}
@Override
public Void visitInt(int i, Void p) {
System.out.println("Int value: " + i);
return null;
}
@Override
public Void visitType(TypeMirror t, Void p) {
System.out.println("Type value: " + t);
return null;
}
@Override
public Void visitUnknown(AnnotationValue av, Void p) {
System.out.println("Unknown value: " + av);
return null;
}
}
이 Visitor 클래스는 어노테이션 값이 String, int, Type, 그리고 다른 타입일 경우를 처리하도록 구현되어 있습니다.
이제, 이 Visitor 클래스를 사용하는 예시 코드를 살펴보겠습니다.
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
public class MyAnnotationProcessor {
private final Elements elementUtils;
private final Types typeUtils;
public MyAnnotationProcessor(Elements elementUtils, Types typeUtils) {
this.elementUtils = elementUtils;
this.typeUtils = typeUtils;
}
public void processAnnotation(Element element) {
TypeElement typeElement = (TypeElement) element;
for (AnnotationMirror annotationMirror : typeElement.getAnnotationMirrors()) {
DeclaredType annotationType = annotationMirror.getAnnotationType();
if (annotationType.toString().equals(MyAnnotation.class.getName())) {
System.out.println("Found MyAnnotation!");
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : annotationMirror.getElementValues().entrySet()) {
ExecutableElement executableElement = entry.getKey();
AnnotationValue annotationValue = entry.getValue();
System.out.println("Element: " + executableElement.getSimpleName());
System.out.println("Value: " + annotationValue);
MyAnnotationVisitor visitor = new MyAnnotationVisitor();
TypeMirror typeMirror = executableElement.getReturnType();
annotationValue.accept(visitor, null);
}
}
}
}
}
위 코드에서 MyAnnotationProcessor 클래스는 Element 객체를 전달받아서 해당 Element가 가지고 있는 어노테이션을 처리하는 역할을 합니다. 이 때, MyAnnotation 어노테이션이 사용되었는지를 확인하고, 어노테이션 값과 타입을 추출하여 Visitor 클래스를 사용하여 처리하도록 구현되어 있습니다.
'PT선생님의 코딩 강좌' 카테고리의 다른 글
[PT선생님][12]자바 javax.swing.AbstractCellEditor 알아보기 (0) | 2023.02.17 |
---|---|
[PT선생님][11]자바 javax.swing.border.AbstractBorder 알아보기 (0) | 2023.02.17 |
[PT선생님][9]자바 javax.lang.model.util.AbstractAnnotationValueVisitor8 알아보기 (0) | 2023.02.16 |
[PT선생님][8]자바 javax.lang.model.util.AbstractAnnotationValueVisitor7 알아보기 (0) | 2023.02.16 |
[PT선생님][7]자바 javax.lang.model.util.AbstractAnnotationValueVisitor6 알아보기 (0) | 2023.02.16 |