JavaBean

1,JavaBean是一种规范,也是对类的要求。

它要求Java类的成员变量提供getting和setting的方法,这样的成员变量我们称之为JavaBean属性。

比如:

 

public class User {
    private String username;
    private String password;
 
    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
       this.username = username;
    }
    public String getPassword() {
       return password;
    }
    public void setPassword(String password) {
       this.password = password;
    }
}

2,JavaBean属性

JavaBean属性是具有getter/setter方法的成员变量。

也可以只提供getter方法,这样的属性叫只读属性;

也可以只提供setter方法,这样的属性叫只写属性;

如果属性类型为boolean类型,那么读方法的格式可以是get或is。

例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc();

JavaBean属性名要求:前两个字母要么都大写,要么都小写:

3,内省

  1)内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。例如User类有名为username的JavaBean属性,通过两个Method对象(一个是getUsenrmae(),一个是setUsername())来操作User对象。

如果你还不能理解内省是什么,那么我们通过一个问题来了解内省的作用。现在我们有一个Map,内容如下

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public User() {
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
}

 现在需要把map的数据封装到一个User对象中!User类有两个JavaBean属性,一个叫username,另一个叫password。你可能想到的是反射,通过map的key来查找User类的Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过getUsername和setUsername来访问JavaBean属性。

Map<String,String> map = new HashMap<String,String>();
        map.put("username", "admin");
        map.put("password", "admin123");

    BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

       PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

       User user = new User();

       for(PropertyDescriptor pd : pds)  {

           String name = pd.getName(); 

           String value = map.get(name);

           if(value != null)  {

              Method writeMethod = pd.getWriteMethod();

              writeMethod.invoke(user, value);

           }

       }

       System.out.println(user);


  2)获取BeanInfo:通过Java.beans.introspector的getInfo()方法获取Java.beans.BeanInfo实例,比如

           BeanInfo beaninfo=Introspector.getBeanInfo(User.class);

                                  通过BeanInfo可以得到这个类的所有JavaBean属性的PropertyDescriptor对象,

                                       获取属性描述符:PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();每一个PropertyDescription对象对应                                                     一个JavaBean属性,然后就可以通过PropertyDescription对象来获取这个属性的setting/getting方法了

           String getName()获取JavaBean属性名称

           Method getWriterMethod() 获取写方法

           Method getReadMethod() 获取读方法

                                       参考上面的代码

       3)提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!使用beanutils需要的jar包:

             commons-beanutils.jar  和  commons-logging.jar;

            可以直接设置 username 和 password 的属性值 admin 和 admin123 

        User user = new User();
        
        BeanUtils.setProperty(user, "username", "admin");
        BeanUtils.setProperty(user, "password", "admin123");

             也可以获取属性值

User user = new User("admin", "admin123");
        
        String username = BeanUtils.getProperty(user, "username");
        String password = BeanUtils.getProperty(user, "password");
        
        System.out.println("username=" + username + ", password=" + password);

           还可以封装Map数据到JavaBean对象中

Map<String,String> map = new HashMap<String,String>();
        map.put("username", "admin");
        map.put("password", "admin123");
        
        User user = new User();

        BeanUtils.populate(user, map);
        
        System.out.println(user);
原文地址:https://www.cnblogs.com/QianYue111/p/9739819.html