黑马程序员技术交流社区

标题: 反射和内省有什么异同呢。 [打印本页]

作者: 房建斌    时间: 2014-3-9 14:01
标题: 反射和内省有什么异同呢。
  哪位知道反射和内省到底异同是什么,都用在什么地方呢。

作者: 欧阳疯    时间: 2014-3-9 14:24
一:反射
      1.什么是反射
             反射就是在运行状态把Java 类中的各种成分映射成相应相应的Java 类,可以动态得获取所有的属性以及动态调用任意一个方法。
             1).一段java代码在程序的运行期间会经历三个阶段:source-->class-->runtime
             2).Class对象
                    在java中用一个Class对象来表示一个java类的class阶段
                    Class对象封装了一个java类定义的成员变量、成员方法、构造方法、包名、类名等。
2.反射怎么用
          1).获得java类的各个组成部分,首先需要获得代表java类的Class对象
               获得Class对象有以下三种方式:
                    Class.forname(className)            用于做类加载
                    obj.getClass()                              用于获得对象的类型
                    类名.class                                    用于获得指定的类型,传参用

二:内省
     1.什么是内省
          通过反射的方式操作JavaBean的属性,jdk提供了PropertyDescription类来操作访问JavaBean的属性,Beantils工具基于此来实现。
      2.内省怎么用
          1).操作一个属性
               Object obj = new Object();
               PropertyDescriptor pd = new PropertyDescriptor(propertyName,Class);     //声明属性描述对象,一次只可描述一个属性
               Method m = pd.getWriterMethod();//获取setter方法
               m.invoke(obj,value);
               Method m = pd.getReaderMethod();//获取getter方法
               Object value = m.invoke(obj);
             2).操作多个属性
               BeanInfo bi = Instospector.getBeanInfo(beanClass);//获取Bean描述对象
               PropertyDescriptor[] pds = bi.getPropertyDescriptors();//获取属性描述对象数组
               拿到属性描述对象数组之后再循环数组,剩余的操作就跟"操作一个属性"相同了。
三:两者区别
         反射可以操作各种不同的java类,那么内省只是通过反射来操作JavaBean的。
     
四:应用
          框架就是将开发中大量重复的代码其中起来写个通用的程序,框架是给将来的程序使用的,需要现在的类调用将来的,所以框架要运行是依赖于将来的类实现的。
          我们只需要针对接口进行调用,将来的类实现接口,那么方法就固定了。但是将来写的类的类名我们无从得知,这时就需要调用者通过配置文件告诉框架具体的类名。

          将java的反射以及内省机制应用到程序设计中可以大大提高程序的智能化和可扩展性。有很多项目都是使用这两种技术实现其核心功能的。例如BeanUtils,Struts等。




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