を発見し、クラスのmethodinvocationにアノテーションのプロセッサのためのjava
-
21-08-2019 - |
質問
皆様にお伝えしたくて書き込みツールのための当社のシステムの構築に統一厳しい呼び出し規約方法に属する授業を含む特定のアンソロジー。
を使用しているコンパイラの木API...
かった場合のトラバーサル'tree',どのようにすることができますのタイプのクラス/インタフェースMethodInvocation.
私の場合は、サブクラスTreePathScanner:
@Override
public Object visitMethodInvocation(MethodInvocationTree node, Trees trees) {
}
今度は人にもぴかの種類のクラス(やインターフェース)というメソッドを呼び出する。思いつの間違ったそうです。りそのアイデア...
解決
カップルの問題です。するとともに、それらに関
知のJavaのメソッドの呼び出し手と受け手で
このクラスのメソッドが呼び出されます。Javaの情報
参考としてさまざまな汎用型としては、例えば List<String>
な要素だけを提供するクラスの例 List<E>
.
の要素
の要素のクラスのメソッドが呼び出されますので、できるだ 以下の
MethodInvocationTree node = ...;
Element method =
TreeInfo.symbol((JCTree)node.getMethodSelect());
TypeElement invokedClass = (TypeElement)method.getEnclosingElement();
コーナーの場合:
1.invokedClassすが、スーパークラスの受信機タイプです。で走行
スニペットに new ArrayList<String>.equals(null)
り戻すこと
AbstractList
よ ArrayList
, 以降、equals()を実施
に AbstractList
ない ArrayList
.
2.取り扱いに際配列メソッドの呼び出しなど new int[].clone()
, という
得 TypeElement
クラス Array
.
の実際の型
の種類が無かったりすることもままあり方を決定するもの
受信機タイプです。ある複雑な取り扱いメソッド呼び出し
内の内部クラスの受信機が与えられず明示的に
(例:とは異なり OuterClass.this.toString()
).ここではサンプル実装:
MethodInvocationTree node = ...;
TypeMirror receiver;
if (methodSel.getKind() == Tree.Kind.MEMBER_SELECT) {
ExpressionTree receiver = ((MemberSelectTree)methodSel).getExpression();
receiverType = ((JCTree)receiver).type;
} else if (methodSel.getKind() == Tree.Kind.IDENTIFIER) {
// need to resolve implicit this, which is described in
// JLS3 15.12.1 and 15.9.2
// A bit too much work that I don't want to work on now
// Look at source code of
// Attr.visitApply(JCMethodInvocation)
// resolveImplicitThis(DiagnosticPosition, Env, Type)
} else
throw new AssertionError("Unexpected type: " + methodSel.getKind());
注意:
の receiver
タイプする必要 TypeMirror
ない DeclaredType
られなかった。通話の場合 new int[5].clone()
, receiver
う
an ArrayType
の int[]
, であり、前
方法。
できるのではないかと考えて走らせ
両前方のコンパイラを解決するタイプ
のための情報などもあります。通常の状況では、コンパイラ
みを解決のための方法の宣言ではない。そのための方法ましたが、先ほど述べたように還 null
です。
のコンパイラを解決するタイプの情報をもできます。 し、以下のように
1.使用 AbstractTypeProcessor
クラスから追加され
コンパイラのリポジトリのためのJDK7.チェックを JSR
308 そのコンパイラです。ながら、作業中の書類ではこれが有効であろう。のコンパイラができるものをご使用のクラスに戻る
対応するJava5.
このアプローチでき書きプロセッサから呼び出されう のような現在のプロセッサです。
2.使用 JavacTask
代わりに呼び出 JavacTask.analyze()
.見
本方法 このjavac試験 どのよ
呼び出しにご来客にもあります。
このアプローチプロセッサに見合うような解析ツール よりプラグインのコンパイラという呼び出す必要はありま ではなく、直接できます。