A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 75100313 高级黑马   /  2014-3-13 15:13  /  1725 人查看  /  4 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

http://www.ccgoufang.com/ebook/music/cunzai.mp3
如题如题
              吴大美女 问的!:lol你懂滴!
              说实话 我没答上来   要是问你你怎么回答?


4 个回复

倒序浏览
反射(Reflection)和内省(Introspector),

反射
相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。

还是写两个例子让大家更直观的了解反射的使用方法:
  1. //通过类名来构造一个类的实例
  2. Class cls_str = Class.forName("java.lang.String");
  3. //上面这句很眼熟,因为使用过JDBC访问数据库的人都用过
  4. Object str = cls_str.newInstance();
  5. //相当于 String str = new String();
复制代码

  1. //通过方法名来调用一个方法
  2. String methodName = "length";
  3. Method m = cls_str.getMethod(methodName,null);
  4. System.out.println("length is " + m.invoke(str,null));
  5. //相当于System.out.println(str.length());
复制代码


内省



内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。



一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:
  1. package demo;



  2. import java.beans.BeanInfo;
  3. import java.beans.Introspector;
  4. import java.beans.PropertyDescriptor;



  5. /**
  6. * 内省演示例子
  7. * @author liudong
  8. */

  9. public class IntrospectorDemo {
  10.     String name;
  11.     public static void main(String[] args) throws Exception{
  12.         IntrospectorDemo demo = new IntrospectorDemo();
  13.         demo.setName("Winter Lau");        

  14.         //如果不想把父类的属性也列出来的话,
  15.         //那getBeanInfo的第二个参数填写父类的信息
  16.         BeanInfo bi = Introspector.getBeanInfo(demo.getClass(),Object.class);
  17.         PropertyDescriptor[] props = bi.getPropertyDescriptors();
  18.         for(int i=0;i<props.length;i++){
  19.             System.out.println(props[i].getName()+"="+
  20.                     props[i].getReadMethod().invoke(demo,null));
  21.         }

  22.     }   

  23.     public String getName() {
  24.         return name;
  25.     }

  26.     public void setName(String name) {
  27.         this.name = name;
  28.     }
  29. }
复制代码


总结



将Java的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展性。有很多项目都是采取这两种技术来实现其核心功能,例如我们前面提到的Struts,还有用于处理XML文件的Digester项目,其实应该说几乎所有的项目都或多或少的采用这两种技术。在实际应用过程中二者要相互结合方能发挥真正的智能化以及高度可扩展性。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
一:反射
      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                                    用于获得指定的类型,传参用
          2).反射类的构造方法,获得实例
               Class clazz = 类名.class;
               Constuctor con = clazz.getConstructor(new Class[]{paramClazz1,paramClazz2,.....});
               con.newInstance(params....);
          3).反射类的成员方法
               Method m = clazz.getMethod(methodName,new Class[]{paramClazz1,paramClazz2,.....});
               m.invoke();
          4).反射类的属性
               Field field = clazz.getField(fieldName);
               field.setAccessible(true);//设置为可访问
               filed.setObject(value);          //设置值
               Object value = field.get(clazz);      //获得值
               Object staticValue = filed.get(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等。
         
回复 使用道具 举报
欧阳疯 发表于 2014-3-14 13:05
一:反射
      1.什么是反射
             反射就是在运行状态把Java 类中的各种成分映射成相应相应的Java ...

山丘!总结的真好!
回复 使用道具 举报
mohuancaizi 发表于 2014-3-13 15:33
反射(Reflection)和内省(Introspector),

反射

山丘!感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马