2017-10-12 20 views
0

AnnotationProcessor로 처리하는 클래스가 있습니다. 과정 중에 .getSimpleName()에 의해 주석이 달린 클래스의 이름을 얻을 수있는 javax.lang.model.element.Element의 인스턴스가 있습니다. 필자가 알고있는 것은 annotated 클래스의 packageName (com.software.cool)입니다.AnnotationProcessor 내에서 주석이 달린 클래스의 패키지 이름을 가져옵니다.

API를 통해 전달하는 방법을 알려주세요.

답변

2

@Yogi합니다 : 그것은 어떤 경우에 놀라운 결과를 생성합니다. 예를 들어, 패키지 이름의 마지막 부분과 내부 클래스의 부모 클래스를 구별하는 것은 불가능합니다. "java.util.Map.Entry"는 패키지 이름의 일부 또는 "Entry"에 대한 클래스를 포함하는 이름의 "Map"입니까? "java.util.Map.Entry"대신 "a.b.c.d"(Proguard 처리 코드의 일반적인 경우)이면 어떻게 될까요?

마찬가지로, 기본에서 클래스 (이름이) 패키지는 복잡하고 신뢰할 수없는 것입니다 ... getQualifiedName 파싱 코드와

를 점하기 전에 아무것도 없을 것입니다. 일반적으로 말하자면, Element의 문자열 표현을 사용해야 할 때 당신은 뭔가 잘못하고있는 것입니다.

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

이 제대로 얻을 것이다 패키지 의 모든가지 경우 :

element의 패키지를 취득하기위한 적절한 패턴입니다.

+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() 실제로 내가 원하는 것을했다!

들으 당신은 확실히 getQualifiedName을 사용하지 않으