更新時(shí)間:2022-03-22 10:02:20 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1382次
Java 反射是在運(yùn)行時(shí)檢查或修改類的運(yùn)行時(shí)行為的過(guò)程。
java.lang.Class類提供了許多可用于獲取元數(shù)據(jù)、檢查和更改類的運(yùn)行時(shí)行為的方法。
java.lang 和 java.lang.reflect 包為 java 反射提供了類。
反射 API 主要用于:
IDE(集成開(kāi)發(fā)環(huán)境),例如 Eclipse、MyEclipse、NetBeans 等。
調(diào)試器
測(cè)試工具等
我們將從一個(gè)簡(jiǎn)單的例子開(kāi)始探訪Java反射機(jī)制的征程。下面的Car類擁有兩個(gè)構(gòu)造函數(shù)、一個(gè)方法及3個(gè)屬性。
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;
}
}
一般情況下,我們會(huì)使用如下代碼創(chuàng)建Car的實(shí)例:
Car car = new Car();
car.setBrand("紅旗CA72");
或者:
Car car = new Car("紅旗CA72","黑色");
以上兩種方法都采用傳統(tǒng)方式直接調(diào)用目標(biāo)類的方法。下面我們通過(guò)Java反射機(jī)制以一種間接的方式操控目標(biāo)類。
package com.smart.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable {
//①通過(guò)類裝載器獲取Car類對(duì)象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car");
//②獲取類的默認(rèn)構(gòu)造器對(duì)象并通過(guò)它實(shí)例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) cons.newInstance();
//③通過(guò)反射方法設(shè)置屬性
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();
}
}
運(yùn)行以上程序,在控制臺(tái)上將打印出以下信息:
brand:紅旗CA72;color:黑色;maxSpeed:200
這說(shuō)明我們完全可以通過(guò)編程方式進(jìn)行Java反射調(diào)用Class的各項(xiàng)功能,與通過(guò)構(gòu)造函數(shù)和方法直接調(diào)用類功能的效果是一致的,只不過(guò)前者是間接調(diào)用,后者是直接調(diào)用罷了。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743