1. 程式人生 > >黑馬程式設計師---java基礎加強 反射的深入理解

黑馬程式設計師---java基礎加強 反射的深入理解

=================第5單元:反射的深入講解===============
17.透徹分析反射的基礎_Class類
	反射的基礎:
		Class也就是每個java源程式通過編譯後生成的檔案載入進入記憶體的那個位元組碼檔案,
		獲取到該位元組碼,就可以獲取到該Class上的所有資訊

	獲取Class的三種方式:
		String str1 = "abc";
		1.Class<? extends String> cls1 = str1.getClass();//由物件獲取位元組碼
		2.Class<String> cls2 = String.class;//由類名獲取位元組碼
		3.Class<?> cls3 = Class.forName("java.lang.String");//反射常用該方式獲取,可以通過外部傳的引數獲取
	
18.理解反射的概念
19.構造方法的反射應用
	獲取String str = new String(new StringBuffer("abc"));的建構函式
	Constructor<String> constructor1 = String.class
				.getConstructor(StringBuffer.class);
	// 給該構造器物件例項化,也就是傳的引數
	String str2 = constructor1.newInstance(/* "abc" */new StringBuffer(
				"abc"));

20.成員變數的反射
	ReflectPoint pt1 = new ReflectPoint(3, 5);//ReflectPoint類表示一個點
		Field fieldY = pt1.getClass().getField("y");// 得到類中的y(public)欄位
		System.out.println(fieldY.get(pt1));//獲取pt1物件上的y欄位對應的值 5

		Field fieldX = pt1.getClass().getDeclaredField("x");// 得到類中的x(private)欄位
		fieldX.setAccessible(true);// 重新設定該欄位的訪問許可權,也稱為暴力訪問
		System.out.println(fieldX.get(pt1));//即使是private修飾的欄位,通過暴力訪問還是可以訪問到的

21.成員變數反射的綜合案例
	通過反射的方式替換成員變數對應的值
	private static void changeStringValue(Object obj) throws Exception {
		Field[] fields = obj.getClass().getFields();//獲取obj類中的所有欄位
		for (Field field : fields) {
			//是字串型別的欄位進行處理,也就是替換字串的內容
			if (field.getType() == String.class) {
				String oldValue = (String) field.get(obj);
				String newValue = oldValue.replace('b', 'a');
				field.set(obj, newValue);
			}
		}

	}
22.成員方法的反射
	Method methodCharAt = String.class.getMethod("charAt", int.class);//獲取String類中的"charAt方法",引數型別為int
		// String str1 = "abc";
		System.out.println("methoodCharAt:"+methodCharAt.invoke(str1,1));//等價於 str1.charAt(1);
		System.out.println(methodCharAt.invoke(str1, new Object[] { 2 }));
23.對接收陣列引數的成員方法進行反射

	/*	
	通過該函式呼叫其它的函式的main方法
	並向呼叫的main方法中新增引數,打印出新增的引數
	*/
	public static void main(String[] args) {
		String startingClassName = "cn.itcast.day1.TestArguments";//TestArguments類名
		Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class);//獲取函式名為main,引數為String[]的函式
		//該引數必須作為一個整體的引數傳人
		// mainMethod.invoke(null, new Object[]{new
		// String[]{"111","222","333"}});
		mainMethod.invoke(null, (Object) new String[] { "111", "222", "333" });//呼叫的是TestArguments類中的main方法
	}
class TestArguments {
	public static void main(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
		}
	}
}

24.陣列與Object的關係及其反射型別
		int[] a1 = new int[] { 1, 2, 3 };
		int[] a2 = new int[4];
		int[][] a3 = new int[2][3];
		String[] a4 = new String[] { "a", "b", "c" };
		 System.out.println(a1.getClass() == a2.getClass());//true
		 //錯誤原因:
		 //每個陣列屬於被對映為 Class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件
//		 System.out.println(a1.getClass() == a4.getClass());//error
//		 System.out.println(a1.getClass() == a3.getClass());//error
		 System.out.println(a1.getClass().getName());//[I
		 System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object
		 System.out.println(a3.getClass().getSuperclass().getName());//java.lang.Object
		 System.out.println(a4.getClass().getSuperclass().getName());//java.lang.Object

		//只要父類的型別是Object的就可以給Object賦值
		Object aObj1 = a1;
		Object aObj2 = a4;
		//錯誤原因:
		//a1 的陣列中的存放的是基本資料型別,不屬於Object型別,故不能用Object的陣列存放
		// Object[] aObj3 = a1;//error
		Object[] aObj4 = a3;
		Object[] aObj5 = a4;
	
25.陣列的反射應用
//運用反射列印陣列中的資料
	private static void printObject(Object obj) {
		Class<? extends Object> clazz = obj.getClass();
		if (clazz.isArray()) {
			int len = Array.getLength(obj);
			for (int i = 0; i < len; i++) {
				System.out.println(Array.get(obj, i));
			}
		} else {
			System.out.println(obj);
		}

	}

