java中反射的基本使用

來源:互聯網
上載者:User

標籤:import   access   記憶體   第一個   vat   ati   基本使用   bsp   方法   

fanShe.java

package example5;
class fanShe{
    /*1.應用在一些通用性比較高的代碼中。
     *2.後面學的架構,大多數都是應用程式框架來實現的。
     *3.在架構開發中,都是基於設定檔來開發。在設定檔中配置了類,可以通過反射得到類中的所有內容,可以讓類中的某個方法來執行。
     *類中的所有內容:屬性,沒有參數的構造方法,有參數的構造方法,普通方法。
     *反射的原理:
     *代碼儲存在.java檔案中儲存至本地硬碟-->編譯得到.class檔案-->把class類使用jvm中的類載入器載入至記憶體-->Class類(位元組碼檔案在記憶體中的表示)
     *我如果得到了這個Class類,便可以得到類裡所有的內容
     *使用反射首先需要得到Class類(三種方法)
     *(1)類名.class
     *(2)對象名.getClass()
     *(3)使用Class.forName("類的路徑")
     *屬性通過一個類Field獲得。
     *構造方法通過一個類constructor獲得。
     *普通方法通過一個類method獲得。
     */
     private String name;
    int age;
    //無參數的構造方法
    public fanShe() {}
    //有參數的構造方法
    public fanShe(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }  
}

testFanshe.java

package example5;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

class testFanshe {
    public static void main(String[] args) throws Exception {
        // 得到Class類的三種方法
        Class c1 = fanShe.class;
        Class c2 = new fanShe().getClass();
        Class c3 = Class.forName("example5.fanShe");
        /*test1();
        test2();
        test3();*/
        test4();
    }

    // 反射操作無參數的構造方法
    public static void test1() throws Exception {
        Class c3 = Class.forName("example5.fanShe");
        // 得到反射類的一個執行個體
        fanShe f1 = (fanShe) c3.newInstance();
        // 用執行個體去調用類中的方法
        f1.setName("寶娟");
        System.out.println(f1.getName());
    }

    // 反射操作有參數的構造方法
    @Test
    public static void test2() throws Exception {
        // 得到Class類
        Class c3 = Class.forName("example5.fanShe");
        // 得到有參數的構造方法類
        // 傳遞的是有參數的構造方法裡的參數類型,以class類型傳遞
        Constructor con = c3.getConstructor(String.class, int.class);
        // 通過有參的構造方法設定執行個體的值
        fanShe p1 = (fanShe) con.newInstance("阿蘇", 20);
        System.out.println(p1.getName() + "  " + p1.getAge());
    }

    // 反射操作類的屬性
    public static void test3() {
        // 得到Class類
        try {
            Class c2 = Class.forName("example5.fanShe");
            // 得到類的一個執行個體
            fanShe p2 = (fanShe) c2.newInstance();
            // 得到name屬性,參數是屬性名稱
            Field f1 = c2.getDeclaredField("name");
            //表示允許操作私人屬性
            f1.setAccessible(true);
            //為name屬性設定值,第一個參數是類的一個執行個體,第二個參數是要設定的值。
            f1.set(p2, "wangwu");
            // 得到屬性值並列印輸出
            System.out.println(f1.get(p2));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    //使用反射來操作普通方法
    public static void test4() throws Exception {
        //得到Class類
         Class c4=Class.forName("example5.fanShe");
         //得到類的一個執行個體
         fanShe p4=(fanShe) c4.newInstance();
        //得到普通方法的類的方法,第一個參數是要操作的普通方法的名稱,第二個參數是普通方法中傳入參數的類型。
         Method f4=c4.getDeclaredMethod("setAge", int.class);
         //操作的是私人方法
         f4.setAccessible(true);
         //此函數是使普通方法運行,並設定值。第一個參數是類的一個執行個體,第二個參數是要設定的值。
         f4.invoke(p4,15);
         //將設定的值列印輸出
         System.out.println(p4.getAge());
    }
    /*註:當操作的方法是靜態方法是,由於靜態方法的調用方式是 類名.方法名
     * 所以不需要類的執行個體
     * 在invoke()方法中的第一個參數直接寫為null
     * f4.invoke(null,15);
     */
}

java中反射的基本使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.