Test3_透徹分析java反射機制的基礎概念

1.Java類用於描述一類事物的共性,描述這類事物該有什麼屬性,不該有什麼屬性,
但是一個具體的對象具體的屬性值是什麼,不管,只管你該不該有這個屬性,
而不管該屬性的值是什麼,這就是Java類的作用;
---------------------------------------------------------------
2.Java中的各個類,也是一種事物,他們屬於同一類事物,都是Java中的類,我們當然
可以用一個類來描述這類事物,這個類的就是Class;


人-->Person
Java類-->Class
---------------------------------------------------------------
3. //什麼是字節碼呢?
-->當我們在程序中用到了Person這個類的時候,首先要從硬盤上把這個
類的二進制碼(編譯過的.Class文件)加載到內存中來,纔可以去創建
一個個對象,源程序中有幾個類,內存中就有幾份字節碼,每一份字節碼
就是一個Class類的實例對象。
Person p1 = new Person();
 Person p2 = new Person();


//p1就是內存中的 Person類對應的字節碼生成的對象
Date 類 
	Class cls1= Date.class //Class的實例對象代表內存中的一份字節碼;
					//Date.class就表示Date類在內存中的字節碼
	Class cls2= Person.class//同上;
	p1.getClass();//-->Object類中的方法
	Class.forName("java.lang.String");//Class的靜態方法


-->Class.forName("*.*.*");方法的作用?
作用是返回所加載的類的字節碼,如果這個類已經被加載進來了(java虛擬機中有該字節碼),
則直接從緩存中調用並返回;
如果該類沒有被加載過(java虛擬機中沒有該字節碼),則調用類加載器加載進來以後,把那份字節碼緩存起來
同時返回該字節碼
---------------------------------------------------------------
4.得到字節碼的方式有三種(上題):
·· 類名.class 
·· 對象.getClass();
·· Class.forName("包名.類名"); 做反射的時候常用第三種,通常在寫源程序的時候
還不知道類的名字,可以把"包名.類名"換成一個
字符串變量,在程序運行的時候臨時賦值
---------------------------------------------------------------
5.舉例:
	public class RefilectTest	{
		public static void main(String[] args)throws Exception{
			String str1 = "abc",
			Class cls1 = str1.getClass();
			Class cls2 = String.class;
			Class cls3 = Class.forName("java.long.String");
			System.out.println(cls1 ==cls2); //true
			System.out.println(cls2 ==cls3); //true
		}
	}


---------------------------------------------------------------
6.public boolean isPrimitive()
判定指定的 Class 對象是否表示一個基本類型。 
有九種預定義的 Class 對象,表示八個基本類型和 void。
這些類對象由 Java 虛擬機創建,與其表示的基本類型同名,
即 boolean、byte、char、short、int、long、float 和 double。 


這些對象僅能通過下列聲明爲 public static final 的變量訪問,
也是使此方法返回 true 的僅有的幾個 Class 對象。 


	int.class.isprimitive();//true
	int[].class.isPrimitive();//false  數組類型的Class實例對象


---------------------------------------------------------------
7.總之,只要是在源程序中出現的類型,都有各自的Class實例對象,
例如:int[],void ...
---------------------------------------------------------------
8.得到一個Class對象,可以通過 Class.isArray(),Class.isPrimitive()
來知道它到底是什麼類型

---------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章