簡體   English   中英

識別Java注釋處理器中類型的穩定性

[英]Identify stability of types in Java annotation processor

我想編寫一個注釋處理器,該處理器基於已處理類型的JavaBeans屬性集生成源代碼。

這通常可以正常工作,但是如果周圍有其他注釋處理器,我將無法正確執行此操作。 具體來說,此類其​​他處理器可能會為我的處理器處理的類型生成超類,因此我也需要考慮該超類的屬性。 在隨后的回合中,可以生成該超類的超類,依此類推。

這意味着我不能生成我的源代碼,直到我感興趣的類型的層次結構穩定為止,即其他處理器在隨后的回合(或在運行我的處理器后的同一回合中)不會再生成其他超類型。 。

我如何才能找到這種情況? 我知道RoundEnvironment#processingOver()以及在最后一輪中生成我的代碼的可能性,但是我知道這是一個壞習慣(編譯器會發出警告)。

要回答我自己的問題:

如果帶注釋的類型的所有超類型都不是錯誤的,則可以將其視為穩定或完整的。 一個例子:

@GenClass("Base")
class MyAnnotatedType extends Base {}

假設@GenBase有一個注釋處理器A,它生成指定的類,在這種情況下為Base 另一個處理器B對MyAnnotatedType的整個層次結構感興趣,例如,它想為所有MyAnnotatedType方法(包括繼承的方法)生成某種描述符。

如果B在A之前運行,則Base類將不存在,因此當B檢查MyAnnotatedType的層次結構時,超類類型鏡像將具有類型ERROR B可以以此為指示將MyAnnotatedType的處理推遲到下一輪。

當A運行時,它將生成Base類,從而導致另一輪處理。

如果現在B第二次運行,它可以處理上一輪所推遲的所有類型。 由於Base現在存在,它將不再具有類型ERROR 為此,我注意到(使用javac),重要的是獲取一個表示類型的新鮮Element ,而不要保留第一輪中仍包含對錯誤超類型的引用的那個Element

如果Base本身沒有錯誤的超類型,則MyAnnotatedType的層次結構已完成, B可以繼續處理它。 否則,將不得不再次推遲處理,直到層次結構最終完成為止。 如果從不生成超類型,則無論如何編譯都將最終產生錯誤,因為在這種情況下B也應該不生成其代碼。

當您說要基於JavaBeans屬性集觸發源生成時,我假設您的意思是成對的getter / setter,無論如何這都不是您的問題的主題。

通常,沒有制定JSR 269規范,因此可以協調多個注釋處理器。 這是設計使然,所有處理器都應是冪等的(意味着相同的條目->相同的輸出)。

因此,如果不修改法律程序,就無法實現“在類型的層次結構穩定之前,我不能生成源代碼”之類的事情。 檢測穩定性是javac的責任。

禁止在最后一輪中生成代碼,因為最后一輪的唯一目的是讓處理器釋放未釋放的資源。 如果其他處理器也做同樣的事情,那么您就有危險了! 所以這對我來說是不行的。

我能想到的唯一可能的解決方案是聲明您的處理器正在處理所有注釋(可以通過將“ *”指定為已處理的注釋來實現)。 我不確定是否不會阻塞其他處理器,必須進行驗證。 但是,如果這樣可行,那么每次生成新文件時都會調用您的處理器。 然后,您將正常處理它們,並且javac將正常檢測到收斂

對於這些解決方案,我不是100%肯定的,但是可能值得嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM