軟件實習生對於Java反射的學習體會**
本菜鳥是一名準大四學生,於某知名日企也已進行了半年的實習,最近剛剛結束一個web項目,也因爲即將過年所以有了一段閒暇時間去學習。在項目中一直不知道那些看着跟接口一樣的註解打在字段上面爲什麼就會起到各種作用,進行了初步的學習,現在因爲疫情的原因有時間去整理一下零碎的知識,於是有了這篇筆記,如果有人能看到錯誤,也請指正一下,我一定虛心學習,哈哈,也祝大家新年快樂,武漢加油!
對於反射的專業概念闡述我就不粘貼了哈,直接寫體會。
爲什麼要在字段上用註解呢?
這是讓我想去研究反射的緣由,在對於註冊頁面的Form表單所對應的.java文件中,一個字段上可能會有一個甚至多個註解(非空、位數限制等等),就拿註冊表單上的用戶名userName來說,這個字段要求不可爲空,而且應該字數處於6-12位長,代碼往往是這樣的:
/**
* 註冊表單
*
* @author 羅璽
*/
public class RegistForm {
/**
* 用戶名
*/
@MyNotEmpty
@MySize(min=6,max=12)
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
到這裏可以說,爲什麼用註解? 像我這種實習生,又菜又愛亂寫,一個非空我會想在前臺加JS並且在後臺對這些字段值也做一次值的判斷,這樣的話會導致我的代碼提上去之後跟其他有代碼規範的大佬們顯得格格不入,到底能不能限制住這個字段也需要另外去測試,所以乾脆弄成註解,我們菜鳥只管@就完事,對錯都是寫註解實現類的人負責,這樣管理者又省事又放心對吧? 但是,我雖爲實習生,也有一顆想讓大家用我代碼的心,所以。。。
我們自己利用反射實現這個MySize(min=,max=12)註解!
首先,先創建這個註解
public @interface MyNotEmpty {
//最小值
int min();
//最大值
int max();
}
加上之後我們的form小demo就成了這樣
public class RegistForm {
/**
* 用戶名
*/
@MyNotEmpty(min=6,max=12)
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
怎麼樣,到這兒看起來是不是跟咱們平時給自己表單打註解看起來一模一樣啦?
但是,只到這就能讓你的註解起到檢查字段的目的了嗎?拿腳想都知道得有實現類呀! 那麼開始吧
現在來創建一個實現類
public class Demo {
public static void main(String[] args) throws Exception{
//傳進表單
RegistForm registForm = new RegistForm();
//表單已被用戶輸入了 123456 點了提交
registForm.setUserName("123456");
//反射不管三七二十一 先搞他字節碼
Class formClass = RegistForm.class;
//獲得字段
Field field = formClass.getDeclaredField("userName");
//設置字段可讀
field.setAccessible(true);
//獲取該字段上的註解
MySize mySize = field.getDeclaredAnnotation(MySize.class);
System.out.println(mySize);
}
}
打印一下控制檯:
@Regist.MySize(min=6, max=12)
到這兒也就知道了可能框架就是這樣得到的限制條件,當然這個例子就是個意思,是我自己這麼單純認爲的哈哈,繼續實現吧:
//繼續實現 獲取值 這裏需將表單對象傳進來,以此獲取userName的值
System.out.println((String)field.get(registForm));
現在打印就能得到兩個主角:
@Regist.MySize(min=6, max=12)
123456
有了這個字段的值,有了註解傳來的兩個條件,現在只需要在接下來的代碼裏做判斷就好啦,這裏將用戶名賦值123,輸出錯誤:
public class Demo {
public static void main(String[] args) throws Exception{
//傳進表單
RegistForm registForm = new RegistForm();
//表單已被用戶輸入了 123456 點了提交
registForm.setUserName("123");
//反射不管三七二十一 先搞他字節碼
Class formClass = RegistForm.class;
//獲得字段
Field field = formClass.getDeclaredField("userName");
//設置字段可讀
field.setAccessible(true);
//獲取該字段上的註解
MySize mySize = field.getDeclaredAnnotation(MySize.class);
//繼續實現 獲取值 這裏需將表單對象傳進來,以此獲取userName的值
String userName = (String)field.get(registForm);
if(userName.length() < mySize.min() || userName.length() > mySize.max()){
System.out.println("返回報錯信息! {用戶名應該大於"+mySize.min()+"位,小於"+mySize.max()+"位}");
}else{
System.out.println("輸入合法!");
}
}
}
控制檯:
返回報錯信息! {用戶名應該大於6位,小於12位}
總結
自己的一些體會,寫的不好,但是總算能將自己的理解描述出來,希望各位看客能多提錯誤,也希望自己以後可以將學習的體會都手打一遍發到博客上,這樣也有利於自己的理解,有錯誤的話也可以被大家批評,謝謝大家!