Java 类加载 以及反射


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());
	}
}


猜你喜欢

转载自blog.csdn.net/zsf5201314z/article/details/78188857
今日推荐