javax.lang.model.util.AbstractElementVisitor14는 Java 언어에서 제공하는 클래스 중 하나입니다. 이 클래스는 javax.lang.model.element.ElementVisitor 인터페이스를 구현하는 추상 클래스이며, 이를 상속하여 사용자 정의 방문자(visitor)를 만들 수 있습니다.
방문자는 객체 구조에서 각각의 요소(element)를 방문하면서 필요한 작업을 수행하는 패턴입니다. ElementVisitor 인터페이스는 Java 소스 코드를 구성하는 모든 요소들(클래스, 메서드, 필드 등)을 나타내는 javax.lang.model.element.Element 인터페이스의 구현체들을 방문하는데 사용됩니다. 이 방문자는 방문한 요소의 유형에 따라 적절한 작업을 수행하게 됩니다.
AbstractElementVisitor14 클래스는 Java 14 버전에서 추가된 클래스로, JDK에서 제공하는 ElementVisitor 인터페이스의 최신 버전인 Java 14에 맞게 구현되어 있습니다. 따라서 이 클래스를 사용하면 Java 14에서 추가된 새로운 기능을 활용할 수 있습니다.
AbstractElementVisitor14 클래스는 다양한 visit 메서드를 제공하며, 이 메서드들은 Element 인터페이스의 각 요소 유형에 대해 오버로딩되어 있습니다. 따라서 이 클래스를 상속하여 방문자를 만들면, 각 요소 유형에 대한 visit 메서드를 구현하면 됩니다. 이 방법으로 사용자 정의 방문자는 Java 소스 코드의 각 요소를 방문하면서 원하는 작업을 수행할 수 있습니다.
또한, AbstractElementVisitor14 클래스는 Java 14에서 추가된 새로운 요소 유형을 처리할 수 있는 visit 메서드들도 제공합니다. 예를 들어, Java 14에서 추가된 Record 요소 유형에 대한 visitRecord 메서드가 있습니다. 따라서 이 클래스를 사용하면 최신 버전의 Java에서 사용 가능한 새로운 요소 유형도 처리할 수 있습니다.
요약하면, javax.lang.model.util.AbstractElementVisitor14 클래스는 Java 14에서 추가된 ElementVisitor 인터페이스의 최신 버전을 구현하는 추상 클래스입니다. 이 클래스를 상속하여 사용자 정의 방문자를 만들면, Java 소스 코드의 각 요소를 방문하면서 원하는 작업을 수행할 수 있습니다. 이 클래스는 최신 버전의 Java에서 추가된 새로운 요소 유형도 처리할 수 있습니다.AbstractElementVisitor14 클래스의 주요 메서드들을 살펴보면 다음과 같습니다.
1. visit
public R visit(Element e, P p)
- 주어진 요소를 방문하고, 방문한 요소에 대해 적절한 visit 메서드를 호출합니다.
- 이 메서드는 visitUnknown 메서드를 호출하는데, visitUnknown 메서드는 정의되지 않은 요소 유형에 대한 처리를 담당합니다.
2. visitUnknown
public R visitUnknown(Element e, P p)
- 정의되지 않은 요소 유형에 대한 처리를 담당합니다.
- 이 메서드는 UnsupportedOperationException 예외를 던집니다.
3. visitType
public R visitType(TypeElement e, P p)
- 주어진 TypeElement를 방문하고, 적절한 처리를 수행합니다.
4. visitPackage
public R visitPackage(PackageElement e, P p)
- 주어진 PackageElement를 방문하고, 적절한 처리를 수행합니다.
5. visitExecutable
public R visitExecutable(ExecutableElement e, P p)
- 주어진 ExecutableElement를 방문하고, 적절한 처리를 수행합니다.
6. visitTypeParameter
public R visitTypeParameter(TypeParameterElement e, P p)
- 주어진 TypeParameterElement를 방문하고, 적절한 처리를 수행합니다.
7. visitVariable
public R visitVariable(VariableElement e, P p)
- 주어진 VariableElement를 방문하고, 적절한 처리를 수행합니다.
AbstractElementVisitor14 클래스는 이외에도 다양한 visit 메서드를 제공합니다. 이 클래스를 상속하여 사용자 정의 방문자를 만들 때는, 처리하려는 요소 유형에 따라 적절한 visit 메서드를 구현하면 됩니다.
예를 들어, 다음은 AbstractElementVisitor14 클래스를 상속하여 사용자 정의 방문자를 만드는 예시입니다. 이 방문자는 TypeElement를 방문하여, 해당 클래스의 이름과 메서드 수를 출력하는 간단한 예제입니다.
class MyClassVisitor extends AbstractElementVisitor14<Void, Void> {
@Override
public Void visitType(TypeElement e, Void p) {
System.out.println("클래스 이름: " + e.getSimpleName());
System.out.println("메서드 수: " + e.getEnclosedElements().stream().filter(ElementKind.METHOD::equals).count());
return null;
}
}
이 방문자를 사용하여, 다음과 같이 클래스 이름과 메서드 수를 출력할 수 있습니다.
Elements elements = processingEnv.getElementUtils();
TypeElement typeElement = elements.getTypeElement("com.example.MyClass");
MyClassVisitor visitor = new MyClassVisitor();
typeElement.accept(visitor, null);
이 코드는 com.example.MyClass 클래스를 방문하여, 클래스 이름과 메서드 수를 출력합니다. 이렇게 사용자 정의 방문자를 만들면,다음은 javax.lang.model.util.AbstractElementVisitor14를 사용하여 소스 코드의 요소(Element)를 방문하는 간단한 예제입니다.
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.*;
import javax.lang.model.util.*;
@SupportedSourceVersion(SourceVersion.RELEASE_11)
@SupportedAnnotationTypes("*")
public class MyProcessor extends AbstractProcessor {
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getRootElements()) {
MyVisitor visitor = new MyVisitor();
element.accept(visitor, null);
}
return true;
}
private static class MyVisitor extends AbstractElementVisitor14<Void, Void> {
public Void visitType(TypeElement e, Void p) {
System.out.println("Type: " + e.getSimpleName());
return super.visitType(e, p);
}
public Void visitVariable(VariableElement e, Void p) {
System.out.println("Variable: " + e.getSimpleName());
return super.visitVariable(e, p);
}
public Void visitExecutable(ExecutableElement e, Void p) {
System.out.println("Executable: " + e.getSimpleName());
return super.visitExecutable(e, p);
}
public Void visitUnknown(Element e, Void p) {
System.out.println("Unknown: " + e.getSimpleName());
return super.visitUnknown(e, p);
}
}
}
위 코드는 모든 요소(Element)를 방문하고, 각 요소의 유형(Type)에 따라 처리를 수행하는 MyVisitor를 정의합니다. MyVisitor 클래스는 AbstractElementVisitor14를 상속하며, visitType, visitVariable, visitExecutable, visitUnknown 메서드를 구현하여 각 요소 유형에 따른 처리를 수행합니다.
MyProcessor 클래스는 MyVisitor를 사용하여 소스 코드의 모든 요소를 방문합니다. 이 예제에서는 visit 메서드에서 요소의 이름을 출력하도록 했지만, visit 메서드에서 다른 처리를 수행할 수도 있습니다.
참고로, 이 예제는 javax.annotation.processing 패키지와 javax.lang.model 패키지의 클래스를 사용하므로, 이를 사용할 수 있는 환경(예: Java 컴파일러, IDE 등)에서 실행해야 합니다.