public class Reflect {
public static Car initCar() throws Throwable{
String className = "mycollection.Car";
//load Class(byte code) into JVM Memory
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class<?> clazz = cl.loadClass(className);
/**
* 基于安全考虑的类加载的委托机制,避免系统的库文件被误替换(.class 字节码),
* 首先会从ClassLoader(根类加载器,加载jre的核心类库)
* ExtClassLoader(加载ext中的Jar包)
* AppClassLoader(应用类加载 负责加载Classpath下的类)
*/
System.out.println("当前类加载器:"+cl);
System.out.println("父加载器:"+cl.getParent());
System.out.println("祖父加载器"+cl.getParent().getParent());
//init a Obj
Constructor<?> cons = clazz.getDeclaredConstructor((Class[])null);
Car car = (Car) cons.newInstance();
//reflect method and set attributes
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "夏利");
Method setColor = clazz.getMethod("setColor", String.class);
setColor.invoke(car, "蓝色");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed", String.class);
setMaxSpeed.invoke(car, "110");
return car;
}
public static void main(String ...args) throws Throwable{
Car initCar = initCar();
System.out.println(initCar.getBrand());
}
}