黑马程序员技术交流社区

标题: java基础--反射 [打印本页]

作者: 周发建    时间: 2016-3-29 10:22
标题: java基础--反射
一、反射(一)概述
反射主要应用于框架。
反射:就是把java类的各个组成部分映射成相应的java类【FieldMethodContructorPackage
反射就是对一个类进行解刨
        一个类中的每个成员都可以用相应的反射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);
        }
}
(四)BeanUtils
Sun公司的内省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)






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2