所以首先我必須承認我不是Java大師,但是發現你的問題很有趣,並且花了一些時間學習它。這是我發現的。
在我看來,整個概念與泛型非常相關。如在該答覆中提到:https://stackoverflow.com/a/2127320/4250114
TypeElement
是靜態定義的類型e.g List<E>
,List<? extends SomeType>
。而DeclaredType
是一個像List<String>
的具體。
這個概念一些額外的洞察力給我Types#getDeclaredType
方法的Javadoc:
返回對應於類型元素和實際 類型參數的類型。 例如,給定{code Set}的類型元素和類型爲 的{@code String}, ,此方法可用於獲取 參數化類型{@ Set}。
正如如果您想了解吉拉德·布拉徹和戴維·安加更多一些的紙應該是一個不錯的地方所列舉的問題(https://stackoverflow.com/a/2127266/4250114)另一個答覆中提到的(至少我打算;))。
當然,你也可以嘗試在你自己。例如,我已經寫了這樣的處理器,我與調試檢查:
@SupportedAnnotationTypes({"annotationProcessor.MyAnnotation"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class AnnotationProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
final Map.Entry<TypeElement, DeclaredType> collection = getType("java.util.Collection");
final Map.Entry<TypeElement, DeclaredType> string = getType("java.util.String");
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
return false;
}
private Types typeUtils() {
return processingEnv.getTypeUtils();
}
private Map.Entry<TypeElement, DeclaredType> getType(String className) {
TypeElement typeElement = processingEnv.getElementUtils().getTypeElement(className);
DeclaredType declaredType = typeUtils().getDeclaredType(typeElement);
return new HashMap.SimpleEntry<>(typeElement, declaredType);
}
}
希望它幫助...
請到通新圖,就是按照這個新設計圖'TypeElement'和'DeclaredType'之間的區別? – overexchange
同樣。正如你可以看到TypElement'public @interface CompanionClass {Class > friend()}'由於'?'代表了整個「家族」類型。其中一個聲明的類型是public @interface CompanionClass {Class friend()}'。至於'AnnotationValue',它是'Bar Bar',所以在這種情況下TypeElement = DeclaredType,因爲沒有佔位符。 –
對不起,您如何在'class X'的[示例](https://github.com/shamhub/Java_programming/blob/master/JavaCode/src/Dummy.java)中區分'TypeElement'和'DeclaredType'? – overexchange