問題タブ [annotation-processing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 6アノテーションプロセッサでメソッドの戻り値の型パラメータを見つける
注釈プロセッサを使用して、注釈付きクラスのメソッドの戻り値の型に応じてソース コードを生成するツールを作成しています。A
戻り値の型は常に、型変数を定義するインターフェイスのサブタイプ (インターフェイスまたはクラス)ですT
。
m()
メソッドの戻り値型 variableの型パラメーターを見つけたいと思いますT
。
戻り値の型は、注釈プロセッサによってインスタンスとして表されjavax.lang.model.type.TypeMirror
ます。A<T>
最も単純なケースは、直接戻ることです。
検出するプロセッサ コードT
は非常に単純です。(コードをシンプルにするために、ここではビジター API を使用する代わりにキャストします。)
TypeMirror
戻り型の は aでjavax.lang.model.type.DeclaredType
ありT
、最初の型引数です。結果t
はjavax.lang.model.type.TypeVariable
forT
です。同じことが具体的な戻り値の型A<B>
( B
is some type: interface B{}
) に対しても機能します。の結果t
は をDeclaredType
表していB
ます。
他の結果タイプでは事態が複雑になり始めます。
T
Java型システム全体をミラーリングせずに正しい型パラメータを見つける方法はありますか?
java - Maven でアノテーション プロセッサ用に生成されたソース ディレクトリを設定する
アノテーション プロセッサを使用してソースを生成するビルドを Maven に移動しようとしています。次のようにmaven-compiler-pluginを構成しようとしました:
しかし、javacは失敗します
私が知る限り、ソースファイルの前に -s を javac に渡す必要がありますが、maven は後で渡します。
-s
フラグを適切に maven-compiler-pluginに渡すにはどうすればよいですか?
更新: maven-annotation-pluginが機能していないようです。
として構成されている場合
実行は失敗します
java - Javaアノテーションプロセッサの自動ユニットテストを作成するにはどうすればよいですか?
私はJavaアノテーションプロセッサを試しています。「JavaCompiler」を使用して統合テストを作成できます(実際、現在は「hickory」を使用しています)。コンパイルプロセスを実行して、出力を分析できます。問題:注釈プロセッサにコードがなくても、1つのテストが約0.5秒間実行されます。これは、TDDスタイルで使用するには長すぎます。
依存関係をモックアウトするのは私には非常に難しいようです(「javax.lang.model.element」パッケージ全体をモックアウトする必要があります)。誰かが注釈プロセッサ(Java 6)の単体テストを書くことに成功しましたか?そうでない場合...あなたのアプローチは何でしょうか?
java - javac プラグインから MemberSelectTree の式の型を取得するにはどうすればよいですか?
javac の Compiler Tree API を使用してソース コード分析を行う JSR 269 形式の注釈プロセッサを作成しようとしています。メソッド呼び出しなどのメンバー選択式に興味があります。
選択されているメソッド (またはフィールドなど) の名前を簡単に取得できます。しかし、メンバーがどのタイプから選択されているかを知りたいのですが、これを行う簡単な方法を見つけることができないようです. Trees.getTypeMirror
私がそれを呼び出しようとしたすべてに対して返さnull
れます(そしてJavadocはヒントを与えません)。
メンバー select の左側にあるあらゆる種類の式を徹底的に分析し、再帰的分析によって式の静的な型を決定できると思います: NewClassTree
、TypeCastTree
、MethodInvocationTree
、ArrayAccessTree
、およびその他多数。しかし、これは多くのエラーが発生しやすい作業のように見えます。明らかに javac は、多くの目的でこの情報を必要とするため、式の静的型をすでに認識しています。しかし、この型情報にアクセスするにはどうすればよいでしょうか?
私がこれまでに持っているもの:
そして、メソッド呼び出しを行ういくつかの単純なコードで実行したときに出力されるもの:
java - Java 1.6 Annotation Processing を使用してコンパイル時のウィービングを実行するにはどうすればよいですか?
アノテーションを作成し、それを DTO に適用して、Java 1.6 スタイルの annotationProcessor を作成しました。私がやりたいことではない、annotationProcessor に新しいソース ファイルを書き込む方法を確認できます。既存のクラスを変更する方法を確認したり見つけたりすることはできません (理想的には、バイト コードを変更するだけです)。変更は実際にはかなり簡単です。プロセッサに実行させたいのは、処理中の注釈の値に由来する名前の新しい getter と setter を挿入することだけです。
私の注釈プロセッサは次のようになります。
java - JPAエンティティメタモデルを生成するには?
CriteriaQueryに関連するタイプ セーフの精神で、JPA 2.0 には、エンティティのメタモデル表現をサポートする API もあります。
この API の完全に機能する実装 (メタモデル クラスを手動で作成するのではなく、メタモデルを生成するため) を知っている人はいますか? 誰かが Eclipse でこれを設定する手順を知っていれば素晴らしいことです (注釈プロセッサを設定するのと同じくらい簡単だと思いますが、あなたにはわかりません)。
編集: Hibernate JPA 2 Metamodel Generatorに出くわしました。しかし、jar のダウンロード リンクが見つからないため、問題は残ります。
編集 2: この質問をしてからしばらく経ちましたが、戻ってきて、 SourceForge の Hibernate JPA Model Generator プロジェクトへのリンクを追加すると思いました
java - APT によって生成されたクラスが Eclipse によってコンパイルされないのはなぜですか?
私の Eclipse プロジェクトでは、サードパーティの注釈プロセッサ、正確にはHibernate Metamodel Generatorを使用しています。注釈プロセッサは期待どおりに動作し、仕様で指定されているとおりに .java ファイルを生成します。これらのファイルは、「gen」フォルダーの下の Eclipse プロジェクトのディレクトリーに生成されます。プロジェクト プロパティでは、「src」と「gen」という 2 つのソース フォルダーが存在するため、これは正しく反映されます。ただし、何らかの理由でプロジェクトがビルドされると、「gen」の下のすべての [生成された] ソースがコンパイルされません (「bin」ディレクトリを確認すると、「src」ディレクトリの .class ファイルしか表示されません)。なぜこれが起こっているのか誰にも分かりますか?
java - Annotation Processor で AnnotationValue から Enum を取得する方法
注釈プロセッサと注釈ミラーを使用して注釈の列挙型の値を読み取ろうとしていますが、null が返されます。これは、Enum を VariableElement としてラップする AnnotationValue に関係していると思います。VariableElement#getConstantValue() のドキュメントには、「これがコンパイル時の定数に初期化された最終フィールドである場合、この変数の値を返す」と書かれています。わかりましたが、final は注釈メンバーの有効な修飾子ではありません。また、列挙型だけで、他の注釈値の読み取りに問題がないことにも注意してください。
実行時に AnnotationValue が Symbol.VarSymbol としてインスタンス化されているように見えますが、Symbol.VarSymbol#getConstantValue() はオブジェクトを返すだけのように見えます。
最後に、AnnotationValue で toString() を実行すると、適切な値が得られます。
注釈:
私のプロセッサの一部であり、適切な AnnotaionMirror を取得するために多数のループ内にネストされています。
編集: プロセッサのより完全なバージョン。
java - Netbeans の JPA 2.0 メタモデル?
バージョン 6.9 以降、Netbeans には、たとえば JPA 2.0 エンティティのメタモデルを生成するために必要な機能である注釈処理サポートが含まれていることを読みました。
ただし、その方法を正確に示している例やドキュメントは見つかりませんでした。これで成功した人いますか?
java - Eclipse 3.5+-アノテーションプロセッサ:生成されたクラスはインポートできません
プロジェクトのアノテーション付きクラスからメタデータコード(.javaファイル)を生成するために、サードパーティのアノテーションプロセッサを使用しています。Eclipseを介してプロセッサを正常に構成し([プロパティ]->[Javaコンパイラ]->[注釈処理])、コード生成は正常に機能します(コードは自動的に作成および生成されます)。また、Eclipseは、生成されたクラスとそのフィールドをエラーなしで正常に自動補完します。クラス「some.package.Foo」があり、生成されたメタデータクラスが「some.package.Foo_」であるとします。オートコンプリートの助けを借りて、Eclipseエディターで次のコードをエラーなしで取得できます。
ただし、実際にプロジェクトをビルドすると(または、自動的にビルドが有効になっているためファイルを保存すると)、「some.package.Foo_」を解決できないというエラーが表示されます。Eclipseがsome.package.Foo_を同時に生成し、コンパイルしているようです。
私は2つの一時的な解決策を見つけました(そもそも注釈プロセッサの使用を実質的に妨げています):
- 生成されたクラスをビルドする前に、生成されたすべてのファイルを右クリックして[プロパティ]に移動し、[派生]チェックボックスをオフにします。その後、プロジェクトのクリーンアップを行い、インポートは正常です。エラーは発生しません。ただし、もう一度クリーンアップを実行すると、ファイルの生成によって「派生」ティックが再度(自動的に)チェックされるため、エラーが再び表示されます。したがって、これは本当に面倒で時間がかかります。
- また、これらすべてのファイルの「派生」ティックのチェックを外し、今回は、これらのファイルを含むソースフォルダーとパッケージの「派生」チェックのチェックを外します。次に、注釈プロセッサを無効にしてから、クリーンアップを実行します。別のクリーンアップを行ってもインポートエラーは発生しませんが、モデルを更新するものを変更する場合はアノテーションプロセッサをオンに戻して繰り返す必要があるため、アノテーションプロセッサを使用するメリットはありません。それらのファイルの新しいバージョンを生成した後、それをオフにするこの退屈な手順。
これはEclipseのバグですか?はいの場合、上記の2つよりも優れた回避策またはクイックフィックスはありますか?そうでない場合、私は問題を解決するために何を試みるべきですか?
また、ビルドパス上のライブラリの順序を並べ替えてみましたが、役に立ちません。