java反射常用API小結

java反射API

前言

本篇博客不設計反射的原理及其過程,主要是教會大家使用java反射常用的API,能夠在日常編碼中使用到它。
相信我,這麼多種類型總有一種會被用到


正文

測試實例

//一個用於本次反射的實例類
package demo;

/**
 * @version V1.0
 * @Title:
 * @Package
 * @Description:
 * @author: 劉星星
 * @date: 2020/3/5 20:23
 */
public class ReflctResouce {
    // String 類型屬性
    public String name;
    // int 類型屬性
    private anInt;
    // 靜態類型
    public static Character character;
    
    // 無參構造器方法
    public ReflctResouce(){ }
    // 有參構造器方法
    public ReflctResouce(String name, int anInt) {
        this.name = name;
        this.anInt = anInt;
    }
    
    // 具有返回值的方法
    public String getName() {
        return name;
    }
    // 無返回值但是具有參數的方法
    public void setName(String name) {
        this.name = name;
    }
    // 模擬普通方法
    public void activeone(){
        System.out.println("模擬無參無返回的功能");
    }
    // 模擬只有含參的方法
    public void activeone(int a){
        System.out.println("模擬無參無返回的功能" + a);
    }
    // 模擬只有返回值的方法
    public int activetwo(){
        System.out.println("模擬有參有返回的功能");
        return  111111;
    }
    // 模擬私有方法
    private  void activethree(){
        System.out.println("模擬私有方法");
    }
    // 模擬靜態普通方法
    public static void activestatic(){
        System.out.println("模擬擬靜態普通方法");
    }
}

一、通過反射創建對象

注意: 反射只能反射已存在的類,無法反射還未定義的類

  • 訪問無參構造器創建的對象

// 獲取類的全稱 包名+類名
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射對象| getConstructors是返回所有的構造方法| newInstance是創建實例的方法 參數爲動態參數
Object obj = reflctClass.getConstructors()[0].newInstance();
  • 訪問含參構造器

// 開始反射                         放入全稱
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射對象
String name = "haha";
int anInt = 12;
// getConstructor是根據 class參數類型獲取對應的構造器
Constructor constructor = reflctClass.getConstructor(name.getClass(), int.class);
Object obj = constructor.newInstance("haha", 12);
//下面是強轉測試 是否屬性被注入
ReflctResouce reflctResouce = (ReflctResouce) obj;
System.out.println(reflctResouce.name+" "+reflctResouce.anInt);

二、通過反射訪問對象的屬性

  • 訪問公有參數

 // 開始反射                         放入全稱
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射對象
Object obj = reflctClass.getConstructors()[0].newInstance();
// 獲得字段
Field field = reflctClass.getField("name");
//給對象設置 類對象| 值
field.set(obj, "haha");
System.out.println(field.get(obj));
  • 訪問私有參數

    // 開始反射                         放入全稱
   Class reflctClass = Class.forName("demo.ReflctResouce");
   // 反射對象
   Object obj = reflctClass.getConstructors()[0].newInstance();
   //反射獲取私有變量    getDeclaredField
   Field field = reflctClass.getDeclaredField("anInt");
   // 允許私有變量被訪問
   field.setAccessible(true);
   field.set(obj, 12);
   System.out.println(field.get(obj));

三、通過反射調用方法

  • 調用靜態方法

// 開始反射                         放入全稱
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射靜態方法
Method method = reflctClass.getMethod("activestatic");
// 方法的調用 null指的是調用此方法對象,由於是靜態不需要對象使用null即可
method.invoke(null);
  • 調用有參方法

 // 開始反射                         放入全稱
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射對象
Object obj = reflctClass.getConstructors()[0].newInstance();
Method method = reflctClass.getMethod("activeone", int.class);
method.invoke(obj,1);
  • 調用有返回值的方法

// 開始反射                         放入全稱
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射對象
Object obj = reflctClass.getConstructors()[0].newInstance();
Method method = reflctClass.getMethod("activetwo");
Object num = method.invoke(obj);
System.out.println(num);
  • 調用私有方法

 // 開始反射                         放入全稱
 Class reflctClass = Class.forName("demo.ReflctResouce");
 // 反射對象
 Object obj = reflctClass.getConstructors()[0].newInstance();
 Method method = reflctClass.getDeclaredMethod("activethree");
 method.setAccessible(true);
 method.invoke(obj);

後記

本篇博客僅作字典查詢使用,想真正瞭解反射使用反射跟厲害的功能。大家還是去專門看官方API和源碼

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