3

オブジェクトが実行時に不変であるかどうかを確認するための注釈を書き込もうとしています。そのために、オブジェクトのクラスがfinalであるかどうかを確認し、次にそのすべての属性もfinalであるかどうかを確認します。次に、プリミティブ型でない場合は、各フィールドの型について同じことを再帰的にチェックしたいと思います。

ここにコードがあります:

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
        }
    }
}

自分のフィールドのタイプでメソッドを最初からやり直すにはどうすればよいですか?ここにあるフィールドのタイプを取得するにはどうすればよいjavax.lang.model.element.Elementですか?

編集:包含クラスで宣言されている型が必要です。これは、あらゆる種類の可変性を回避するために最終クラスである必要があります。

4

3 に答える 3

0

今まで必要だったことはありませんjavax.lang.model。実行時に確認する場合はjava.lang.Classjava.lang.reflect.Field代わりに確認します。getTypeそこで、フィールドのタイプを取得するために使用できます。を使用して、継承されたフィールドを含むすべてのフィールドを確認することもできますgetFields。または、祖先クラスとその宣言されたフィールドを調べて、プライベートクラスを取得することもできます。

編集:次の考慮事項はもはや関係がないようです

その型情報でさえ、宣言された型、つまりソースコードに記述されている型を返すことに注意してください。フィールドは、実行時に派生クラスへの参照を保持している可能性があります。考えられる対策は、これらすべてのクラスを宣言しfinalて、派生クラスが存在しないようにするか、これらのフィールドへのすべての割り当てをトレースすることです。これは、主要な静的データフロー分析を意味します。それが努力の価値があるかどうかはわかりません。

于 2012-07-11T22:59:47.717 に答える