黑马程序员--javase高级基础 内省引出的javabean

来源:互联网 发布:lnmp一键 安装php扩展 编辑:程序博客网 时间:2024/06/08 05:56
</pre><h2><span style="font-size:18px;"></span><pre name="code" class="java">
一.内省

内省的英文单词为IntroSpecter,意思是检查、视察、体检之意,对于程序即对内部进行检查,了解更多的底层细节。

内省的作用重要是针对JavaBean进行操作;

二.JavaBean

1、简述:

        1)JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法符合某种特殊的命名规则。

        2)它是一种特殊的Java类,其中的方法符合特殊的规则。只要一个类中含有get或is和set打头的方法,就可以将其当做JavaBean使用。

        3)字段和属性:

             字段就是我们定义的一些成员变量,如private String name;等

             JavaBean的属性是根据其中的setter和getter方法来确定的,而不是依据其中的变量,如方法名为setId,则中文意思是设置Id,getId也是如此;去掉set或者get前缀,剩余部分就是属性名称。如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:getAge/setAge-->age;gettime-->time;setTime-->time;getCPU-->CPU。

        总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

2、组成:

一个JavaBean由三部分组成:

(1) 属性(properties);

(2) 方法(method);

(3) 时间(event);


3、作用:

如果要在两个模板之间传递多个信息,可将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO),这些信息在类中用私有字段来储存,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。


4、使用JavaBean的好处:

1)在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

2)JDK中提供了对JavaBean进行操作的API,这套API称为内省,若要自己通过getX的方式来访问私有x,可用内省这套API,操作JavaBean要比使用普通的方式更方便。


举例:

package cn.itcast.day1;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.io.ObjectInputStream.GetField;import java.lang.reflect.Method;public class IntroSpector {public static void main(String[] args) throws Exception{FieldReflex fr = new FieldReflex(3, 5);String propertyName = "x";//普通内省方法获取xPropertyDescriptor pd = new PropertyDescriptor(propertyName, fr.getClass());//获取getX方法Method methodGetX = pd.getReadMethod();Object retval = methodGetX.invoke(fr);System.out.println(retval);//复杂内省方法设置xBeanInfo beanInfo = Introspector.getBeanInfo(fr.getClass());PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//在pds集合中迭代获取setX方法并调用for(PropertyDescriptor pd1 : pds){if(pd1.getName().equals(propertyName)){Method methodSetX = pd1.getWriteMethod();methodSetX.invoke(fr, 7);System.out.println(fr.getX());break;}}}}





0 0
原创粉丝点击