JavaBean

JavaBean

在Java中一个非常重要的组件,可重用.如果想要在多个模块中重用,必须遵循一定的规范.

1.必须使用public修饰
2.必须提供公共的无参数构造器
3.字段都是私有化的
4.提供get和set方法

JavaBean中重要成员

方法
事件
属性:property,不是字段,而是通过get/set方法推导出来的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class HelloWorld {
private String name;

/**
* 标准的get方法
* get之后首字母小写,称之为属性
* */
public String getName() {
return name;
}

/**
* 标准的set方法
* set之后首字母大写,称之为属性
* */
public void setName(String name) {
this.name = name;
}
}

内省操作

内省机制

核心类:Introspector

专门用来操作JavaBean的属性

核心方法

BeanInfo getBeanInfo(class<?> beanclass)

常用API

java.beans.Introspector类常用API:

static BeanInfo getBeanInfo(Class<?> beanClass) : 获取字节码对象对应的JavaBean信息 
static BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass)

java.beans.BeanInfo接口常用API:

PropertyDescriptor[] getPropertyDescriptors() : 获取所有的属性描述器

java.beans.PropertyDescriptor类常用API:

String getName() : 获得属性的名称 
Class<?> getPropertyType() : 获得属性的类型 
Method getReadMethod() : 获得用于读取属性值的方法
Method getWriteMethod() : 获得用于设置属性值的方法

JavaBean和Map的转换

从浏览器传递过来的数据,服务器获取数据后.需要将数据放到一个对象中,传递的数据类似于key=value的形式.所以需要将map转换成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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package me.cscar.con.conversion;

import org.junit.Test;

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

public class JavaBeanMap {
@Test
public void test() throws Exception {
//Person p = new Person("蛤蛤", 90);

Class<Person> clz = Person.class;
Constructor<Person> con = clz.getConstructor(String.class, Integer.class);
Person p = con.newInstance("蛤蛤", 90);

Map<String, Object> map = bean2map(p);
System.out.println(map);

System.out.println(map2bean(map, clz));
}

/**
* JavaBean对象转换成map
* 把JavaBean对象中的属性值,获取出来,放在map中
*/
public static Map<String, Object> bean2map(Object obj) throws Exception {

BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(), Object.class);
//创建map对象
Map<String, Object> map = new HashMap<>();
//获取所有的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor ele : pds) {
String key = ele.getName();
Method m = ele.getReadMethod();
Object value = m.invoke(obj);
map.put(key, value);
}
return map;
}

/**
* map转换成JavaBean对象
* 把map的数据取出来,放到JavaBean对应的属性上
*/
public static Object map2bean(Map<String, Object> map, Class clz) throws Exception {

//使用字节码对象创建对象
Object obj = clz.newInstance();
//获取字节码对象对应JavaBean信息
BeanInfo beanInfo = Introspector.getBeanInfo(clz, Object.class);
//获取所有的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//遍历
for (PropertyDescriptor ele : pds) {
String key = ele.getName();
Object value = map.get(key);
Method m = ele.getWriteMethod();
m.invoke(obj, value);
}
return obj;
}
}