JavaBean
JavaBean是一种JAVA语言写成的可重用组件(类)
必须遵循一定的规范:
- 类必须使用public修饰;
- 必须保证有公共无参数构造器;
- 包含了属性的操作手段(给属性赋值,获取属性的值);
分类:
- 复杂:UI,比如Button,Panel,Window类
- 简单:domain,dao,service组件,封装数据,操作数据库,逻辑运算等
成员:
- 方法:Method
- 事件:Event
- 属性:property
属性:
- attribute:表示状态,Java中没有该概念,很多人吧字段(Field)称之为属性(attribute)
- property:表示状态,但不是字段,是属性的操作方法(getter,setter)决定的,框架中使用的大多是属性
内省机制
作用:用于查看和操作JavaBean中的属性
- 获取JavaBean中的每一个属性名和属性类型;
- 通过getter方法获取属性值,通过setter方法的设置属性值;
//内省机制:操作User类值的属性
public class IntrospectorDemo {
public static void main(String[] args) throws Exception {
//1.获取JavaBean的描述对象
BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
User u = User.class.newInstance();
//2.获取JavaBean中的属性的描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
System.out.println(u);
for (PropertyDescriptor pd : pds) {
//获取当前属性的名称
System.out.println("属性名:" + pd.getName());
//获取当前属性的getter方法
System.out.println("getter:" + pd.getReadMethod());
//获取当前属性的setter方法
System.out.println("setter:" + pd.getWriteMethod());
System.out.println("-------------------------");
if ("name".equals(pd.getName())) {
Method setter = pd.getWriteMethod();
setter.invoke(u, "Bryan");
}
}
System.out.println(u);
}
}
Output:
----------------------------------------------------------------------------
User [name=null, age=0, man=false]
属性名:age
getter:public int com.Bryan._03_introspector.User.getAge()
setter:null
-------------------------
属性名:man
getter:public boolean com.Bryan._03_introspector.User.isMan()
setter:public void com.Bryan._03_introspector.User.setMan(boolean)
-------------------------
属性名:name
getter:null
setter:public void com.Bryan._03_introspector.User.setName(java.lang.String)
-------------------------
User [name=Bryan, age=0, man=false]
JavaBean和Map之间的相互转化
JavaBean拥有多组属性名和属性值,每一个属性名称对应一个属性值,属性名称是不同的;
Map拥有多组key-value,每一个key对应一个value,key是不同的;
如果把JavaBean中的属性,名称看成是key,二者就是等价的。
public class BeanUtils {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setId(123L);
p.setName("Bryan");
p.setAge(19);
Map<String, Object> map = bean2map(p);
System.out.println(map);
System.out.println("-------------------------");
Object obj = map2bean(map, Person.class);
System.out.println(obj);
}
public static Map<String, Object> bean2map(Object bean) throws Exception {
Map<String, Object> map = new HashMap<>();
BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();
Object value = pd.getReadMethod().invoke(bean);
map.put(name, value);
}
return map;
}
//把Map对象转化为JavaBean
public static <T> T map2bean(Map<String, Object> map, Class<T> beanType) throws Exception {
//创建JavaBean对象
Object obj = beanType.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(beanType, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//从Map中获取和属性同名的key的值
Object value = map.get(pd.getName());
//调用setter方法,设置属性值
pd.getWriteMethod().invoke(obj, value);
}
return (T) obj;
}
}
Output:
----------------------------------------
{name=Bryan, id=123, age=19}
-------------------------
Person [id=123, name=Bryan, age=19]
注解
JDK中的注解:
- @Override 限定覆写父类方法
- @Deprecated 标记已过时,不推荐使用
- @SuppressWarnings 抑制编译器发出的警告
- @SuppressWarnings(value="xxx')
- @SuppressWarnings("all")
- @SafeVarargs 抑制堆污染警告
该注解仅仅是抑制编译器不要报警告,但是风险依然存在,仅仅是不提示而已。