Java反射入门
简单实例:
package com.zhaixiaofeng.reflect
public class Car(){
private String brand;
private String color;
private String maxSpeed;
public Car(){};
public Car(String brand, String color, String maxSpeed){
this.brandk = brand;
this.color = color;
this.maxSeepd = maxSpeed;
}
public void introduce(){
System.out.pring("brand:" + brand + ";color:" + color + ";maxSpeed" + maxSpeed);
}
}
public static Car initByDefaultConstructor() throws ThrowableException{
//(1)Get object constrator by classloader
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class cls = loader.loadClass(com.zhaixiaofeng.reflect.Car);
//(2)Get default construtor and instance object car
Constructor cons = cls.getDeclaredConstructor(Class[],null);
Car car = (Car)cons.newInstance();
//(3)Set object properties by reflect
Method setBrand = class.getMethod("setBrand",String.class);
setBrand.invoke(car,"falali");
return car;
}
public ReflectDemo{
public stataic void main(String [] args){
//Old mothed
Car oldCar = new Car("benchi","red","1000");
oldCar.introduce();
//New mothed by reflect
Car newCar = initDefaultConstructor();
newCar.introduce();
}
}
解释:
在ReflectDemo类中,使用到了Java中常用的反射类:ClassLoader,Class,Constructor,Method.
通过这些反射类方法、可以直接调用Class的各个功能。
(1)获取当前线程的ClassLoader,通过指定的全限定类:com.zhaixiaofeng.reflect.Car,装载Car类对应的反射实例.
(2)通过Car的反射类对象获取Car的构造函数对象cons,通过构造函数的newInstance()方法实例化Car对象,其效果等同于newCar();
(3)通过Car的反射类对象的getMethod(String methodName,Class paramClass)获取属性的Setter方法对象,第一个参数是目标Class的方法名;第二个参数是方法入参的对象类型。获取方法反射对象后,即可通过invoke(Object obj,Object param)方法调用目标类的方法,该方法的第一个参数是操作的目标类对象实例;第二个参数是目标方法的入参。