欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Java 内省introspector相关原理代码解析

时间:2021-08-07 08:43:47|栏目:JAVA代码|点击:

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());
    
  }
}

上一篇:Java手写线程池的实现方法

栏    目:JAVA代码

下一篇:spark之Standalone模式部署配置详解

本文标题:Java 内省introspector相关原理代码解析

本文地址:http://www.codeinn.net/misctech/164877.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有