Java中的内省(introspector)

1. JavaBean (有get/set属性,和默认构造器等规范的java类)

 

import java.util.Date;

public class Student {
    // 这是 字段
    private String name;
    private int age;
    private Date birthday;

    // 这是 属性 
    //(get、set开头的方法,getName、setName算一个属性,单独一个set或get也算一个属性)
    // 属性名为 去掉get、set后  第一个大写字母变小写字母。
    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;
    }
    
    public int getAbc(){ //注意这也是一个属性,属性名为 abc
        return 10;
    }
    /*
    public int getefg(){ //注意这也是一个属性,属性名为 efg
        return 10;
    }*/

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

}

 

测试

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

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class Test1 {
    public static void main(String[] args) throws Exception {
        test05();
    }

    // 获取属性描述器  Introspector.getBeanInfo(Student.class).getPropertyDescriptors();
    private static void test01() throws Exception {
        BeanInfo bf = Introspector.getBeanInfo(Student.class);
        PropertyDescriptor[] pds = bf.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            System.out.println(pd.getName());
        }
        /*
            abc
            age
            class //这个是Object类里的
            name
         */
    }
    
    // 使用内省 调用set、get方法
    private static void test02() throws Exception {
        Student stu = new Student();
        PropertyDescriptor pd = new PropertyDescriptor("name", Student.class);
        Method setter = pd.getWriteMethod();
        setter.invoke(stu, "tom");
        Method getter = pd.getReadMethod();
        System.out.println(getter.invoke(stu));
    }
    
    
    /**
     * 以上使用的 java源码里的 java.beans包
     * 接下来有更方便的,Apache 组织提供的  commons-beanutils-1.8.3.jar 
     * 导入:commons-beanutils-1.8.3.jar  commons-logging-1.1.1.jar
     */
    private static void test03() throws Exception{
        Student stu = new Student();
        BeanUtils.setProperty(stu, "name", "白居易");
        System.out.println(stu.getName());
        String name = BeanUtils.getProperty(stu, "name");
        System.out.println(name);
        //BeanUtils 支持8中基本类型 自动转换
        BeanUtils.setProperty(stu, "age", 19);
        BeanUtils.setProperty(stu, "age", "18");
        System.out.println(stu.getAge());
        //PropertyUtils.setSimpleProperty(stu, name, value);
    }
    
    private static void test04() throws Exception{
        Student stu = new Student();
        //set/get 日期 Date
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        BeanUtils.setProperty(stu, "birthday", "1999-11-10");
        System.out.println(stu.getBirthday());
        String s = BeanUtils.getProperty(stu, "birthday");
        System.out.println(s);
    }
    
    /**
     * 一下整个赋值给 javaBean 对象,使用 BeanUtils.populate
     * @throws Exception
     */
    private static void test05() throws Exception{
        Student stu = new Student();
        Map m = new HashMap();
        m.put("name", "Lee");//注意:key名一定要与对象中的变量名一致
        m.put("age", "18");//注意:key名一定要与对象中的变量名一致
        m.put("birthday", "2020-7-4");//注意:key名一定要与对象中的变量名一致
        
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        BeanUtils.populate(stu, m);
        System.out.println(stu.getBirthday());
        
    }
}

 

posted @ 2020-07-04 12:02  htj10  阅读(270)  评论(0编辑  收藏  举报
TOP