gpt4 book ai didi

java - 优雅地处理 TypeMirror 和 Class

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:12 25 4
gpt4 key购买 nike

我刚刚在这里开始使用 javax AnnotationProcessing,遇到了一个丑陋的案例。我将在描述我的学习过程的一系列伪代码行中对其进行说明:

MyAnnotation ann = elementIfound.getAnnotation(MyAnnotation.class);
// Class<?> clazz = ann.getCustomClass(); // Can throw MirroredTypeException!
// Classes within the compilation unit don't exist in this form at compile time!

// Search web and find this alternative...

// Inspect all AnnotationMirrors
for (AnnotationMirror mirror : element.getAnnotationMirrors()) {
if (mirror.getAnnotationType().toString().equals(annotationType.getName())) {
// Inspect all methods on the Annotation class
for (Entry<? extends ExecutableElement,? extends AnnotationValue> entry : mirror.getElementValues().entrySet()) {
if (entry.getKey().getSimpleName().toString().equals(paramName)) {
return (TypeMirror) entry.getValue();
}
}
return null;
}
}
return null;

问题是,现在我发现如果客户端代码包含像 java.lang.Stringjava.lang.Object 这样的核心类作为Class参数,这一行:

return (TypeMirror) entry.getValue();

...导致 ClassCastException,因为在这种情况下 AnnotationProcessor 环境足以实际检索 Class 对象。

我已经想出了如何在没有 Class 的情况下使用 TypeMirror 做所有我需要做的事情 - 我现在需要在我的代码中处理它们吗?有没有办法从 Class 对象中获取 TypeMirror?因为找不到

最佳答案

对于这个问题,我采用的解决方案是使用 ProcessingEnvironment 将生成的类对象转换为 TypeMirrors,在我获得类而不是 TypeMirrors 的情况下。这似乎工作得很好。

AnnotationValue annValue = entry.getValue();
if (annValue instanceof TypeMirror) {
return (TypeMirror) annValue;
}
else {
String valString = annValue.getValue().toString();
TypeElement elem = processingEnv.getElementUtils().getTypeElement(valString);
return elem.asType();
}

关于java - 优雅地处理 TypeMirror 和 Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17663023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com