Java反射


反射概述

Java反射機制指的是在程序的運行過程中,對於任何一個類,都能夠知道它的所有屬性和方法。對於任意一個對象,都能夠調用它的任意屬性和方法,這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。

反射常用類

  • ClassClass 類的實例表示正在運行的 Java 應用程序中的類和接口。
  • Constructor:關於類的單個構造方法的信息以及對它的權限訪問。
  • Field:Field 提供有關類或接口的單個字段的信息,以及對它的動態訪問權限。
  • Method:Method 提供關於類或接口上單獨某個方法的信息。

獲取Class對象的方法

獲取Class對象的的方法有以下幾種:

  • 類名.class
Class<Person> clazz = Person.class;
  • 對象.getClass()
Person p1 = new Person();
Class clazz2 = p1.getClass();
  • Class.forName(全限定類名)
Class clazz3 = Class.forName("com.emhum.demo.Person");
  • 使用類的加載器,ClassLoader(這種方式了解即可)
ClassLoader classLoader = PersonTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("com.emhum.demo.Person");

反射示例

定義Person類:

public class Person {
    private String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void show() {
        System.out.println("你好啊!");
    }

    public String showAddress(String address) {
        System.out.println("我的地址是:" + address);
        return address;
    }
}

測試獲取Person類的部分結構信息:

public class PersonTest {

    //使用反射,對Person進行操作
    @Test
    public static void test1() throws Exception {

        Class<Person> clazz = Person.class;
        //通過反射,創建Person類的對象
        Constructor<Person> cons = clazz.getConstructor(String.class, int.class);
        /**
         * newInstance():調用此方法,創建對應的運行時類的對象。
         *   1.運行時類必須提供空參的構造器
         *   2.空參的構造器的訪問權限通常設置為public
         */
        Person p = cons.newInstance("tom", 12);
        System.out.println(p.toString());

        //通過反射,調用對象指定的屬性和方法
        //調用屬性
        Field age = clazz.getDeclaredField("age");
        age.set(p, 10);
        System.out.println(p.toString());

        //調用方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);

        //通過反射,可以調用Person類的私有結構,比如:私有構造器,私有方法,私有屬性。
        //調用私有構造器
        Constructor<Person> cons1 = clazz.getDeclaredConstructor(String.class);
        //保證此構造器是可訪問的
        cons1.setAccessible(true);
        Person p1 = cons1.newInstance("jerry");
        System.out.println(p1);

        //調用私有的屬性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1, "tomas");
        System.out.println(p1);

        //調用私有的方法
        Method showAddress = clazz.getDeclaredMethod("showAddress", String.class);
        showAddress.setAccessible(true);
        showAddress.invoke(p1, "上海");
    }
}


免責聲明!

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



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