필자는 인터넷에서 여러 개의 Annotation Processing Tool (APT) 가이드 (예 : 1 및 2)를 사용하여 컴파일러/빌드 시간에 작동하도록했으며 Eclipse에서도 작동하도록했습니다.런타임시 Annotation Processing API는 어떻게 사용합니까?
내 주석을 사용하여 유형 (클래스) 목록을 얻으려면 런타임에 APT를 사용할 수있는 방법이 있습니까?
@SupportedAnnotationTypes("com.domain.MyAnnotation")
public class MyAbstractProcessor extends AbstractProcessor {
public static Map<Element, MyAnnotation> patches = new HashMap<Element, MyAnnotation>();
@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) {
// Get all classes that has the annotation
Set<? extends Element> classElements = roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class);
// For each class that has the annotation
for (final Element classElement : classElements) {
patches.put(classElement, annotation);
것은 그래서 MyAbstractProcessor.patches는 주석을 사용하여 클래스의 목록을 채울 것 :
내가 좋아하는 뭔가를 썼다. 이 APT가 빌드시에 실행되고 있으며 실행 시간이 아니라는 단점을 제외하고 고상한 아이디어.런타임에 APT를 사용할 수 있습니까?
또는 내가 원하는 것을 얻기 위해 잘못된 프레임 워크를 사용하고 있습니까?
"또는 빌드 타임에 클래스 목록을 사용하여 클래스를 구성 할 수 있습니다." - 런타임에 응용 프로그램에서 읽는 파일로 출력한다는 의미입니까? – corgrath
예,'processingEnv.getFiler(). createSourceFile (qualifiedName) .openWriter()'를 사용하고 패치 내용을'qualifedName' 클래스의 정적 변수에 씁니다. 물론 모든 필수 클래스를 작성해야합니다. 보일러 플레이트'public class simpleName {private static final Map < > patches = new map < > {패치 내용} ... – emory
와우, createSourceFile은 훌륭합니다. 나는 그것이 가능하다는 것을 몰랐다. 감사합니다 :-) – corgrath