ElementFilter — 프로그램 요소 컬렉션에서 원하는 요소만 골라내는 유틸리티

ElementFilter — 프로그램 요소 컬렉션에서 원하는 요소만 골라내는 유틸리티

어노테이션 프로세서를 만들다 보면, 한 Element 컬렉션에서 메서드만, 또는 필드만 뽑아내고 싶을 때가 많아요. 그런 걸 매번 직접 instanceof 체크로 구현하면 코드가 반복되죠. ElementFilter는 이런 작업을 편하게 해 주는 정적 필터 유틸리티 클래스예요. 요소 컬렉션에서 관심 있는 종류의 요소만 선택해 새 컬렉션으로 돌려줘요.

이 클래스의 모든 메서드는 정적(static) 메서드라서 인스턴스를 만들 필요 없이 바로 호출할 수 있어요.

출처: Java API Reference

본문

ElementFilter는 생성자가 없으며, 다음과 같은 정적 메서드들을 제공해요.

public static List<VariableElement> fieldsIn(Iterable<? extends Element> elements)
public static Set<VariableElement> fieldsIn(Set<? extends Element> elements)
public static List<ExecutableElement> constructorsIn(Iterable<? extends Element> elements)
public static List<ExecutableElement> methodsIn(Iterable<? extends Element> elements)
public static List<TypeElement> typesIn(Iterable<? extends Element> elements)

주요 메서드를 정리하면 이래요.

  • fieldsIn(...) — 인자로 받은 요소들 중 VariableElement(필드/로컬 변수 등)만 골라내요.
  • constructorsIn(...) — 생성자에 해당하는 ExecutableElement만 뽑아요.
  • methodsIn(...) — 메서드에 해당하는 ExecutableElement만 뽑아요.
  • typesIn(...)TypeElement(클래스/인터페이스 등 타입)만 뽑아요.

반환되는 집합·리스트는 새로 생성된 컬렉션이에요. 인자로 받은 컬렉션을 백킹 스토어로 재사용하지 않기 때문에, 원본 컬렉션을 바꿔도 결과에 영향을 주지 않아요. 단, 이 클래스의 메서드들은 인자 컬렉션이 동시에 수정(concurrent modification)되는 상황을 막아주지 않아요. 또 반환된 집합·리스트는 변경 가능하지만 동시 접근에는 안전하지 않아요(unsafe for concurrent access).

예를 들어 어노테이션 프로세서에서 클래스의 메서드 목록만 얻고 싶다면 이렇게 쓰면 돼요.

for (ExecutableElement method : ElementFilter.methodsIn(type.getEnclosedElements())) {
    // 메서드만 처리
}

javax.lang.model.util 패키지에 속하며, 타입 처리 로직을 깔끔하게 유지하는 데 아주 유용한 클래스예요.

더 알아보기 (Learn more)