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和源碼