一、反射(一)概述 反射主要应用于框架。 反射:就是把java类的各个组成部分映射成相应的java类【Field、Method、Contructor、Package】 反射就是对一个类进行解刨 一个类中的每个成员都可以用相应的反射API类的实例对象来表示;通过调用Class类的方法可以获得这些实例对象。 反射的基石:Class 对象.getClass(); //需要先创建未知对象 类.calss(); //需要使用到未知类 Class.forName(String); //传递字符串即可,推荐使用 isPrimitive(); //判断是否基本类型的字节码 isArray(); //判断是否是数组的字节码 newInstance(); //创建一个对象。提供一个便利创建对象的方式 数组的反射Array getLength(Object obj); //获取数组的长度 get(Object obj,int index); //获取元素 构造函数 getConstructor(); getConstructor(Class<?>...); 函数 getMethod(String name, Class<?>...); getMethods(); 字段 getField(String); getFields(); Type getGenericInterfaces(); getGenericSuperclass(); file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps753B.tmp.png (二)模拟tomcat//模拟Tomcat public static void myTomcat() throws Exception{ //1. 读取配置文件 Properties pro = new Properties(); pro.load(new FileReader("d:/pro.txt")); Class clazz = Class.forName(pro.getProperty("className")); if(clazz!=null){ USB usb = (USB) clazz.newInstance(); new TestUSB().run(usb); } } //接口定义规范 interface USB{ public void start(); public void stop(); } //前期开发的程序调用后期的实现 class TestUSB{ public void run(USB usb){ usb.start(); usb.stop(); } } //后期实现接口 //手机 class MPhone implements USB{ @Override public void start() { System.out.println("手机运行"); } @Override public void stop() { System.out.println("手机停止"); } } //相机 class Camera implements USB{ @Override public void start() { System.out.println("相机运行"); } @Override public void stop() { System.err.println("相机停止"); } } (三)内省 Introspector/** * 用于操作javabean(特殊的java类:get/set) */ class MyBeanUtils{ //1. 反射操作bean public static Object getProperties1(Object bean, String name) throws Exception{ Field f = bean.getClass().getDeclaredField(name); f.setAccessible(true); return f.get(bean); } public static void setProperties1(Object bean, String name, Object value) throws Exception{ Field f = bean.getClass().getDeclaredField(name); f.setAccessible(true); f.set(bean, value); } //2. 内省操作bean,复杂方式 public static Object getProperties2(Object bean, String name) throws Exception{ BeanInfo info = Introspector.getBeanInfo(bean.getClass()); PropertyDescriptor[] pds = info.getPropertyDescriptors(); for(PropertyDescriptor pd: pds){ if(pd.getName().equals(name)){ return pd.getReadMethod().invoke(bean); } } return null; } public static void setProperties2(Object bean, String name, Object value) throws Exception{ BeanInfo info = Introspector.getBeanInfo(bean.getClass()); PropertyDescriptor[] pds = info.getPropertyDescriptors(); for(PropertyDescriptor pd: pds){ if(pd.getName().equals(name)){ pd.getWriteMethod().invoke(bean, value); } } } //3. 内省操作bean,简单方式 public static Object getProperties3(Object bean, String name) throws Exception{ PropertyDescriptor pd = new PropertyDescriptor(name, bean.getClass()); Method get = pd.getReadMethod(); return get.invoke(bean); } public static void setProperties3(Object bean, String name, Object value) throws Exception{ PropertyDescriptor pd = new PropertyDescriptor(name, bean.getClass()); Method set = pd.getWriteMethod(); set.invoke(bean, value); } } (四)BeanUtilsSun公司的内省API过于繁琐,所以Apache结合很多实际开发中的应用场景开发了一套简单、易用的API,用于操作Bean的属性:BeanUtils BeanUtils工具包常用类: BeanUtils PropertyUtils ConvertUtils.regsiter(Converter convert, Class clazz); 自定义转换器 使用BeanUtils步骤 *1. 导入jar包 commons-beanutils-*.jar commons-logging-*.jar *2. 使用 getProperty(Object bean, String name); setProperty(Object bean, String name, String value); populate(Object bean,Map map); Map describe(Object bean) populate(Object bean, Map)
|