代码改变世界

黑马程序员-张老师基础加强3-内省

2014-06-06 18:43  黑马程序员*  阅读(377)  评论(0编辑  收藏  举报

内省:javaBean

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

JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

一、setId()的属性名id

二、isLast()的属性名last

三、setCPU的属性名是什么?CPU

四、getUPS的属性名是什么?UPS

PropertyDescriptor.

    常用方法

    Method getReadMethod()

            获得应该用于读取属性值的方法。 对应get()方法.

    Method getWriteMethod()

            获得应该用于写入属性值的方法。 对应set()方法.

      构造函数 :PropertyDescriptor(String propertyName, Class<?> beanClass)

       参数:要查找的属性名,和其所属的类            

练习:获取一个类中的Age的值

类 PropertyDescriptor:PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。  

public static void main(String[] args) throws  Exception {
        //使用反射的方式获取 。
        //1.0 获取Class文件
        //2.0 获取method(getAge):注意属性名的大小写转换
        //使用反射的方式获取
        Class clazz =Class.forName("cn.itcast.InspectorDemo");
        InspectorDemo Inspector = (InspectorDemo)clazz.newInstance();
        Method method = clazz.getMethod("getAge");        
        int age = (Integer)method.invoke(Inspector);
        System.out.println(age);
        //设置
        Method method1 = clazz.getMethod("setName", String.class);
        method1.invoke(Inspector, "zhangsan");
        //获取设置后的值
        Method method3 = clazz.getMethod("getName");        
        String name = (String)method3.invoke(Inspector);
        System.out.println(name);        
    //2 使用javaBean获取 使用PropertyDescriptor类
        String propertyName= "age";
        //注意否早方法里面属性名是以小写字母开头。
        PropertyDescriptor pd = new PropertyDescriptor(propertyName,cn.itcast.InspectorDemo.class);
        Method methodgetAge  = pd.getReadMethod();//read相当于get()方法。writer()相当于set()
        InspectorDemo Inspector1 = new InspectorDemo(); 
        Object retval =                 methodgetAge.invoke(Inspector1);
        System.out.println(retval);    
//通过javabean设置
        Method methodsetAge =pd.getWriteMethod();
        methodsetAge.invoke(Inspector1, 30);
    }}
class InspectorDemo{
    private int age=20;
    private String name="lsisi";
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }}

注意:使用反射和内省获取成员的区别是:反射需要知道方法的名字和参数,而内省不需要。 

Beanutils工具包

Beanttils.getProperty(Object bean,String name)

Beanttils.getProperty(Object bean,String name,String value)

这连个方法接收都是字符串,因为在javaWeb中通过;浏览器传输带数据都是字符串形式

beanutils方法的应用

    BeanUtils.setProperty(rf1, "x", "9");//数字用字符串形式表示。

BeanUtils.setProperty(rf1, "birthday.time","111");//可以设置人的头的眼睛的颜色,逐级设置。

map对象和beanutils之间的相互转换。

    java1.7 Map map = {map,key,value};

    BeanUtils.setProperty(map, key, value)