2017-10-12 11 views
0

私はAnnotationProcessorで処理するクラスを持っています。 処理中にjavax.lang.model.element.Elementというインスタンスがあります。つまり、.getSimpleName()によって注釈付きクラスの名前を取得できます。私が必要としているのは、注釈付きクラスのpackageName(com.software.cool)です。AnnotationProcessor内の注釈付きクラスのパッケージ名を取得

どのようにAPIを受け取ってそれを受け取るか考えてみましょうか?

答えて

2

を@Yogiする

THXあなたは間違いなくgetQualifiedNameを使用したくない:それはいくつかのケースで驚くべき結果を生成します。例えば、パッケージ名の最後の部分と内部クラスの親クラスを区別することは不可能です。 "java.util.Map.Entry"は、パ​​ッケージ名の一部、またはクラスを含むクラスの名前を "Map"とします。Entry? 「java.util.Map.Entry」の代わりに「a.b.c.d」(Proguardで処理されたコードの典型的なケース)の場合はどうなりますか? getQualifiedName

同様に、デフォルトのクラス(名前の)パッケージのドットの前のものがありません...

あなた解析コードは複雑で、信頼できないだろう。一般的に言えば、Elementの文字列表現を使用する必要があるときは、何か間違ったことをしています。

これはelementのパッケージを取得するための適切なパターンです:

Element enclosing = element; 
while (enclosing.getKind() != ElementKind.PACKAGE) { 
    enclosing = enclosing.getEnclosingElement(); 
} 
PackageElement packageElement = (PackageElement) enclosing; 

これは正しくすべて例でパッケージを取得します。

+0

ありがとう!お役立ち情報 – xetra11

0

あなたはすなわち

Element target; 
Package pkg = target.getClass().getPackage(); 
String pkgName = pkg.getName(); 

さらに読書のクラスオブジェクトにgetPackage()メソッドを使用することができます。getPackage Javadocs

+0

ありがとうございました。実際には、これは私が必要とするものではない 'com.sun.tools.javac.tools'をもたらしました。しかし、あなたのおかげで私は別の解決策を見つけた – xetra11

0

element.getQualifierName() は実際に私が望んでいました!

関連する問題