問題タブ [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 - TypeVariable または VariableElement から、コンパイル時に注釈プロセッサ内の基になるクラスのメソッドのリストを取得できますか
私は注釈付きのクラスを持っています:
アノテーション プロセッサで、setMessage メソッドに渡されたオブジェクトの getter メソッドのリストを取得したいと考えています。この情報はコード生成に使用されます。
私は ElementScanner6 を拡張し、パラメーターを保持しているように見える VariableElement を取得することができましたが、ここからどこへ行くべきかわかりません。
したがって、この例では、コンパイル時に TestMessage クラスのすべてのメソッドを取得したいと考えています。
何か案は
java - コード生成の注釈処理中に注釈付きのクラス型を取得する方法は?
注釈プロセッサは、注釈付きオブジェクト用と注釈自体用の2 つのTypeElementを提供します。
Class
コードを生成するために、注釈処理中に注釈付きオブジェクトの型を知る必要があると仮定しましょう。TypeElement.getQualifiedName()で修飾名を抽出できます。ただし、使用しようとするとClass.forName(fullyQualifiedName)
、ClassNotFoundException
.
クラスがアノテーション処理コードのパス上にないことを意味している可能性があります。処理ライブラリのクラスパスにすべての注釈付きコードを配置することなく、注釈処理中にそのようなクラスを取得することは可能ですか?
回避策は、次のようなものを生成することです。
代わりに生成されたコードで c を使用しますが、クリーンではありません。
eclipse - Eclipse Indigo での静的メタモデル クラスのサブパッケージ化
私は現在 Eclipse Indigo を使用しています。エンティティの同じパッケージにメタモデル クラスを含めるのではなく、サブパッケージにメタモデル クラスを自動的に生成したいと考えています。
JPA User Guide for Canonical Model Generator on Eclipse Galileoの指示に従いましたが、Indigo ではまったく機能しません。:(
サブパッケージで静的メタモデル クラスを使用している人はいますか? Eclipse Indigo で設定する方法はありますか?
java - Java 6 アノテーション処理 -- アノテーションからクラスを取得する
wiki ドキュメントの自動生成に使用する @Pojo というカスタム アノテーションがあります。
私はこのように使用します:
リソースメソッドにアノテーションを付けて、アノテーションプロセッサが期待するリソースとタイプを説明するwikiページを自動的に生成できるようにします。
value
注釈プロセッサでフィールドの値を読み取る必要がありますが、実行時エラーが発生します。
私のプロセッサのソースコードには、次の行があります。
しかし、プロセッサは実際のクラスを利用できません。javax.lang.model.type.TypeMirror
代わりに、実際のクラスの代理として aが必要だと思います。入手方法がわかりません。
私が得ているエラーは次のとおりです。
これは、私の注釈Appointment
の 1 つで言及されているクラスです。@Pojo
残念ながら、Java アノテーション処理に関するドキュメントやチュートリアルはほとんどないようです。ググってみた。
gwt - マルチプロジェクト設定での Requestfactory 検証
gwt2.4 のリリース版に変更しようとしたところ、問題が発生しました。セットアップで複数のプロジェクトを使用しています。サーバーサイド コードを含むプロジェクト、共有コードを含む 1 つのプロジェクトがあり、さまざまな gwt プロジェクトで使用でき、gwt プロジェクトはすべてを結合します。私はmavenですべてを構築します。ここにある注釈処理の指示に従いました: http://code.google.com/p/google-web-toolkit/wiki/RequestFactoryInterfaceValidation
プロキシとサービスがある共有プロジェクトをコンパイルすると、DeobfuscatorBuilder.java を含む「 generated-sources\apt\」フォルダーが作成されます。このプロジェクトのソースをメインプロジェクトの依存関係として持っており、バリデータも実行しようとしていますが、DeobfuscatorBuilder.java はここでは作成されません。すべてがコンパイルされますが、requestfactory への呼び出しを呼び出すと、エラーが発生します。
セットアップに間違いがあると思いますが、どこを見つけることができませんでした..この問題を解決する方法を知っている人はいますか?
よろしくアルネ
アップデート:
これをpomに追加しました:
これにより、依存関係のソースが解凍され、ターゲット フォルダーに配置されます。それから私は追加しました:
私のプロセッサプラグインに。
この方法では、ワークスペースにすべてのプロジェクトを配置する必要はなく、継続的な統合システムで動作するはずです。アンディの返事がなければ、それを理解することはできなかっただろう :)
java - アノテーション プロセッサにスーパー クラスが存在しないことを確認しています
アノテーション プロセッサでを取得する場合、メソッド を使用しTypeElement
てそのスーパー クラス (より具体的にはその の ) を要求できます。JavaDoc によると、明示的に何も拡張しない (つまり、スーパー クラスである) 型、またはインターフェイスである型は、with asを返します。TypeMirror
getSuperClass()
Object
NoType
NONE
TypeKind
モデル/ミラー API の全体があらゆる機会に一瞬混乱するように見えるという事実を無視して、どうすればこれを確実に確認できますか? コードの抜粋を次に示します。
これは適切な方法ですか?かなりぎこちないようです。equals
TypeMirrorのメソッドはセマンティックの等価性チェックに使用すべきではないため、 に使用しても安全かどうか疑問に思っていTypeKind
ます。列挙型なので私の直感ではイエスと言っていますが、それについては疑問がありinstanceof
ます。
これを行うより良い方法はありますか?javax.lang.model パッケージ全体とその子パッケージには相互参照があり、何かに最適な方法が何であるかがはっきりしません。いくつかのものには便利なユーティリティメソッドがあり、上記のような疑わしいアクロバットを必要とする一見単純なタスクがあります。
java - TypeMirror の isSubtype と isAssignable の違い
コンパイラーによって Java SE 6 または 7 のアノテーション・プロセッサーでインスタンスを使用できるようにする必要があるユーティリティー・インターフェースTypesのドキュメントには、私が取り組んでいるコード・スニペットで興味深い 2 つのメソッドがあります。フィールドの型が特定の抽象クラスから継承された型であるかどうかを確認する必要があります。適用できると思われる 2 つの方法はisAssignable
、 とisSubtype
です。しかし、これらのどれを使用するかはわかりません。
上記のドキュメントで参照されている Java 言語仕様の部分を確認しました。サブタイプと割り当て変換の概念の違いを理解しています (少なくとも私は理解していると思います)。私が間違っていない限りjava.lang.Short
、プリミティブのサブタイプにはなりません (サブタイプはプリミティブlong
間で定義されますが、クラスやプリミティブ間では定義されません)。
ただし、私の場合、どの方法を使用するのが最適かはまだわかりません。サブタイプのチェックは、割り当て可能性よりも厳密で好ましいように見えますが、クラスに関しては、一方が他方を自動的に暗示しているように感じます。
長いバージョンの短い:比較された TypeMirrors が両方ともクラス (インターフェイスまたは列挙型ではない) の場合、同等ですかisAssignable
?isSubtype
java - メソッド本体内のアノテーションの処理
Pluggable AnnotationProcessingAPIを使用してJavaアノテーションを処理しています。メソッド本体内で使用されるアノテーションも処理することはどういうわけか可能ですか?
手伝ってくれてありがとう。ピーター
java - コンパイル ラウンド全体での処理環境メンバーの一貫性
JDK 6 および 7 の Java Annotation Processing API (5 の apt ツール API ではない) は、アノテーション プロセッサのライフサイクルを定義します。1 つは引数のないコンストラクターを介してインスタンス化され、init
メソッドはインスタンスで呼び出され、ProcessingEnvironment
そのプロセッサがメソッドを介して使用されprocess
ます。プロセッサの 1 つのインスタンスのみが作成され、該当する場合、後続のすべての処理ラウンドで使用されます。
私のプロセッサー・クラスは少し肥大化していたので、処理するはずの別個のアノテーション用のハンドラー・クラスを作成しました。これらのクラスのメソッドでは、ユーティリティ メソッド用にから取得したインスタンスを常に渡してElements
います。これにより、メソッドのシグネチャがかなり長くなります。Types
ProcessingEnvironment
プロセッサ インスタンスだけでなく、ハンドラでもインスタンスElements
への参照を維持したいだけです。渡されたTypes
ものからメソッドに取得することでこれを行いました。さて、これは安全かどうか疑問に思っています。JavaDoc forは、一部のメソッドがプロセッサに対して 1 回だけ呼び出されることを明確にしていますが、ここでは言及されていません。これは暗黙のうちに理解されていると思い込んでいましたが、100%確実ではありません。ProcessingEnvironment
init
Processor
init
Messager
同様に取得できるインスタンスが、ProcessingEnvironment
すべての処理ラウンドで同じままであるかどうかも知りたいです。あるラウンドからの警告/エラーが表示されるのではなく、他のラウンドが取り残されることは望ましくありません。ラウンド全体で同じインスタンスを使用しても安全であると合理的に確信していますが、ある程度の確実性が必要です。
java - 前方互換性のある Java 6 アノテーション プロセッサと SupportedSourceVersion
私は 1 つのプロジェクトで Java 7 を試しており、この種の注釈プロセッサ (Bindgen および Hibernate JPA modelgen) から警告を受けています。
@SupportedSourceVersion(SourceVersion.RELEASE_6)
これは、アノテーション プロセッサ クラスのアノテーションが原因です。これらは Java 6 でコンパイルされているため、SourceVersion
利用可能なの最大値は ですRELEASE_6
。の Java 7 バージョンでは、 がSourceVersion
導入されてRELEASE_7
います。
私の質問: 注釈プロセッサはどのように前方互換性を処理することになっていますか? それらの個別の jdk6 および jdk7 バイナリ バージョンが必要ですか? ここで何か他のことを理解していませんか?
この懸念に関して、次の情報しか見つかりませんでした。
使用したQuerdydslバグレポート
コメンターが最新のソース バージョンのサポートを推奨しているOracle ブログ