を発見し、クラスのmethodinvocationにアノテーションのプロセッサのためのjava

StackOverflow https://stackoverflow.com/questions/1066555

質問

皆様にお伝えしたくて書き込みツールのための当社のシステムの構築に統一厳しい呼び出し規約方法に属する授業を含む特定のアンソロジー。

を使用しているコンパイラの木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) り戻すこと AbstractListArrayList, 以降、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 ArrayTypeint[], であり、前 方法。

できるのではないかと考えて走らせ

両前方のコンパイラを解決するタイプ のための情報などもあります。通常の状況では、コンパイラ みを解決のための方法の宣言ではない。そのための方法ましたが、先ほど述べたように還 null です。

のコンパイラを解決するタイプの情報をもできます。 し、以下のように

1.使用 AbstractTypeProcessor クラスから追加され コンパイラのリポジトリのためのJDK7.チェックを JSR 308 そのコンパイラです。ながら、作業中の書類ではこれが有効であろう。のコンパイラができるものをご使用のクラスに戻る 対応するJava5.

このアプローチでき書きプロセッサから呼び出されう のような現在のプロセッサです。

2.使用 JavacTask 代わりに呼び出 JavacTask.analyze().見 本方法 このjavac試験 どのよ 呼び出しにご来客にもあります。

このアプローチプロセッサに見合うような解析ツール よりプラグインのコンパイラという呼び出す必要はありま ではなく、直接できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top