更新時間:2022-03-22 10:02:20 來源:動力節點 瀏覽1459次
Java 反射是在運行時檢查或修改類的運行時行為的過程。
java.lang.Class類提供了許多可用于獲取元數據、檢查和更改類的運行時行為的方法。
java.lang 和 java.lang.reflect 包為 java 反射提供了類。
反射 API 主要用于:
IDE(集成開發環境),例如 Eclipse、MyEclipse、NetBeans 等。
調試器
測試工具等
我們將從一個簡單的例子開始探訪Java反射機制的征程。下面的Car類擁有兩個構造函數、一個方法及3個屬性。
package com.smart.reflect;
public class Car {
private String brand;
private String color;
private int maxSpeed;
public Car() {
System.out.println("init car!!");
}
public Car(String brand, String color, int maxSpeed) {
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}
public void introduce() {
System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:" + maxSpeed);
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
一般情況下,我們會使用如下代碼創建Car的實例:
Car car = new Car();
car.setBrand("紅旗CA72");
或者:
Car car = new Car("紅旗CA72","黑色");
以上兩種方法都采用傳統方式直接調用目標類的方法。下面我們通過Java反射機制以一種間接的方式操控目標類。
package com.smart.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable {
//①通過類裝載器獲取Car類對象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car");
//②獲取類的默認構造器對象并通過它實例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) cons.newInstance();
//③通過反射方法設置屬性
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "紅旗CA72");
Method setColor = clazz.getMethod("setColor", String.class);
setColor.invoke(car, "黑色");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class);
setMaxSpeed.invoke(car, 200);
return car;
}
public static void main(String[] args) throws Throwable {
Car car = initByDefaultConst();
car.introduce();
}
}
運行以上程序,在控制臺上將打印出以下信息:
brand:紅旗CA72;color:黑色;maxSpeed:200
這說明我們完全可以通過編程方式進行Java反射調用Class的各項功能,與通過構造函數和方法直接調用類功能的效果是一致的,只不過前者是間接調用,后者是直接調用罷了。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習