<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

    Java基礎(02)——反射

    Java核心技術 專欄收錄該內容
    11 篇文章 0 訂閱

    1、什么是反射

    反射:是Java被視為動態語言的關鍵;反射機制允許程序在運行期間,借助反射API獲取任何類的全部信息,并且能夠直接操作這些類的屬性和方法。

    Java的反射(reflection)機制是指在程序的運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。這種動態獲取程序信息以及動態調用對象的功能稱為Java語言的反射機制。反射被視為動態語言的關鍵。

    2、獲取Class類的實例(三種方式)

    1. 通過類直接獲取
    Class c3 = Student.class;
    
    1. 通過類的一個實例,調用getClass()方法獲取
    People people = new Student();   
    Class c1 = people.getClass();
    
    1. 通過類的全路徑獲取(包名+類名)
    Class c2 = Class.forName("ThreeClass.Student");
    

    3、Class類的常用方法

    方法名說明
    Objecet newInstance()創建Class類型的一個實例
    getName()獲取Class對象所表示的實例名稱
    Class getSuperClass()返回當前Class對象的父類的Class對象
    Class[] getinterfaces()獲取當前Class對象的接口
    ClassLoader getClassLoader()獲取該類的類加載器

    4、反射獲取類的屬性、方法和構造器

    在這里插入圖片描述

    1. 獲取類的屬性

            Class people = Class.forName("People");
            Class user = Class.forName("user");
            
            /*
             * 1、獲取類的屬性
             */
            //獲取當前類和父類的所有public屬性
            Field[] fields = people.getFields();
            for (Field field : fields) {
                System.out.println(field);
            }
            //獲取當前類的所以public和private屬性
            Field[] f2 = user.getDeclaredFields();
            for (Field field : f2) {
                System.out.println("Field暴力獲取"+field);
            }
            //獲取指定屬性
            Field name = user.getField("name"); //獲取public屬性
            System.out.println(name);
            Field age = user.getDeclaredField("age");  //獲取私有的屬性
            System.out.println(age);
    

    2. 獲取類的方法

            /*
             *  2、獲取類的方法
             */
            //獲取當前類和父類的所有public方法
            Method[] m1 = user.getMethods();
            for (Method method : m1) {
                System.out.println(method);
            }
            //獲取當前類所有的public和private方法
            Method[] m2 = user.getDeclaredMethods();
            for (Method method : m2) {
                System.out.println("暴力獲取"+method);
            }
            //獲取指定的方法
            Method test = user.getMethod("test"); //獲取public方法
            System.out.println("獲取public方法"+test);
            Method ptest = user.getDeclaredMethod("ptest"); //獲取privata方法
            System.out.println("獲取private方法"+ptest);
    

    3. 獲取類構造器

            /*
             * 3、獲取構造器
             */
            //獲取當前類public構造器
            Constructor[] c1 = people.getConstructors();
            for (Constructor constructor : c1) {
                System.out.println(constructor);
            }
            //獲取當前類public和private構造器
            Constructor<?>[] c2 = people.getDeclaredConstructors();
            for (Constructor<?> constructor : c2) {
                System.out.println("暴力獲取"+constructor);
            }
            //獲取指定的構造器
            Constructor c3 = user.getConstructor(String.class, Integer.class);
            System.out.println("指定public構造器"+c3);
            Constructor c4 = user.getDeclaredConstructor(null);
            System.out.println("獲取指定的private"+c4);
    

    5、反射操作類的屬性、方法

    1. 反射創建對象

            Class user = Class.forName("user");
            Class people = Class.forName("People");
            /*
             * 1、通過反射創建對象
             */
            //默認調用的無參構造
            user u1 = (user) user.newInstance();
            System.out.println(u1);
            //使用有參構造
            Constructor<?> constructor = user.getDeclaredConstructor(String.class, Integer.class);
            user ul2 = (user) constructor.newInstance("小婉", 17);
            System.out.println(ul2);
    

    2. 反射執行方法

            /*
             *2、通過反射執行方法
             * invoke(實例化的對象,方法中的參數)
             */
            Method m1 = user.getDeclaredMethod("test");
            m1.invoke(u1);
            Method m2 = user.getDeclaredMethod("ptest");
            m2.setAccessible(true); //ptest()方法為private的 ,要關閉安全檢查才能執行
            m2.invoke(u1);
    

    3. 反射操作屬性

            /*
             * 3、通過放射操作屬性
             * set(實例化的對象,屬性值)
             */
            Field f1 = people.getDeclaredField("pname");
            People peo = (People) people.newInstance();
    
            f1.setAccessible(true); //pname方法為private的 ,要關閉安全檢查設置值
            f1.set(peo,"小紅");
            System.out.println(peo.getPname());
    

    注意點:
    操作私有屬性和方法時,要關閉安全權限檢查,設置setAccessible(true),否則執行不了。

    • 0
      點贊
    • 0
      評論
    • 0
      收藏
    • 一鍵三連
      一鍵三連
    • 掃一掃,分享海報

    ??2020 CSDN 皮膚主題: 我行我“速” 設計師:Amelia_0503 返回首頁
    實付
    使用余額支付
    點擊重新獲取
    掃碼支付
    錢包余額 0

    抵扣說明:

    1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
    2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

    余額充值
    多乐彩