2016-04-26 15 views
2

AbstractProcessorから継承するクラスのメソッドprocess()を使用して、私の注釈を使用する要素の名前を取得します。注釈を使用する要素を保存するにはどうすればいいですか?

どのようにその名前のリストを保存すると、私はそれらを私の例で使用することができます。 main()方法?私はインターフェイス@CustomAnnotationここ

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CustomAnnotation{ 

} 

はの実装である必要があり、私はここで@CustomAnnotation

public class ClassList { 
    private static final List<String> classList= new LinkedList<>(); 

    public static List<String> getClassList() { 
     return classList; 
    } 

    public static void addList(String name) { 
     classList.add(name); 
    } 
} 

アノテーションを使用するクラスの名前を格納するクラスClassListを持って

@editアノテーションを処理するクラス

@SupportedAnnotationTypes("com.example.CustomAnnotation") 
@SupportedSourceVersion(SourceVersion.RELEASE_8) 
public class CompileTimeAnnotationProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, 
      RoundEnvironment roundEnv) { 
     Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CustomAnnotation.class); 
     for (Element e : elements) { 
      //adds each name to the list 
      ClassList.addList(e.getSimpleName().toString()); 
     } 
     //prints the array 
     System.out.println(Arrays.toString(ClassList.getClassList().toArray(new String[ClassList.getClassList().size()]))); 
     return true; 
    } 

} 
私はそのクラスにアクセスしたい main()方法を持っている場合

は、その後、私は今、注釈

@CustomAnnotation 
public class AnnotatedClass { 

} 
@CustomAnnotation 
public class TestClass { 

} 

を使用しています。

public static void main(String[] args) { 
    System.out.println(ClassList.getClassList().size()); 
} 

私はきれいにし、実際にそれを構築する方法process()に配列を出力しますが、その後、私はリストが空のメインプログラムを実行します。メインプログラムでそのリストにアクセスするには?

+1

あなたの質問は明確ではありません。あなたの実際のコードと達成したいことの詳細を編集してください。 – Mxsky

+0

あなたの質問を精緻化したり、コードを追加したり、もっと文脈を教えてください。 –

+0

私はいくつかのコードで私の投稿を編集しました – Humberd

答えて

2

コンパイル時にアノテーション処理が行われています。実行時までその情報を保持する必要があります。それを行う唯一の方法は、永続的なストレージ(アプリケーションリソースなど)に書き込むことです。

  1. アノテーションを少なくともRetentionPolycy.CLASSにしてください。
  2. すべてのコンパイルラウンドでは、新しい注釈付き要素の検索を実行し、既にdo(ヒント:Nameのインスタンスを保存するのと同じように機能します)のように、名前をセットに追加します。
  3. 最後のコンパイル時に、そのセットの内容をいくつかのリソースファイルに書き込みます(リソースファイルを生成するアノテーションプロセッサの例は、Google Autoライブラリにあります)。
  4. は、あなたのアプリケーションは、その後、実行時に読み込むことができ、アプリケーションのmainメソッド
2

user1643723が言ったように、プロセッサは、コンパイル時にリソースファイルを作成する必要があり、内部のリソースファイルを読み込みます。あなたのコードに基づいた例を以下に示します。

リソースを作成するには、プロセッサprocessingEnvによって提供されるFilerを使用する必要があります。これは、クラスベースのディレクトリにファイルを作成します。

Filer filer = processingEnv.getFiler(); 
FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", "classnames.txt", (Element[]) null); 
Writer writer = resource.openWriter(); 
for (String className : ClassList.getClassList()) { 
    writer.write(className); 
    writer.write("\n"); 
} 
writer.close(); 

今、あなたは他のリソースと同様に、あなたのアプリケーションでそれを読み込むことができます。

InputStream is = getClass().getResourceAsStream("/classnames.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
String line = null; 
while ((line = reader.readLine()) != null) { 
    System.out.println(line); 
} 
reader.close(); 
関連する問題