java反射机制

来源:互联网 发布:mac 10.13.1无法更新 编辑:程序博客网 时间:2024/05/22 00:21

反射 jdk1.2开始的功能

通常我们创建一个对象,只需要一句话new,但是new的前提是在知道类名的情况下,如果不知道类名,怎么得到这个类的对象呢?

其实我们可以通过反射来实现。一个java程序在运行时,可以获得任何一个类的字节码信息,包括类的修饰符(publicstatic等),基类(超类,父类),实现的接口,字段,方法等信息。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并逆向生成其对象实体、或对其fields设值、或唤起其methods。

 那么java是怎么实现这种机制的呢?Java的反射机制是通过反射API来实现的,主要包括以下几类

1).Constructor:用来描述一个类的构造方法 

2).Field:用来描述一个类的成员变量 

3).Method:用来描述一个类的方法

4).Modifer:用来描述类内各元素的修饰符 

5).Array:用来对数组进行操作

Constructor,Field,Method这三个类都是JVM(虚拟机)在程序运行时创建的,用来表示加载类中相应的成员。也就是说可以通过这些类来获取和改变反射类的所有成员。

反射在框架中是最常用的手段。一个框架是先于调用者而存在的。当程序员用一个框架的时候,你写的什么类,框架怎么知道,就是通过java反射机制。

Web.xmlStruts2.xmlapplicationContext.xmlhibernate.cfg.xmlPeroson.hbm.xmlsqlMapperConfig.xmlPersonMapper.xml等配置文件中的class对应的字节码,都是通过反射来创建对象的。Param标签中的参数也是通过反射将其值设置到对象中。

一个标准的javaBean的反射叫做内省。

mybatisresultMap标签中,把结果集的和PO对象的属性一一对应起来,就能把结果集赋值给PO对象,这也是通过反省实现的。通过mapper.xml中指定的type,得到PO对象。

然后根据内省Introspector得到所有的属性描述器,先判断属性是否存在,如果存在,得到writeMethod方法,对PO对象的属性进行赋值。

String str = "MyBatis2PO.Factory";Class clazz = Class.forName(str);Factory obj = (Factory) clazz.newInstance();BeanInfo beanInfo = Introspector.getBeanInfo(clazz);//属性描述器PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {//System.out.println(propertyDescriptor.getName());if("factoryName".equals(propertyDescriptor.getName())){Method writeMethod = propertyDescriptor.getWriteMethod();writeMethod.invoke(obj, "黑马");}}System.out.println(obj.getFactoryName());


0 0
原创粉丝点击