0

以下のようなコードを書きたかったのです。

MyClass a = new @MyAnnotation MyClass()

MyClass メソッドが以下のようになっていると仮定します

   public class MyClass {

    int a;

    public void setValue(int a) {
        this.a = a;
    }

}

そのため、アノテーションを使用して MyClass のオブジェクトを作成する場合、デフォルト値を x (たとえば 20) に設定する必要があります。

チェッカー フレームワークでは、以下のようにコードに注釈を付けることができます。

MyClass a = new @MyAnnotation MyClass()

以下のように、コンパイル時にこれを2つの部分に分割する方法を知っている人はいますか?

   MyClass a = new MyClass();
   a.setValue(20);

または、以下のようなデフォルト値を渡すことができれば問題ありません。

MyClass a = new @MyAnnotation(value=20) MyClass()

これは注釈プロセッサを使用して実現できますか? ASM のようなバイトコード プロセッサを使用して実行する必要がありますか? より意味のある方法で更新されました。

4

1 に答える 1

1

メタアノテーションを介してカスタム型システムを作成していますか? つまり、 SubtypingCheckerを使用していますか、それとも BaseTypeChecker の独自のサブタイプを作成しましたか?

簡単に言えば、メタアノテーションでは、この種の動作を指定することはできません。長い答えは、カスタム チェッカーがある場合、これを行う方法はいくつかあるということです。

ただし、カスタム チェッカーの作成は、メタ アノテーションを使用するよりもかなり複雑であることに注意してください。ただし、カスタム チェッカーがある場合は、次のいずれかを実行できます。

オプション A: ポリモーフィック コンストラクター 手順:

  1. @PolyMyAnnotation ポリモーフィック アノテーションを作成します。ポリモーフィック修飾子を参照してください。
  2. @PolyMyAnnotation MyClass(@PolyMyAnnotation int a) {} など、MyClass の PolyMorphic コンストラクターを作成します。
  3. int リテラルの型に @MyAnnotation を追加する TreeAnnotator を作成します。例については、 RegexTreeAnnotator.visitLiteralを参照してください。
  4. AnnotatedTypeFactory で使用される TreeAnnotators のリストに TreeAnnotator を追加します。( RegexAnnotatedTypeFactoryを参照してください。

オプション B: TreeAnnotator を使用する 手順:

  1. TreeAnnotator を拡張するクラスを作成する
  2. visitNewClass をオーバーライドする
  3. 構築中のオブジェクトが MyClass のインスタンスであるかどうかを識別します (これを行う方法については、ElementUtils.getQualifiedClassName および ElementUtils.isObjectType を参照してください)。
  4. 構築中のクラスが MyClass のインスタンスである場合は、引数が整数リテラルかどうかを確認します。
  5. 項目がリテラルの場合は、リテラルを解析し、その値を構築中の型に追加します。これで非リテラルを処理したい場合は注意してください。たとえば、int a = 20; 新しい MyClass(a)

次に、ValueChecker を使用できます。型ファクトリが ValueAnnotatedTypeFactory を拡張する場合、定数の伝播がサポートされます。データ フロー API は、一定の伝播もサポートします。

オプション C: データフローの CFAbstractTransfer 関数をカスタマイズする ただし、カスタム チェッカーがある場合は、CFAbstractTransfer.visitMethodInvocation をオーバーライドして setValue が呼び出されたことを検出し、それに応じて調整することができます。例としてRegexTransferを参照するか、CFAbstractTransfer を拡張するメソッドや TransferFunction を実装するメソッドを検索 できます。

とはいえ、データフローは型状態システムの代わりにはなりません (これについてはTypestate チェッカーで説明されています)。

于 2014-09-10T22:10:38.550 に答える