次の項目について説明します。
パッケージ apt に含まれる apt ツールおよびその関連 API は、JDK 7 以降で推奨されなくなり、JDK の次回メジャーリリースで削除される予定となっています。javac ツールで利用可能なオプションと、パッケージ javax.annotation.processing
および javax.lang.model
に含まれる API を使用して、注釈を処理してください。
次の表では、apt
API の代替について概要を示します。
apt の型 |
標準の代替 |
---|---|
AnnotationProcessor |
javax.annotation.processing.Processor |
AnnotationProcessorEnvironment |
javax.annotation.processing.ProcessingEnvironment |
AnnotationProcessorFactory |
javax.annotation.processing.Processor |
AnnotationProcessorListener |
アナログなし。 |
AnnotationProcessors |
アナログなし。 |
Filer |
javax.annotation.processing.Filer |
Filer.Location |
javax.tools.StandardLocation |
Messager |
javax.annotation.processing.Messager |
RoundCompleteEvent |
アナログなし。 |
RoundCompleteListener |
アナログなし。 |
RoundState |
javax.annotation.processing.RoundEnvironment |
apt の型 |
標準の代替 |
---|---|
AnnotationMirror |
javax.lang.model.element.AnnotationMirror |
AnnotationTypeDeclaration |
javax.lang.model.element.TypeElement |
AnnotationTypeElementDeclaration |
javax.lang.model.element.ExecutableElement
|
AnnotationValue
|
javax.lang.model.element.AnnotationValue
|
ClassDeclaration
|
javax.lang.model.element.TypeElement
|
ConstructorDeclaration
|
javax.lang.model.element.ExecutableElement
|
Declaration
|
javax.lang.model.element.Element
|
EnumConstantDeclaration
|
javax.lang.model.element.VariableElement
|
EnumDeclaration
|
javax.lang.model.element.TypeElement
|
ExecutableDeclaration
|
javax.lang.model.element.ExecutableElement
|
FieldDeclaration
|
javax.lang.model.element.VariableElement
|
InterfaceDeclaration
|
javax.lang.model.element.TypeElement
|
MemberDeclaration
|
javax.lang.model.element.Element
|
MethodDeclaration
|
javax.lang.model.element.ExecutableElement
|
Modifier
|
javax.lang.model.element.Modifier
|
PackageDeclaration
|
javax.lang.model.element.PackageElement
|
ParameterDeclaration
|
javax.lang.model.element.VariableElement
|
TypeDeclaration
|
javax.lang.model.element.TypeElement
|
TypeParameterDeclaration
|
javax.lang.model.element.TypeParameterElement
|
apt の型 |
標準の代替 |
---|---|
AnnotationType
|
javax.lang.model.type.DeclaredType
|
ArrayType
|
javax.lang.model.type.ArrayType
|
ClassType
|
javax.lang.model.type.DeclaredType
|
DeclaredType
|
javax.lang.model.type.DeclaredType
|
EnumType
|
javax.lang.model.type.DeclaredType
|
InterfaceType
|
javax.lang.model.type.DeclaredType
|
MirroredTypeException
|
javax.lang.model.type.MirroredTypeException
|
MirroredTypesException
|
javax.lang.model.type.MirroredTypesException
|
PrimitiveType
|
javax.lang.model.type.PrimitiveType
|
PrimitiveType.Kind
|
javax.lang.model.type.TypeKind
|
ReferenceType
|
javax.lang.model.type.ReferenceType
|
TypeMirror
|
javax.lang.model.type.TypeMirror
|
TypeVariable
|
javax.lang.model.type.TypeVariable
|
VoidType
|
javax.lang.model.type.NoType
|
WildcardType
|
javax.lang.model.type.WildcardType
|
apt の型 |
標準の代替 |
---|---|
DeclarationFilter
|
javax.lang.model.util.ElementFilter
|
DeclarationScanner
|
javax.lang.model.util.ElementScanner6
|
DeclarationVisitor
|
javax.lang.model.element.ElementVisitor
|
DeclarationVisitors
|
代替はありません。 |
Declarations
|
javax.lang.model.util.Elements
|
SimpleDeclarationVisitor
|
javax.lang.model.util.SimpleElementVisitor6
|
SimpleTypeVisitor
|
javax.lang.model.util.SimpleTypeVisitor6
|
SourceOrderDeclScanner
|
javax.lang.model.util.SimpleElementVisitor6
|
SourcePosition
|
代替はありません。 |
TypeVisitor
|
javax.lang.model.element.TypeVisitor
|
Types
|
javax.lang.model.util.Types
|
apt
はコマンド行ユーティリティーで、注釈処理ツールです。検証が行われている指定されたソースファイルセットに存在する注釈に基づいて、注釈プロセッサを検出し実行します。この注釈処理ツールは、リフレクション API とサポートインフラストラクチャーのセットを使用して、プログラム注釈の処理を実行します (JSR 175)。apt リフレクト API は、構築時のソースベースで、プログラム構造に関する読み取り専用ビューを提供します。これらは、ジェネリクス (JSR 14) の追加後に、JavaTM プログラム言語の型システムを明確にモデルするために設計されました。最初に apt
は、新しいソースコードとほかのファイルを作成できる注釈プロセッサを実行します。次に apt
は、元のファイルと生成されたソースファイルのコンパイルを行うので、開発サイクルを簡素化できます。
注釈に基づいて派生ファイルを生成する場合、ドックレットと比較すると apt には次の利点があります
プロセッサのインスタンスが、対応するファクトリ AnnotationProcessorFactory により返されます。apt ツールはファクトリの getProcessorFor メソッドを呼び出しプロセッサを保持します。この呼び出しの間に、ツールは AnnotationProcessorEnvironment を提供します。この環境でプロセッサは、開始するために必要なあらゆるもの (操作しているプログラム構造への参照や、新しいファイルを作成して警告とエラーメッセージを渡すことにより apt ツールと通信および連携する方法など) を検出します。
ファクトリを見つけるには 2 つの方法があります。使用するファクトリは「-factory」コマンド行オプションを使用して指定できます。または apt discovery プロシージャー中にファクトリを見つけることもできます。「-factory」オプションを使用すると、既知の単一ファクトリをもっとも簡単に実行できます。このオプションは実行される方法をファクトリがより詳細に制御する必要がある場合にも使用されます。特定のパスでファクトリを検出するために、検出プロシージャーは次に示す方法で jar ファイルから META-INF/services 情報を取得します。
「-factory」オプションを使用して注釈プロセッサを作成して使用するには:
import com.sun.mirror.apt.*; import com.sun.mirror.declaration.*; import com.sun.mirror.type.*; import com.sun.mirror.util.*; import java.util.Collection; import java.util.Set; import java.util.Arrays; import static java.util.Collections.*; import static com.sun.mirror.util.DeclarationVisitors.*; /* * This class is used to run an annotation processor that lists class * names. The functionality of the processor is analogous to the * ListClass doclet in the Doclet Overview. */ public class ListClassApf implements AnnotationProcessorFactory { // Process any set of annotations private static final Collection<String> supportedAnnotations = unmodifiableCollection(Arrays.asList("*")); // No supported options private static final Collection<String> supportedOptions = emptySet(); public Collection<String> supportedAnnotationTypes() { return supportedAnnotations; } public Collection<String> supportedOptions() { return supportedOptions; } public AnnotationProcessor getProcessorFor( Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { return new ListClassAp(env); } private static class ListClassAp implements AnnotationProcessor { private final AnnotationProcessorEnvironment env; ListClassAp(AnnotationProcessorEnvironment env) { this.env = env; } public void process() { for (TypeDeclaration typeDecl : env.getSpecifiedTypeDeclarations()) typeDecl.accept(getDeclarationScanner(new ListClassVisitor(), NO_OP)); } private static class ListClassVisitor extends SimpleDeclarationVisitor { public void visitClassDeclaration(ClassDeclaration d) { System.out.println(d.getQualifiedName()); } } } }
このプロセッサの例では、いくつかの新しい言語とライブラリ機能が使用されています。まず、さまざまなユーティリティーメソッドの簡易名を使用できるように、static import が使用されます。たとえば、
「unmodifiableCollection」を
「Collections.unmodifiableCollection」
の代わりに使用できます。
次に、ジェネリックコレクションが全体で使用されています。Arrays.asList メソッドが可変長引数メソッドになったので、コンマ区切りの文字列リストを受け取って目的の要素のリストを作成できます。Collections.emptySet メソッドはジェネリックメソッドで、型保証された空のセットを作成するために使用できます。process メソッド内の for ループは、コレクションをイテレートする拡張 for ループです。
apt ツールは、処理するファクトリの注釈セットをファクトリに提示します。注釈セットと注釈プロセッサ環境に基づいて、ファクトリは単一注釈プロセッサを返します。ファクトリが複数の注釈プロセッサを返したい場合はどうなりますか。ファクトリは com.sun.mirror.apt.AnnotationProcessors.getCompositeAnnotationProcessor を使用して、複数の注釈プロセッサを組み合わせてオペレーションを順番に行うことができます。
apt 固有のオプションを次に示します。
ファクトリクラスが注釈処理の複数のラウンドで使用される場合、ファクトリクラスは 1 回ロードされ、ファクトリの getProcessorFor メソッドがラウンドごとに 1 回呼び出されます。これによりファクトリは、ラウンドをまたがって静的状態を保存できます。
-factory オプションが使用されている場合、指定されたファクトリだけが照会されます。
ミラー API は、主に com.sun.mirror.declaration パッケージ内の Declaration インタフェースおよびそのサブインタフェースの階層によってソースコード構造体を表します。Declaration は、パッケージ、クラス、メソッドなどのプログラム要素を表し、通常はソースコードの特定部分に 1 対 1 で対応しています。Declarations は注釈可能な構造です。
型は、com.sun.mirror.type パッケージ内の TypeMirror インタフェースおよびそのサブインタフェースの階層により表現されます。型にはプリミティブ型、クラスおよびインタフェース型、配列型、型変数、およびワイルドカード型が含まれます。
API は宣言と型を慎重に区別します。これは、1 つの宣言が型ファミリ全体を定義できる、ジェネリック型においてもっとも重要です。たとえば、java.util.Set クラスの宣言は次に対応します。
TypeMirror は、ソースコード内の戻り値型、パラメータ型などをモデル化するために使用されます。参照型用の TypeMirror は、型から対応する宣言へのマッピング (たとえば、java.util.Set<String> 用のミラー型から java.util.Set 用の宣言へ) を提供します。