Java 反射原理

一、Java反射機制概述

        Reflection(反射)是被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API
取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法。

正確方式: 引入需要的“包類”名稱 --> 通過new實例化 --> 獲取實例對象
反射方式: 實例化對象 --> getClass()方法 --> 得到完整“包類”名稱

Java反射機制提供的功能:
  (1)在運行時判斷任意一個對象所屬的類
  (2)在運行時構造任意一個類的對象
  (3)在運行時判斷任意一個類所具有的成員變量和方法
  (4)在運行時獲取泛型信息
  (5)在運行時調用任意一個對象的成員變量和方法
  (6)在運行時處理註解
  (7)生成動態代理

反射相關的主要API:
  (1)java.lang.Class:                      代表一個類
  (2)java.lang.reflect.Method:        代表類的方法
  (3)java.lang.reflect.Field:            代表類的成員變量
  (4)java.lang.reflect.Constructor: 代表類的構造器
  (5)......

Person實體類:

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

    private Person() {

    }

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

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

    public void show() {
        System.out.print("你好,我是一個程序員");
    }

    private String showNation(String name) {
        System.out.print("我的國際是:" + name);
        return name;
    }
}

MainApplication.java文件

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

public class MainApplication {
    /**
     * 主程序入口
     */
    public static void main(String[] args) {
        before();
        after();
    }

    /**
     * 反射之前:對Person的操作
     */
    public static void before() {
        //1.創建Person類的對象
        Person p1 = new Person("小米", 12);

        //2.通過對象,調用裏面的屬性、方法
        p1.age = 18;
        System.out.println(p1.toString());
        p1.show();

        //在Person類外部,不可通過Person類對象調用私有結構
        //比如:private showNation()
    }

    /**
     * 反射之後:對Person的操作
     */
    public static void after() {
        //Class反射源頭
        Class clazz = Person.class;
        try {
            //1.通過反射創建Person類對象,得到指定構造器
            Constructor cons = clazz.getConstructor(String.class, int.class);
            Object obj = cons.newInstance("Tom", 24);
            Person p = (Person) obj;
            System.out.println(p.toString());
            //2.通過反射,調用對象指定的屬性、方法
            //調用屬性
            Field age = clazz.getDeclaredField("age");
            age.set(p, 10);
            System.out.println(p.toString());
            //調用方法
            Method method = clazz.getDeclaredMethod("show");
            method.invoke(p);
            //通過反射,可以調用Person類的私有結構。比如:私有構造器、屬性、方法
            //調用私有的構造器
            Constructor dcons = clazz.getDeclaredConstructor(String.class);
            dcons.setAccessible(true);
            Person p1 = (Person) dcons.newInstance("leict");
            System.out.println(p1);
            //調用私有屬性
            Field n1 = clazz.getDeclaredField("name");
            n1.setAccessible(true);
            n1.set(p1, "黃繼光");
            System.out.println(p1.toString());
            //調用私有方法
            Method showNation = clazz.getDeclaredMethod("showNation", String.class);
            showNation.setAccessible(true);
            String nation = (String) showNation.invoke(p1, "中國");
            System.out.println("\n\r" + nation + "\n\r");

            System.out.println("getName---->>>>" + clazz.getName());
            System.out.println("getSimpleName---->>>>" + clazz.getSimpleName());
            System.out.println("getCanonicalName---->>>>" + clazz.getCanonicalName());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章