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() 

有沒有人知道我們如何在下面的編譯時將它分成兩部分?

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

或者如果我們能夠像下面那樣通過defauilt值也很好。

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

可以這樣使用註解處理器來實現/需要使用字節碼處理器一樣把它做ASM? 用更有意義的方式更新。

+0

爲什麼不創建構造函數?你的'setValue(a)'也返回'Test'類型,但是在本體中,你返回了'this'? – Kent 2014-09-04 10:23:13

+0

將其更改爲MyClass,這是錯字。 – Mahesh 2014-09-04 11:51:46

+0

它沒有任何意義,它是一個實例方法,並返回相同的實例... – Kent 2014-09-04 11:53:14

回答

1

您是否正在通過元註釋編寫自定義類型系統?也就是說,您是使用SubtypingChecker還是創建了自己的BaseTypeChecker子類型?

簡短的回答是,元註釋不能指定這種行爲。漫長的回答是,如果你有一個自定義的檢查器,那麼有很多方法可以做到這一點。

但請記住,使用元註釋編寫自定義檢查器要複雜一點。但是,如果你有一個自定義的檢查器,您可以執行下列操作之一:

選項A:多形構造 步驟:

  1. 創建@PolyMyAnnotation多態性註釋,見Polymorphic Qualifiers
  2. 創建一個多態MyClass的構造函數,例如 @PolyMyAnnotation MyClass(@PolyMyAnnotation int a){}
  3. 創建一個TreeAnnotator,它將@MyAnnotation添加到類型的int文字中。以RegexTreeAnnotator.visitLiteral爲例。
  4. 將您的TreeAnnotator添加到AnnotatedTypeFactory使用的TreeAnnotators列表中。 (參見RegexAnnotatedTypeFactory

選項B:使用TreeAnnotator 步驟:

  1. 創建擴展TreeAnnotator
  2. 覆蓋visitNewClass
  3. 識別是否正在構造的對象MyClass的實例的類(請參閱ElementUtils.getQualifiedClassName和ElementUtils.isObjectType以瞭解如何執行此操作)
  4. 如果正在構建的類是MyCl的實例屁股,如果是這樣,看看參數是否是一個整數文字。
  5. 如果項目是文字,則解析文字並將其值添加到正在構建的類型中。 請注意,如果您希望這樣處理非文字,例如 int a = 20; new MyClass(a)

然後您可以使用ValueChecker。如果你的類型工廠擴展了ValueAnnotatedTypeFactory,它將支持不斷的傳播。數據流API還爲常量傳播提供了一些支持。但是,如果您有自定義檢查器,則可以覆蓋CFAbstractTransfer.visitMethodInvocation以檢測setValue何時被調用並相應地對其進行優化。例如,您可以查看RegexTransfer,或者搜索擴展CFAbstractTransfer或實現TransferFunction的方法。

也就是說,數據流不能替代類型狀態系統(請參閱Typestate checkers的討論)。

+0

我是新來的註釋,並試圖找出如何實現這一點。我用更有意義的方式更新了這個問題。可以按照您所提及的方式完成,還是需要使用ASM? – Mahesh 2014-10-07 06:41:09