通過反射獲取屬性名和屬性類型


提出問題:

還是泛型dao中遇到的問題,以往我們要查詢數據庫中表中的數據的時候,需要每張表都會寫一個dao操作數據庫,現在的需求是只寫一個dao,這是個萬能的dao,適用於所有的表,進行增刪改查都可用。顯然我們事先不知道要查哪個表,泛型dao的基本要求就是對所有的表都適用,這就需要我們動態的獲取表名,基本思想可以是方法中傳入一個類(前提是數據庫中的表和實體類都是一一對應的)的實例,通過反射獲取這個實體類中的屬性名和屬性類型,這就用到了java中反射這個特性。

反射是java中一個很重要的特性,在不知道類中信息的時候,利用反射我們可以獲取到類中所有的信息,例如屬性名,屬性類型,方法名,還可以執行類中的方法,很強大的,在框架中大多數也是采用反射獲取類中的信息。以前的知識只是知道反射可以破壞單例(因為反射可以獲取到類中的所有信息,構造方法也不例外),但是現實中沒有哪個程序員寫完了單例模式,在用反射來破壞單例吧……
在說反射前先說一個在反射中很重要的類Class,對這個類的理解:是所有類的類(聽到這句話很難理解),可能很難理解,所有的類在這個Class類前都可以看作是Class的實例,包括Object類,在Class面前的類都是他的對象。對這個理解了,那么下面的反射就可以很容易的想通了。

實例:

下面簡單的介紹使用的方法,方法很簡單,都是已經封裝好的方法,直接調用即可

一個實體類:(貼張截圖)都是私有的屬性


獲得屬性信息的方法:

 public static void getField(Object object) {
        //獲得類
        Class clazz = object.getClass();
        // 獲取實體類的所有屬性信息,返回Field數組
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
測試輸出:

private int com_domain.Users.id
private java.lang.String com_domain.Users.name
private java.lang.String com_domain.Users.password
private int com_domain.Users.aid
關於屬性的信息都被獲取到了,包括權限修飾符,屬性類型,屬性名,這里的String是java.lang.String,屬性名和屬性類型后面可以利用字符串截取獲得實際想要的數據。


也可以直接獲取到屬性的類型,在Fileld類中有一個getGenericType方法:
在前面的for循環中加入下面這句話:

String type = field.getGenericType().toString();
輸出的是:

int
class java.lang.String
class java.lang.String
int

獨立獲取屬性名:

String name = field.getName();
輸出:

id
name
password
aid


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM