轉:
class反射(一),以及Method 的 getReadMethod 與 getWriteMethod 使用
class
Java在識別類信息與加載它時,通常有兩種方式來對類信息進行操作:
- RTTI,類在編譯時期就已經知道類的信息,我們調用時直接進行了new 對象;
- 反射機制,這一種是在程序運行時進行了類加載,而前提是我們在編譯時期沒有進行加載
每一個類都會對應存在的class對象,也就是存在於.class文件,在我們的一次使用的時候,jvm就回調用它;
而static初始化,會在類加載時進行
我們在進行引用時,類加載器首先會檢查一下這個class對象是否被加載過,如果沒有被加載,就回根據這個類名進行查找相對應的class文件,加載文件,然后進行對其方法的引用。
我們在進行獲取引用時,我們可以進行使用Class.forName("),進行對這個類的加載,也可以用(類名).class對這個類進行加載,但是(類名),class不會進行對這個對象進行初始化
加載一般分為三個步驟進行:
- 加載,類加載器進行加載此此對象,找到對應的字節碼,創建一個class對象
- 鏈接:驗證字節碼文件,並且對靜態域創造空間
- 初始化:檢查是否有超類,如果有就對其進行加載,並且對其執行靜態初始化域,跟靜態初始化塊。
class MyBean{ static{ syso(“進行mybean的static加載!”); } } public class Main { public static void main (String[] args){ syso(".class加載"); Class clazz1=MyBean.class(); syso("class.forname 加載"); Class clazz2=Class.forName("MyBean"); //類型轉化前的檢驗很重要一般使用instanceof進行判斷 }
Method 的 getReadMethod 與 getWriteMethod 的使用
【獲取一個對象的所有屬性字段名稱和其對應的值】
package Java; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class TextMain2 implements Serializable { private String name; private String age; public TextMain2() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public TextMain2(String name , String age){ this.name=name; this.age=age; } } public class TextMain{ public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException { TextMain2 tm= new TextMain2("zhanghao" ,"1");//對其進行初始化 Class clazz=tm.getClass(); Field[] fields=clazz.getDeclaredFields();//獲取其聲明的字段 for (Field field:fields) { String key = field.getName();//System.out.println(key); //輸出name // age //創建一個屬性描述器 PropertyDescriptor descriptor = new PropertyDescriptor(key,clazz); //給一個屬性,獲取值 Method method = descriptor.getReadMethod(); //相當於為上面聲明的字段設置get方法 Method method2= descriptor.getWriteMethod(); //為上面聲明的字段設置set方法(又稱內省) Object ob= method.invoke(tm); System.out.println( key +":"+ ob); method2.invoke(tm,new String[]{"123456789"}); } System.out.println( tm.getName()); /*輸出結果: name:zhanghao age:1 123456789*/ } }