packagecom.baobaotao. reflect;
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
public classReflectTest {
public static Car initByDefaultConst() throws Throwable
{
//①通过类装载器获取Car类对象
ClassLoader loader =Thread.currentThread().getContextClassLoader();
Class clazz =loader.loadClass("com.baobaotao.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,"黑色");
MethodsetMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);
setMaxSpeed.invoke(car,200);
return car;
}
public static void main(String[] args)throws Throwable {
Car car = initByDefaultConst();
car.introduce();
}
}
这说明我们完全可以通过编程方式调用Class的各项功能,这和直接通过构造函数和方法调用类功能的效果是一致的,只不过前者是间接调用,后者是直接调用罢了。
在ReflectTest中,使用了几个重要的反射类,分别是
ClassLoader、
Class、
Constructor
和
Method,
通过这些反射类就可以间接调用目标Class的各项功能了。
在①处,我们获取当前线程的ClassLoader,然后通过指定的全限定类“com.baobaotao.beans.Car”装载Car类对应的反射实例。
在②处,我们通过Car的反射类对象获取Car的构造函数对象cons,通过构造函数对象的newInstrance()方法实例化Car对象,其效果等同于new Car()。
在③处,我们又通过Car的反射类对象的getMethod(String methodName,Class paramClass)获取属性的Setter方法对象,第一个参数是目标Class的方法名;第二个参数是方法入参的对象类型。获取方法反射对象后,
即可通过invoke(Object obj,Object param)方法调用目标类的方法,该方法的第一个参数是操作的目标类对象实例;第二个参数是目标方法的入参。
本文介绍了一个使用Java反射机制创建并初始化对象的例子。通过类加载器获取到类对象,并利用反射API来实例化对象及调用其方法。展示了如何通过反射获取类的默认构造器、调用方法以及设置对象属性。
1180

被折叠的 条评论
为什么被折叠?



