注解处理器出现非javax.lang.model.element包类型报错如何解决
问题修复方案
问题1:基本类型字段判断失效报错
错误原因:你的instanceof判断对象归属体系错误,variable是VariableElement类型(属于元素体系),而PrimitiveType是类型体系的子类,二者属于完全独立的继承树,所以判断永远返回false,导致后续强转DeclaredType失败。
修正后的getType方法代码:
public String getType(VariableElement variable) { TypeMirror typeMirror = variable.asType(); // 对字段的类型镜像做基本类型判断 if (typeMirror.getKind().isPrimitive()) { return typeMirror.toString(); } return ((DeclaredType) typeMirror).asElement().toString(); }
问题2:getter方法转换报错
错误原因:类型为ElementKind.METHOD的元素对应的官方公开子类是ExecutableElement,不是VariableElement,后者仅用于表示字段、方法参数、局部变量这类元素,所以方法元素无法强转为VariableElement。
修正后的getGetterMethods方法代码:
public List<? extends ExecutableElement> getGetterMethods(TypeElement targetClass) { List<? extends Element> enclosedElements = targetClass.getEnclosedElements(); List<ExecutableElement> getterMethods = new ArrayList<>(enclosedElements.size()); for (Element element : enclosedElements) { if (element.getKind() == ElementKind.METHOD && !element.getModifiers().contains(Modifier.STATIC) && (element.getSimpleName().toString().startsWith("get") || element.getSimpleName().toString().startsWith("is"))) { getterMethods.add((ExecutableElement) element); } } return getterMethods; }
后续使用该方法返回值时,用ExecutableElement类型接收即可,该类属于javax.lang.model.element公开包,无需依赖JDK内部实现。
内容的提问来源于stack exchange,提问作者Darlyn
相关产品推荐
相关产品推荐

