反射中的 Method 的 getReadMethod 與 getWriteMethod 使用 【獲取一個對象的所有屬性字段名稱和其對應的值】


 

轉:

class反射(一),以及Method 的 getReadMethod 與 getWriteMethod 使用

class

Java在識別類信息與加載它時,通常有兩種方式來對類信息進行操作:

  1. RTTI,類在編譯時期就已經知道類的信息,我們調用時直接進行了new 對象;
  2. 反射機制,這一種是在程序運行時進行了類加載,而前提是我們在編譯時期沒有進行加載

每一個類都會對應存在的class對象,也就是存在於.class文件,在我們的一次使用的時候,jvm就回調用它;

而static初始化,會在類加載時進行

 

我們在進行引用時,類加載器首先會檢查一下這個class對象是否被加載過,如果沒有被加載,就回根據這個類名進行查找相對應的class文件,加載文件,然后進行對其方法的引用。

我們在進行獲取引用時,我們可以進行使用Class.forName("),進行對這個類的加載,也可以用(類名).class對這個類進行加載,但是(類名),class不會進行對這個對象進行初始化

加載一般分為三個步驟進行:

  1. 加載,類加載器進行加載此此對象,找到對應的字節碼,創建一個class對象
  2. 鏈接:驗證字節碼文件,並且對靜態域創造空間
  3. 初始化:檢查是否有超類,如果有就對其進行加載,並且對其執行靜態初始化域,跟靜態初始化塊。

 

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*/
        
    }
}

 

原文章:https://www.cnblogs.com/luoxn28/p/5686794.html

建議同志們看一下原文章,原文章內容比較充實

 

 

 

另外附一篇博客,https://www.cnblogs.com/rocomp/p/4781987.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM