2017-10-12 2 views
0

Ich habe eine Klasse, die ich mit einem AnnotationProcessor bearbeite. Während ich dabei bin, habe ich eine Instanz von javax.lang.model.element.Element, wo ich den Namen der annotierten Klasse durch .getSimpleName() erhalten kann. Was ich weiß, ist der packageName (com.software.cool) der annotierten Klasse.Abrufen des Paketnamens einer annotierten Klasse in AnnotationProcessor

Irgendeine Idee, wie man durch die API geht, um es zu erhalten?

Antwort

2

Sie definitiv nicht wollen, getQualifiedName verwenden: es wird überraschende Ergebnisse in einigen Fällen produzieren. Zum Beispiel ist es unmöglich, den letzten Teil des Paketnamens und die Elternklasse der inneren Klassen zu unterscheiden: in "java.util.Map.Entry" ist "Map" ein Teil des Paketnamens oder der Name der enthaltenden Klasse für Entry? Was wäre, wenn statt "java.util.Map.Entry" "a.b.c.d" (ein typischer Fall für von Proguard verarbeiteten Code) ist?

Ebenso für die Klassen in Standard (unbenannt) Paket gibt es nichts vor dem Punkt sein ...

Mit getQualifiedName Ihrem Parsing-Code wird komplex und unzuverlässig sein. Im Allgemeinen, wenn Sie String-Darstellungen von Element verwenden müssen, tun Sie etwas falsch.

Dies ist das richtige Muster Paket von element für immer:

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

Das wird richtig Paket erhalten in alle Fälle.

+0

danke! Gut zu wissen – xetra11

0

Sie können getPackage() -Methode auf Klasse-Objekt verwenden, das heißt

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

Weiterführende Literatur: getPackage Javadocs

+0

Danke für den Hinweis. Tatsächlich ergab dies die 'com.sun.tools.javac.tools', was ich nicht benötigte. Aber dank dir fand ich eine andere Lösung – xetra11

0

element.getQualifierName() hatte eigentlich das, was ich wollte!

thx to @Yogi

Verwandte Themen