码迷,mamicode.com
首页 > 其他好文 > 详细

内省技术

时间:2017-11-03 14:10:06      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:控制器   out   getter   hashmap   字段   public   实现   内省   static   

1 javaBean是什么?

  • javabean是一种规范。其实就是一种实体类,需要满足以下的条件:
    • ①必须是public的
    • ②必须实现Serializable接口
    • ③字段必须私有化
    • ④必须提供setter和getter方法  

 

  • 示例:
package com;

import java.io.Serializable;
import java.util.Arrays;

/**
 * 2017/11/2
 * 说明:
 */
public class Student implements Serializable{
    private String name ;//字段
    private int age;//字段
    private int[] aa;



    public int[] getAa() {
        return aa;
    }

    public void setAa(int[] aa) {
        this.aa = aa;
    }

    public String getName() {//读属性
        return name;
    }

    public void setName(String name) {//写属性
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", aa=" + Arrays.toString(aa) +
                ‘}‘;
    }
}
  • [注意]:被private修改过的不要属性,称为字段,属性是指如上面的代码所示,setName,将set去掉,然后将Name的N变为小写,虽然和字段相同,但是含义是完全不一样的。

 

2 内省

  • 内省是构建在java反射机制的基础之上的,换句话说,没有反射就没有内省。
  • 内省主要是用来操作javabean的,很多框架内部都用到了内省技术。

技术分享

 

  • 从上面的图中,我们可以看出,javabean主要就是用来在各层之间传递数据的。为什么?因为我们将数据封装到javabean中的话,不需要写很多参数。如下所示:
public void add(Student stu){}
public void add(String name,int age);

 

  • 而内省技术,就可以将页面上的数据在传递给控制器之前封装到javabean中,这样,在控制器里我们可以直接操作数据,而不需要再进行其他的处理。

技术分享

 

 

  • 示例:内省的示例代码
package com;

import java.io.Serializable;
import java.util.Arrays;

/**
 * 2017/11/2
 * 说明:
 */
public class Student implements Serializable{
    private String name ;//字段
    private int age;//字段
    private int[] aa;



    public int[] getAa() {
        return aa;
    }

    public void setAa(int[] aa) {
        this.aa = aa;
    }

    public String getName() {//读属性
        return name;
    }

    public void setName(String name) {//写属性
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", aa=" + Arrays.toString(aa) +
                ‘}‘;
    }
}
package com;


import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 2017/11/2
 * 说明:内省技术来封装javaBean技术
 */
public class StudentTest {
    public static void main(String[] args) throws Exception{
        Student student = new Student();
        Map<String,Object> properties = new HashMap<>();
        properties.put("name","张三");
        properties.put("age",20);
        properties.put("aa",new int[]{1,2});

        populate(student,properties);
        System.out.println(student);
    }

    public static void populate(Object Obj,Map<String,Object> properties) throws Exception {
        BeanInfo beanInfo = Introspector.getBeanInfo(Obj.getClass());
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for(PropertyDescriptor pd : pds){
            if(!pd.getName().equals("class")){
                String property = pd.getName();//获取每一个属性值
                Method method = pd.getWriteMethod();
                //遍历properties 的Map集合
                 for(Iterator<Map.Entry<String,Object>> iterator = properties.entrySet().iterator();iterator.hasNext();){
                    Map.Entry<String,Object>  entry = iterator.next();
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    if(key.equals(property)){
                        method.invoke(Obj,value);
                    }
                 }
            }
        }
    }
}

 

  • 当然,你也可以使用apache的BeanUtils工具包,来将表单上的数据封装到javaBean中。

 

内省技术

标签:控制器   out   getter   hashmap   字段   public   实现   内省   static   

原文地址:http://www.cnblogs.com/xuweiweiwoaini/p/7777687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!