黑馬程序員_反射技術

---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------


1、反射機制:對一個類進行動態的獲取並創建對象,並調用該類中的內容。

2、應用程序
        1.在不明白日後出現什麼樣的實現類時,可以擴展出去,對外提供配置文件,讓後期的實現類都定義在配置文件中。

        2.該程序中會讀取配置文件並根據指定的名字找尋具體對應的類。

        3.對找到的類進行對象的建立。

        4.並調用該類對象的成員。

        是不是在動態的獲取指定的類,是!
        是不是在調用類中的成員。
        這就是反射技術。
        
3、用於描述字節碼文件的類名稱就是Class

4、只要獲取到字節碼文件對象。就可以獲取該字節碼中所有的內容
        這就是動態的獲取類中的內容,並使用

        如何獲取到字節碼文件對象呢?

5、反射機制:對一個類進行動態的獲取並創建對象,並調用該類中的內容。

        獲取字節碼文件對象的方式。

        方式一:對象調用   使用Object類中的getclass方法。
            該方式必須先創建未知類的對象,再調用getclass方法。

	public static void getClassDemo1() {
		Person p1 = new Person();
		Person p2 = new Person();

		Class clazz1 = p1.getClass();
		Class clazz2 = p2.getClass();

		System.out.println(clazz1 == clazz2);
	}
------------------------------------------------------------------------
       

        方式二:類名調用  使用靜態的class屬性就可以獲取
            Class clazz=Person.class;

            該方式還是需要使用未知的類。
------------------------------------------------------------------------

        方式三:通過Class類中的靜態方法forName(className)完成;
            爽!只要通過類名就可以獲取到對應的字節碼文件對象。這種方式的擴展性是最好的。

        forName:1.根據傳入的類的名稱,自動去classPath路徑下去尋找與該類名稱相同的類文件。
                        2.通過加載器將該類進行加載,並在內存中生成該類的字節碼文件對象。

	/**
	 * 方式三:
	 * @throws ClassNotFoundException
	 */
	public static void getClassDemo3() throws ClassNotFoundException {

		String className = "cn.itcast.bean.Person";// 注意名稱是全名

		Class clazz = Class.forName(className);// 放射機制的基本核心

		System.out.println(clazz);
	}

6、 字段的獲取設置
        AccessibleObject 取消權限檢查
	public static void getFieldDemo() throws ClassNotFoundException,
			NoSuchFieldException, SecurityException, InstantiationException,
			IllegalAccessException {
		String className = "cn.itcast.bean.Person";
		/*
		 * 獲取指定類中的指定名稱的字段 思路: 1.通過類名獲取字節碼文件對象 2.通過字節碼文件對象獲取其中的成員字段。
		 */
		// 1.獲取字節碼文件對象
		Class clazz = Class.forName(className);

		// 2.通過Class對象的方法獲取字段。
		// Field field = clazz.getField("age");// 只能獲取公共的字段
		Field field = clazz.getDeclaredField("age");

		Object obj = clazz.newInstance();

		// 取消權限檢查
		field.setAccessible(true);// 暴力訪問,不建議此方法訪問

		// 對字段進行值得設置,需要使用字段對象來完成
		field.set(obj, 30);

		System.out.println(field.get(obj));
		System.out.println(field);
	}

7、 獲取構造器
	public static void getConstructorDemo() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		String className="cn.itcast.bean.Person";
		Class clazz=Class.forName(className);
		//之前通過newInstance進行指定類的實例化。但是該類中如果沒有空參數構造函數呢?
		//或者想通過指定的構造函數進行該類對象實例化呢?
		/*
		 * 1.必須先要獲取指定的構造函數。
		 * 2.通過獲取到的構造函數對對象進行初始化。
		 */
		//1.獲取構造器對象
		Constructor constructor=clazz.getConstructor(String.class,int.class);
		
		//2.如何初始化,構造器最清楚
		Object obj=constructor.newInstance("lisi",20);
	}

8、 獲取方法。獲取公有,空參數的方法;
	public static void getMethodDemo() throws Exception {
		String className = "cn.itcast.bean.Person";
		Class clazz = Class.forName(className);
		
		//獲取指定類中的指定的方法
		Method method =clazz.getMethod("show", null);
		
		//獲取指定的對象
		Object obj=clazz.newInstance();
		
		//調用方法對象的invoke方法。
		method.invoke(obj, null);
	}

---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------
詳細請查看:www.itheima.com

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