文章目录
  1. 1. 内省

内省

  1. JavaBean和属性的概念

    javaBean的特点

    1. 必须由默认的构造方法
    2. 字段都是私有的
    3. 提供针对字段的 getter 或 setter 方法(属性)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      public class Person {
         private String name; // 叫字段
         public String getName(){}  // 读属性
         public void setName(String name){}  //写属性
      
         private boolean married;
         //类似于  public boolean getMarried(){}
         public boolean isMarried(){}
         public void  setMarried(){}
      }
      
  2. 内省就通过getter和setter设置 JavaBean 的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void testIt() throws Exception {
    Class<?> clazz = Class.forName("io.zhpooer.test.Person");
    Person bean = (Person) clazz.newInstance();
    PropertyDescriptor pd1 = new PropertyDescriptor("name", clazz);
    Method m1 = pd1.getWriteMethod(); // 获取name的写方法
    m1.invoke(bean, "呵呵");

    Method m2 = pd1.getReadMethod();
    String name = (String)m2.invoke(bean, null);
    
    System.out.println(name);
}

@Test
public void test2() throws Exception {
        Class<?> clazz = Class.forName("io.zhpooer.test.Person");
    BeanInfo binfo = Introspector.getBeanInfo(clazz);
    PropertyDescriptor pds[] = binfo.getPropertyDescriptors();
    for(PropertyDescriptor p : pds){
    	System.out.println(p.getName());
    }
}

/**
ouput: 
呵呵
age
class
name
**/

借助 org.apache.commons.beanutils.BeanUtils;

1
2
3
Person p = (Person) clazz.newInstance();
BeanUtils.setProperty(p, "name", "钟欣桐");
BeanUtils.getProperty(p, "name");
文章目录
  1. 1. 内省