PropertyDescriptor属性描述器简单使用

这个类给我第一感觉就是,OC里的RunTime里的动态添加属性,详细就不说了,简单介绍一下使用方法吧.

首先,我使用的是IDEA(Mac)版本的,这里我通过本地服务器(Tomcat) 来做这个演示.

  1. 先创建一个html,这里就以最普通的登录界面来做吧
用户名
爱好: 篮球 足球 网球

注册

显示效果

验证码我删掉了(直接用的ValidateCode)


PropertyDescriptor属性描述器简单使用_第1张图片
image.png
  1. 然后创建一个类,用来保存这些属性,名字随便取,我就取个User吧
public class User {
    private String userName;
    private String[] favorite;
    private String city;
/*
这里实现setter,getter方法(有点长就不贴了)
*/
    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", favorite=" + Arrays.toString(favorite) +
                ", city='" + city + '\'' +
                '}';
    }
}
  1. 最后就是创建一个servlet,在doGet方法里,做我们要做的事情
try {
        User user = new User();
        System.out.println("之前属性"+user);

        //1.获取所有name 和 value
        Map parameterMap = request.getParameterMap(); 
       
         // 获取每一个字典对象
        for (Map.Entry m:parameterMap.entrySet()) {
            String name = m.getKey();
            String[] value = m.getValue();

            //创建一个属性描述器
            PropertyDescriptor pd = new PropertyDescriptor(name,User.class);
            Method setter = pd.getWriteMethod();

            if (value.length == 1){
                setter.invoke(user,value[0]);//给单个值的变量赋值
            }else{
                setter.invoke(user,(Object)value);//给复选框赋值
            }
        };
        System.out.println("之后属性"+user);}catch (Exception e){
           e.printStackTrace();
       }

这里创建属性描述器,内部会再调用这个方法

public PropertyDescriptor(String propertyName, Class beanClass,
String readMethodName, String writeMethodName)
里面会将User类里面跟我们给的name相同的所有的setter方法赋值给writeMethodName, get方法赋值给readMethodName.
这里贴几条内部实现方法

 Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName));
 // 这个SET_PREFIX == static final String SET_PREFIX = "set";
// capitalize这个方法,是来操作我们传进去的 name 的通过下面的方法,将头字母转为大写,以后大家如果需要转头字母,可以直接复制这个哈哈,毕竟是java自己的(原装总是好的)
public static String capitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        return name.substring(0, 1).toUpperCase(ENGLISH) + name.substring(1);
    }


所以当我们遍历的时候, Method setter = pd.getWriteMethod(); 这个就是获得setter方法,当遍历结束的时候,我们所有的值就都已经赋好值了

(注意的一点是,属性名最好跟html里的name一样,这样快捷生存setter,getter方法的时候,就不需要再改了,不易报错)#。

好了,大家可以试试,这是这个小demo

你可能感兴趣的:(PropertyDescriptor属性描述器简单使用)