java語言運行通過程序化的方式間接對Class的對象實例操作,Class文件由類裝載器裝在後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數、屬性和方法等。Java允許用戶藉由這個Class相關的元信息對象間接調用Class對象的功能,這就爲使用程序化方式操作Class兌現開闢了途徑。
每一個類在JVM中都擁有一個對應的java.lang.class對象,它提供了類結構信息的描述。Class沒有Public構造方法。Class對象是在裝載類時由JVM通過調用類裝載器中的defineClass()方法自動構造的。
Class只有一個私有的構造方法,只有java虛擬機能夠創建Class對象。
/*
* Constructor. Only the Java Virtual Machine creates Class
* objects.
*/
private Class() {}
1 簡單例子
public class Car {
private String brand;
private String color;
private int maxSpeed;
public 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;
}
}
這個是一個普通的pojo類。我們用反射機制構建對象,並給對象屬性賦值。
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.baobaotao.reflect.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();
System.out.println("current loader: " + car.getClass().getClassLoader());
// ClassLoader loader = Thread.currentThread().getContextClassLoader();
// System.out.println("current loader: "+ loader);
// System.out.println("parent loader: "+ loader.getParent());
// System.out.println("grandparent loader: "+loader.getParent().getParent());
}
}
輸出結果:brand: 紅旗CA72 ; color: 黑色 ; maxspeed: 200current loader: sun.misc.Launcher$AppClassLoader@1372a1a