反射
一、什么是反射機制
反射是指程序可以訪問、檢測和修改它本身的狀態或行為的一種能力。
二、哪里用到反射機制
有些時候,我們用過一些知識,但是並不知道它的專業術語是什么,在剛剛學jdbc時用過一行代碼,Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那時候只知道那行代碼是生成驅動對象實例,並不知道它的具體含義。看過反射后才知道,原來這就是反射,現在很多開源框架都用到反射機制,hibernate、struts都是用反射機制實現的。
三、反射機制的優點與缺點
為什么要用反射機制?直接創建對象不就可以了嗎,這就涉及到了動態與靜態的概念,靜態編譯:在編譯時確定類型,綁定對象,即通過。動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類之間的藕合性。一句話,反射機制的優點就是可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中它的靈活性就表現的十分明顯。比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯后,發布了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態的話,需要把整個程序重新編譯一次才可以實現功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。它的缺點是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作。
四、利用反射機制能獲得什么信息
一句話,類中有什么信息,它就可以獲得什么信息,不過前提是得知道類的名字,要不就沒有后文了
首先得根據傳入的類的全名來創建Class對象。Class c=Class.forName("className");注明:className必須為全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo; Object obj=c.newInstance();//創建對象的實例 OK,有了對象就什么都好辦了,想要什么信息就有什么信息了。
獲得構造函數的方法
Constructor getConstructor(Class[] params)//根據指定參數獲得public構造器
Constructor[] getConstructors()//獲得public的所有構造器
Constructor getDeclaredConstructor(Class[] params)//根據指定參數獲得public和非public的構造器
Constructor[] getDeclaredConstructors()//獲得public的所有構造器
獲得類方法的方法
Method getMethod(String name, Class[] params),根據方法名,參數類型獲得方法
Method[] getMethods()//獲得所有的public方法
Method getDeclaredMethod(String name, Class[] params)//根據方法名和參數類型,獲得public和非public的方法
Method[] getDeclaredMethods()//獲得所以的public和非public方法
獲得類中屬性的方法
Field getField(String name)//根據變量名得到相應的public變量
Field[] getFields()//獲得類中所以public的方法
Field getDeclaredField(String name)//根據方法名獲得public和非public變量
Field[] getDeclaredFields()//獲得類中所有的public和非public方法
常用的就這些,知道這些,其他的都好辦……
五、用反射機制能干什么事
剛開始在使用jdbc時侯,在編寫訪問數據庫時寫到想吐,有八個表,每個表都有增刪改查中操作,那時候還不知道有反射機制這個概念,所以就對不同的表創建不同的dao類,這樣不僅開發速率慢,而且代碼冗余的厲害,最要命的是看着差不多的,然后直接復制修改,由於容易犯各種低級的錯誤(大小寫啊,多一個或少一個字母啊……),一個錯誤就可以讓你找半天。有了java反射機制,什么都好辦了,只需要寫一個dao類,四個方法,增刪改查,傳入不同的對象,就OK啦,無需為每一個表都創建dao類,反射機制會自動幫我們完成剩下的事情,這就是它的好處。說白了,反射機制就是專門幫我們做那些重復的有規則的事情,所以現在很多的自動生成代碼的軟件就是運用反射機制來完成的,只要你按照規則輸入相關的參數,所以低級的程序員慢慢的就被抹殺了,為什么?因為代碼都不用寫了,隨便一個人都會開發,還要程序員干什么啊?所以我們只有一條出路,那就是努力努力再努力,成為高級程序員,專門開發傻瓜軟件,讓其他程序員 到一邊涼快去~
序列化
首先要明確序列化的目的:
1.無論何種類型的數據,都是以二進制的形式在網絡上傳送,為了由一個進程把Java對象發送給另一個進程,需要把其轉換為字節序列才能在網絡上傳送,把Java對象轉換為字節序列的過程就稱為對象的序列化,將字節序列恢復成Java對象的過程稱為對象的反序列化,(然后java.io.ObjectOutPutStream的writeObject(Object obj)的方法就可以 將參數指定的對象進行序列化 並且把得到的字節流寫到一個目標輸出流上去)
2.只有實現了 serializable和Externalizable接口的類的對象才能被序列化,后者是前者的子類,實現這個借口的類完全由自身來控制序列化的行為,而僅僅實現前者的類可以采用默認的序列化方式。實現這兩個接口 標志着對象可以被序列化了。
簡而言之:序列化的作用就是為了不同jvm之間共享實例對象的一種解決方案.由java提供此機制,效率之高,是其他解決方案無法比擬的.