26.ArrayList_HashSet的比較及Hashcode分析
	ArrayList是實現了List介面的一個子類,List介面中的元素列表特點:
		更確切地講,列表通常允許滿足 e1.equals(e2) 的元素對 e1 和 e2,並且如果列表本身允許 null 元素的話,通常它們允許多個 null 元素
	所有ArrayList 是按照存入順序有序儲存的所以可以存入相同的元素

	HashSet 是實現Set介面的一個子類,Set介面中的元素特點:
		set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素
		HashSet具備了Set集合中的特點,而且它還具備自己的特點:
			存入該集合的元素會被通過計算元素的雜湊值的不同而存入不同的雜湊表區間,所有存入的元素只要雜湊值不同,就會被儲存進入該集合
			所以通常儲存該集合的元素都要去覆蓋hashCode與equals方法;
				如果元素的HashCode值相同,才會判斷equals是否為true。
				如果元素的hashcode值不同,不會呼叫equals。
			注意:參與hashCode運算的元素存入集合時通常不用改變不要改變它的值,這樣會引起記憶體洩漏.
			注意,對於判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法

27.框架的概念及用反射技術開發框架的原理
	public static void main(String[] args) {
		//通過本類把配置資訊讀入流中
		InputStream ips = ReflectTest2.class
				.getResourceAsStream("/cn/itcast/day1/resources/config.properties");

		Properties props = new Properties();
		props.load(ips);
		ips.close();
		String className = props.getProperty("className");//獲取配置資訊中的className對應的類名
		Collection collections = (Collection) Class.forName(className)
				.newInstance();//動態的建立Collection物件,而且必須是有空引數的構造方法的才可以
	}


28.用類載入器的方式管理資源和配置檔案
29.由內省引出JavaBean的講解
	IntroSpector---->JavaBean--->特殊的java類,
	就是符合JavaBean規範的類

30.對JavaBean的簡單內省操作
//通過傳入要操作javabean中的類的物件與屬性名
//就可以得到該欄位的值
	private static Object getProperty(Object pt1, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		
		 //使用的是Javabean中提供的方法 
		 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); 
		 Method methodGetX = pd.getReadMethod(); 
		 Object retVal = methodGetX.invoke(pt1);
		 
		return retVal;
	}
	

31.對JavaBean的複雜內省操作
//通過傳入要操作javabean中的類的物件與屬性名,設定該欄位的值
	private static void setProperties(Object pt1, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,
				pt1.getClass());
		Method methodSetX = pd2.getWriteMethod();
		methodSetX.invoke(pt1, value);
	}


32.使用BeanUtils工具包操作JavaBean
	//Apache提供的對JavaBean操作的類
		//設定pt1物件(欄位)為x的值為9
		BeanUtils.setProperty(pt1, "x", "9");
		BeanUtils.getProperty(pt1, "x");


相關推薦

黑馬程式設計師-java基礎加強-反射深入講解

-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!-------------------------- 透徹分析反射的基礎_Class類 Class類1、定義java程式中的各個java類也屬於同一類事物,而描述這

黑馬程式設計師---java基礎加強 反射深入理解

=================第5單元:反射的深入講解=============== 17.透徹分析反射的基礎_Class類 反射的基礎: Class也就是每個java源程式通過編譯後生成的檔案載入進入記憶體的那個位元組碼檔案, 獲取到該位元組碼,就可以獲取

黑馬程式設計師----Java基礎反射

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師java基礎加強—內省、註解、泛型

---------------------- android培訓、java培訓、期待與您交流! -------------------- 內省:IntroSpector——》JavaBean——特殊的Java類 當Java執行時可檢查自身,Java 程式中詢問它的一個物

黑馬程式設計師---java基礎加強---jdk1.5新特性之註解

----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ----------- 註解(Annotation ) 是JDK 1.5 的新特性,現已應用於Spring , EJB ,JPA... 使用註解是一種趨勢。它可以用於建立

黑馬程式設計師----Java基礎之GUI

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之IO包中其它類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎基礎之IO流

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之集合類(一)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之String類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之多執行緒

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(最終篇)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多型)(二)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多型)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----java基礎之面向物件

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師——Java基礎之函式與陣列

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師--Java基礎面試題整理

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j

黑馬程式設計師——java基礎之string及集合

<span style="font-family:SimSun;font-size:18px;">class TreeSetDemo { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.

黑馬程式設計師——Java基礎---IO流(字元流、位元組流、轉換流、流操作規律)

三、字元編碼 字元編碼通過轉換流來完成。在兩個物件進行構造的時候,可以加入字符集(即編碼表),可傳入編碼表的有: 轉換流:InuputStreamReader和OutputStreamWriter。列印流:PrintStream和PrintWriter,只有輸出流。轉換流的編碼應用 可以將字元以指定編

黑馬程式設計師_java基礎加強學習筆記之註解

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j