package com.cnpc.reflect;
public class Car {
private String brand;
private String color;
private int maxSpeed;
public Car() {
}
public Car(String brand, String color, int maxSpeed) {
super();
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;
}
}
package com.cnpc.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Car initByDefaultConst() throws Throwable {
// 通过类装载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.cnpc.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();
}
}
类装载器ClassLoader
工作机制
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在java中,类装载器把一个类装入JVM中,具体的步骤:
1>装载:查找和导入Class文件。
2>链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的
校验--检查载入Class文件数据的正确性
准备--给类的静态变量分配存储空间
解析--将符号引用转成直接引用
3>初始化:对类的静态变量,静态代码块执行初始化工作。
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入
Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader扩展类装载器和AppClassLoader系统类装载器。
其中,根装载器不是ClassLoader的子类,它是使用C++编写,因此我们在Java中看不到它,根装载器负责JRE的核心类库。
ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包
AppClassLoader负责装载Classpath路径下的类包。
JVM类装载是使用的 全盘负责委托机制。
全盘负责--当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader装入。
委托机制--先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找并装载目标类。(为了安全)
私有属性和方法的访问 -- 取消java语言访问检查以访问private 和 protected方法
xxx.setAccessible(true);