一個Demo,理解註解在業務中充當的角色

一個Demo,理解註解在業務中充當的角色

寫在前面

今天是中秋,但是!不能因為中秋有停止了學習的腳步!所以在這中秋佳節團員之際讓我們聊一聊註解,但其實單純說註解,註解本身沒有任何的作用。簡單說和註釋沒啥區別,而它有作用的原因是:註解解釋類,也就是相關對代碼進行解釋的特定類。一般這些類使用反射是可以拿到的。

因此,通過註解和反射這倆者的結合使用,是可以做到很多功能的。不知道各位小夥伴有沒有留意過,很多框架都是使用了註解。如果再深入的看一看源碼就會發現,很多註解是和反射一起使用的。

因此今天咱們也讓通過註解+反射,寫一個簡單的ORM框架,效果是通過註解的方式快速生成SQL語句。

正文

首先是註解類:Table,Column(分別代表:表和列)

一個Demo,理解註解在業務中充當的角色

話外音

@Target:

用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)註解(annotation)可被用於 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在註解類型的聲明中使用了target可更加明晰其修飾的目標。

取值(ElementType)有:

  • ElementType.ANNOTATION_TYPE 可以應用於註釋類型。
  • ElementType.CONSTRUCTOR 可以應用於構造函數。
  • ElementType.FIELD 可以應用於字段或屬性。
  • ElementType.LOCAL_VARIABLE 可以應用於局部變量。
  • ElementType.METHOD 可以應用於方法級註釋。
  • ElementType.PACKAGE 可以應用於包聲明。
  • ElementType.PARAMETER 可以應用於方法的參數。
  • ElementType.TYPE 可以應用於類的任何元素。

@Retention:

@Retention定義了該註解被保留的時間長短:某些註解僅出現在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的註解可能會被虛擬機忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為註解與class在使用上是被分離的)。使用這個meta-Annotation可以對註解的“生命週期”限制。

作用:表示需要在什麼級別保存該註釋信息,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)

取值(RetentionPoicy)有:

  • 1.SOURCE:在源文件中有效(即源文件保留)
  • 2.CLASS:在class文件中有效(即class保留)
  • 3.RUNTIME:在運行時有效(即運行時保留)

PS:註解只有一個成員時,按規範寫成value(),當然不這麼寫不會報錯。

如果不設置默認值,那麼使用註解時必須要傳值。

只有類可以被註解,因為接口或者抽象類並不能被註解。

迴歸正文

緊接著是註解的使用類:Person(就是一個使用註解的Java bean)

一個Demo,理解註解在業務中充當的角色

PS:如果有兩個以上參數:必須這麼使用@Column(value="user_name")

核心方法

寫一個通過對象生成查詢SQL語句的方法。先聲明一下,這種寫法沒有太大的時機意義。只是舉例說明一下反射操作註解的一種思想:

一個Demo,理解註解在業務中充當的角色

方法使用

在main方法中的使用:

一個Demo,理解註解在業務中充當的角色

運行效果,可能很多小夥伴已經猜到啦,就是打印出一個query的SQL語句:

一個Demo,理解註解在業務中充當的角色

劇終

實話實說,這樣寫沒什麼卵用。但是我們可以通過這個小demo管中窺豹,舉一反三。比如可以在庫中寫一個工具類,直接調用這個工具類,傳遞所需的參數,返回最終拼接的sql語句,這樣就能夠做到不會需要考慮SQL語句拼不拼錯了,除非你自己寫錯,否則不會出現任何的語句錯誤。


分享到:


相關文章: