3

我正在尝试编写注释来检查对象在运行时是否不可变。为了做到这一点,我检查对象的类是否是最终的,然后它的所有属性是否也是最终的。然后,如果它不是原始类型,我想递归地检查每个字段的类型。

这里有一段代码:

for (Element subElement : element.getEnclosedElements()) {
    if (subElement.getKind().isField()) {
        isFinal=false;

        for(Modifier modifier : subElement.getModifiers()) {
            if (modifier.equals(Modifier.FINAL)) {
                isFinal=true;
                break;
            }
        }
        if (!isFinal) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Field "+element+" is not immutable because it is not final");
        } else {
            // Here I want to restart my method recursively
        }
    }
}

如何让我的方法以我的字段类型重新开始?如何检索字段的类型,这里是 a javax.lang.model.element.Element

编辑:我需要包含类中声明的类型,它需要是最终类以避免任何类型的可变性。

4

3 回答 3

2

我已经能够使用Square 的 javapoet ClassName类来做到这一点:

Element element = ...
ClassName className = ClassName.get(element.asType());
String name = className.toString();

例如,如果带注释的字段是 a String,它将返回Java.lang.String。我愿意接受比这个更好的解决方案。

于 2017-04-08T14:17:53.073 回答
2

我认为

String type = element.asType().toString();

还获取字段类型的完全限定名称。

于 2020-10-25T04:38:43.630 回答
0

我以前从来不需要javax.lang.model。如果您打算在运行时检查事情,我会通过java.lang.Classjava.lang.reflect.Field不是。在那里您可以使用getType来获取字段的类型。您还可以使用 . 查看所有字段,包括继承的字段getFields。或者您可以查看祖先类及其声明的字段,也可以查看私有的。

编辑:以下考虑似乎不再相关

请注意,即使该类型信息也会返回声明的类型,即源代码中编写的类型。该字段可能在运行时仍持有对派生类的引用。可能的对策是声明所有这些类final,以便没有派生类,或者跟踪对这些字段的所有分配,这意味着主要的静态数据流分析。不确定这是否值得努力。

于 2012-07-11T22:59:47.717 回答