简单实例
car类
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);
}
//省略get set方法、
}
ReflectTest
有几个重要的反射类:ClassLoader、Class、Constructor、Method、
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static Car initByDefaultConst()throws Throwable{
//通过类装载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();//获取当前线程的ClassLoader、
Class clazz = loader.loadClass("com.smart.reflect.Car");//通过指定的全限定类名com.smart.reflect.Car装载Car类对应的反射实例、
//获取类的默认构造器对象并通过它实例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[])null);
Car car = (Car)cons.newInstance();//效果等同于new Car()、
//通过反射方法设置属性
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();
}
}
通过反射调用private和protected成员变量和方法
通过类实例变量无法在外部被访问和调用、但通过反射机制可以绕过这个限制、
必须通过setAccessible(boolean access)方法取消Java语言检查,否则将抛出IllegalAccessException、如果JVM的安全管理器设置了响应的安全机制,那么调用该方法将抛出SecurityException、
PrivateCar
public class PrivateCar {
private String color;
protected void drive(){
System.out.println("drive private car! the color is:"+color);
}
}
ReflectTest
public class ReflectTest {
public static void main(String[] args) throws Throwable{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance();
Field colorFld = clazz.getField("color");
//取消Java语言访问检查以访问private变量
colorFld.setAccessible(true);
colorFld.set(pcar,"红色");
Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
//取消Java语言访问检查以访问protected方法
driveMtd.setAccessible(true);
driveMtd.invoke(pcar,(Class[])null);
}
}