黑馬程式設計師Java培訓和Android培訓_java高新技術(一)

chen_chg發表於2011-07-26

反射技術:

        反射就是把java類中的各種成分對映成相應的java類。比如類中的屬性,方法,包名,建構函式。都回獨立成一個個相應的物件。主用應用於框架開發。 

        反射技術的基礎Class類,獲得位元組碼的方式有三種:1. Class cls = 類名.class;2. Class cls2 = Class.forName(“類名”);3. Class cls3 = new 類名().getClass();對於每一個型別都有他的Class例項物件,可以通過isPrimivitre(是否是原始型別)和isArray判斷是什麼型別。對於一個裝箱類可以通過 類名.TYPE 獲得它的基本資料型別.

        構造方法反射的應用,獲得所有建構函式:Constructor cons[] = Class.forName(“java.lang.String”).getConstructors();獲得一個建構函式並例項一個物件(反射):Constructor constructor = Class.forName(“java.lang.String”).getConstructors(StringBuffer.class); String str = (String)constructor.newInstance(new StringBuffer(“abc”));使用預設建構函式例項一個物件可簡寫為:String str = String.class.newInstance()。

        類成員變數反射的應用,對公有的成員變數:Field field = 物件名.getClass().getFiled(“欄位名”);欄位的值 = field.get(物件名);對私有的成員變數:Field field = 物件名.getClass().getDeclaredFiled(“欄位名”);field.setAccessible(true);欄位的值 = field.get(物件名);filed是一個類變數,不是物件變數。

        類成員方法反射的應用,獲得方法:Method 方法名 = 類名.calss.getMethod(“方法名”,引數型別);例:Method mothodchatAt = String.class.getMethod(”chatAt”,int.class);呼叫方法:方法名.invoke(呼叫方法的物件,引數);例:String str = mothodchatAt.invoke(new String(“abc”),1);如果呼叫方法的物件為null說明這個方法為靜態方法。

package com.itcast.d23;

import java.lang.reflect.Method; 

public class ReflectMethod {   

    public static void main(String[] args) throws Exception {

       String startingClassName = "com.itcast.d23.TestReflect";

       Method mainMethod = Class.forName(startingClassName).getMethod("test", String.class);

       TestReflect tr = new TestReflect();

       mainMethod.invoke(tr, "haha");

    }

}

 

class TestReflect{

    public void test(String str){

       System.out.println(str);

    }

}

 

        陣列與Object的關係及其反射型別,陣列的位元組碼因維數和陣列的型別改變。Arrays工具類的asList方法可以把陣列轉成List輸出list列印所有元素。基本資料型別陣列除外,因為asList的傳入引數是Object陣列,基本資料型別不屬於Object。

 

       陣列反射的應用,使用isArray判是否是一個陣列,java.lang.reflect.Array是陣列的反射類,array.getLength(陣列物件)獲得陣列的長度,array.get(陣列物件,索引)獲得指定索引的值。

 

       ArrayList、HashSet的比較和HashCode的分析,ArrayList是有序的,HashSet是無序的,HashSet通過HashCode算出物件的雜湊碼,通過雜湊碼能夠快速的查詢到一個物件。儲存到HashSet中的物件不能在HashSet中修改,否則可能會照成記憶體洩漏,因為物件修改了,HashCode算出來的雜湊碼可能與修改前的不相同了。

 

       javaBean是一種特殊的java類,主要用於傳遞資訊。

 

javaBean內省的操作:

PersonBean pb = new PersonBean("cc",22);

String propertyName = "name";

PropertyDescriptor pd = new PropertyDescriptor(propertyName, pb.getClass());

       // 獲得寫方法

    Method methodSetName =  pd.getWriteMethod();

methodSetName.invoke(pb,value);

Method methodGetName =  pd.getReadMethod();

Object retVal = methodGetName.invoke(pb);

使用BeanUtils工具包: (前提是匯入了BeanUtils相關的包)

PersonBean pb = new PersonBean("cc",22);

// 可以是一個級聯的變數

String propertyName = "name";

// 以字串的方式處理引數

       //retVal = BeanUtils.getProperty(pb, propertyName);

       // 以原型別處理引數

retVal = PropertyUtils.getProperty(pb, propertyName);  

相關文章