黑马程序员_java的反射与内省

---------------------- <a href="http://www.itheima.com" target="blank">ASP.Net+Unity开发</a><a href="http://www.itheima.com" target="blank">.Net培训</a>、期待与您交流! ----------------------

一:反射


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等。


---------------------- <a href="http://www.itheima.com" target="blank">ASP.Net+Unity开发</a><a href="http://www.itheima.com" target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值