Class对象和反射
1.class對象
在java中一切都是對象,從某種意義上,java中的對象可以分為:實例對象和Class對象。實例對象通過new關(guān)鍵得到,那么Class對象呢?Class對象無法通過new關(guān)鍵字獲取,在類加載的過程中,JVM生成一個與加載的字節(jié)碼文件相關(guān)的class對象。通過類名可以獲取對應(yīng)Class對象。class對象主要用來對應(yīng)類的所有對象。java程序在運行之前并未完全加載,各個類只在需要的時候才將該類加載進(jìn)內(nèi)存,生成對應(yīng)的class對象。
所有的類都是在對其第一次使用的時候,動態(tài)加載到JVM中,當(dāng)程序創(chuàng)建第一個對類靜態(tài)成員的引用的時候,就會加載這個。使用new創(chuàng)建類的對象的也會被當(dāng)做是對類靜態(tài)成員的引用。因此java程序在它開始運行之前并非被完全加載,其各個部分是在必須的時候才加載。一旦某個類的Class對象被載入內(nèi)存,它就用來創(chuàng)建這個類的所有的對象。如下面程序所示:
1 class Test1{ 2 static{ 3 System.out.println("loading1"); 4 } 5 6 } 7 class Test2{ 8 static{ 9 System.out.println("loading2"); 10 } 11 12 } 13 class Test3{ 14 static{ 15 System.out.println("loading3"); 16 } 17 18 } 19 public class Demo { 20 public static void main(String[] args) { 21 //new Test1(); 22 Class clz = Test1.class;//注意Class clz = Test1.class;,不會觸發(fā)靜態(tài)塊的執(zhí)行,即不會自動初始化該Class對象 23 try { 24 25 Class.forName("Test2"); 26 } catch (ClassNotFoundException e) { 27 e.printStackTrace(); 28 } 29 new Test3(); 30 } 31 32 }輸出結(jié)果:
loading1 loading2 loading32.Class對象的獲取
Class對象是jvm用來保存對象實例對象的相關(guān)信息的,除此之外,我們完全可以把Class對象看成一般的實例對象,事實上所有的Class對象都是類Class的實例。獲取Class對象主要有三種方式:
1 /** 2 * 獲取Class對象的三種方式 3 */ 4 public class Demo{ 5 public static void main(String[] args){ 6 //1.通過實例對象獲取class對象 7 Demo demo = new Demo(); 8 Class clsdemo = demo.getClass(); 9 10 //2.通過Class的靜態(tài)方法forName 11 try { 12 Class clsdemo2 = Class.forName("Demo"); 13 } catch (ClassNotFoundException e) { 14 e.printStackTrace(); 15 } 16 17 //3.通過類名和class關(guān)鍵字獲取 18 Class clsdemo3 = Demo.class; 19 } 20 }3.Class對象的使用和反射
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。通過反射機制來訪問一個類java對象的屬性,方法,甚至我們可以輕易改變一個私有成員。java反射是基于Class類和java.lang.Reflect類庫。反射機制使得我們可以創(chuàng)建一個編譯時完全未知的對象,并調(diào)用這個對象的方法。
?4.泛化的Class引用
Class引用總是指向某個Class對象,它可以制造實例,并包含可以作用于這些實例的所有方法代碼,且包含該類的靜態(tài)成員,因此Class引用表示的就是它指向的對象的確切類型,而該對象便是Class類的一個對象。class引用可泛化。通過泛型語法,可以讓編譯器強制的執(zhí)行額外的類型檢查。如果希望放松些限制,可以使用通配符?,表示“任何事物”,如Class<?> intClass = int.class;在java SE5中,Class<?>優(yōu)于平凡的Class.如下:
public class Demo {public static void main(String[] args) {Class intClass = int.class;Class<Integer> integerClass = int.class;integerClass = Integer.class;Class<?> integerClz = Integer.class; } }
?
轉(zhuǎn)載于:https://www.cnblogs.com/liupiao/p/9259398.html
總結(jié)
以上是生活随笔為你收集整理的Class对象和反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试模型以及测试方法
- 下一篇: 巧妙使用网页在线工具,让您的工作更简单