19Java語法回顧之反射

Java語法回顧之反射


讀了那麼多年的書讓我明白一個道理。人要穩重,不要想到啥就做啥。做一行越久即使你不會,幾年之後慢慢的你也會了,加上一點努力你或許你能成爲別人眼中的專家。

反射獲取字節碼文件

/*
 * 反射:在運行狀態下,通過class文件對象(Class的對象),去使用構造方法,成員變量,成員方法。
 * 
 * 那麼,我們是如何獲取到class文件對象的呢?(字節碼文件對象)
 * A:Object類的getClass()方法。
 * B:數據類型的靜態的class屬性
 * C:通過Class類的靜態方法forName(String className)
 * 
 * 到底使用哪一種呢?
 * 開發中用第三種。自己寫例子測試可以使用前兩種。
 * 因爲第三種方式可以結合配置文件使用。
 */

反射獲取字節碼文件

/**
 * 通過反射獲取字節碼文件
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException {
        MyPerson my = new MyPerson();
        Class<? extends MyPerson> myClass = my.getClass();

        MyPerson mp = new MyPerson();
        Class<? extends MyPerson> aClass = mp.getClass();

        System.out.println(myClass.equals(aClass));//true

        Class<MyPerson> myPersonClass = MyPerson.class;

        System.out.println(aClass==myPersonClass);//true

        //第三種,開發時使用的方式
        Class aClass1 = Class.forName("cn.itcast_01.MyPerson");
        System.out.println(myPersonClass==aClass1);//true
    }
}

通過反射獲取構造方法

/**
 * 反射獲取構造方法並使用。
 * <p/>
 * 構造方法     Constructor
 * 成員變量     Field
 * 成員方法     Method
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> aClass = Class.forName("cn.itcast_01.MyPerson");
        //獲取構造器對象
        // 一般我們創建對象,只要一個構造方法就可以了,所以,我們只需要獲取一個構造方法即可。
        Constructor<?> constructor = aClass.getConstructor();
        //帶參構造方法
        Constructor<?> constructor2 = aClass.getConstructor(int.class,String.class);
        //通過Constructor創建實例對象
        Object o = constructor.newInstance();
        Object hsia = constructor2.newInstance(23, "Hsia");
        System.out.println("無參構造"+o);
        System.out.println("帶參構造"+hsia);
        System.out.println("*******************");
    }
}

反射獲取成員變量並使用

/**
 * 獲取私有成員變量並使用
 */
public class MyReflectField {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //獲取字節碼文件
        Class<?> c = Class.forName("cn.itcast_01.MyPerson");
        //創建對象
        Constructor<?> constructor = c.getConstructor();
        Object obj = constructor.newInstance();
        //沒有設置值之前的obj對象
        System.out.println("初始化前的值:" + obj);

        //獲取共有字段名稱
        Field age = c.getField("age");
        //給共有字段設置值
        age.set(obj, 23);

        //獲取私有字段
        Field name = c.getDeclaredField("name");
        //暴力訪問
        name.setAccessible(true);//不要限制我。
        name.set(obj, "Hsia");//報錯   java.lang.IllegalAccessException:

        //設置值後的對象
        System.out.println("初始化後的值:" + obj);
    }
}

反射獲取成員方法並使用

/**
 * 獲取成員方法並使用。
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //獲取字節碼文件
        Class<?> c = Class.forName("cn.itcast_01.MyPerson");
        //創建對象
        Constructor<?> constructor = c.getConstructor();
        Object obj = constructor.newInstance();
        //1.獲取成員方法 無參無返回值
        Method show = c.getMethod("show");
        show.invoke(obj,null);
        System.out.println("——————————————————");
        //2.獲取成員方法 帶參無返回值
        Method function = c.getMethod("function",String.class);
        function.invoke(obj,"Hsia");
        System.out.println("——————————————————");
        //3.獲取成員方法 帶參有返回值
        Method reutrnValue = c.getMethod("reutrnValue", String.class, int.class);
        //return 的返回值
        Object hsia = reutrnValue.invoke(obj, "Hsia", 23);
        System.out.println(hsia);
        System.out.println("——————————————————");
        //4.獲取私有成員方法
        Method helloworld = c.getDeclaredMethod("hello");
        //設置暴力訪問
        helloworld.setAccessible(true);
        helloworld.invoke(obj,null);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章