今天來介紹一個反射的應用
若有用過Hibernate的人應該會知道
@PrePersist @PreUpdate這兩個註解
可以方便的做到
新增跟修改前處理一些事情
但是這兩個註解有一個限制
就是必須用在一個類上
並不能做細粒度的劃分與復用
例如:在@Embedded的物件中就無法用
以下為解決的方法

第一
新增一個@Embeddable的Entity


第二
就要使用@EntityListener
並了解傾聽器如何使用
它可以偵測@PrePersist @PreUpdate這類註解
並將Entity當作物件參數傳入


最後
利用反射機制
這邊舉一個可以隨時紀錄新增時間及修改時間的方法
以下新增時間的程式碼片段

  Field f = obj.getClass().getDeclaredField("record");
  Method recordMethod = f.getType().getDeclaredMethod("setCreatedTime", Date.class);
  Object record = f.getType().newInstance();
  recordMethod.invoke(record, new Date());
  Method method = obj.getClass().getDeclaredMethod("setRecord", Record.class);
  method.invoke(obj, record);

第一行:
是先獲取可嵌入的entity Field
第二行:
在根據這個Field拿到
裡面setCreatedTime的方法
第三行:
將此Field實例化
第四行:
invoke這個實例化的方法
將先在的時間寫入
第五、六行:
使用setRecord方法
將record寫入原始物件中

至於修改時間傾聽器
要多注意Entity物件有第二層
所以需要判斷一下是否為空值
當然以上操作可利用
Apache所提供的工具BeanUtils來完成


小結一下
概念大概是如下
先利用@Embeddable
再利用@EntityListener
來設計一個可以嵌入的Entity
並利用傾聽器來呼叫 Entity生命週期上定義的註解方法
如此,就可以解決細粒度劃分
接下來是要解決復用的問題
這很好解決
就是利用反射機制來處理
往後要用到時只需要把這個嵌入的Entity嵌入即可摟
以上程式碼也放置gitHub上有需要的人可以參考一下:)