Java之路(九):JavaBean规范、内省机制及注解

JavaBean

JavaBean是一种JAVA语言写成的可重用组件(类)

必须遵循一定的规范:

  1. 类必须使用public修饰;
  2. 必须保证有公共无参数构造器;
  3. 包含了属性的操作手段(给属性赋值,获取属性的值);

分类:

  1. 复杂:UI,比如Button,Panel,Window类
  2. 简单:domain,dao,service组件,封装数据,操作数据库,逻辑运算等

成员:

  1. 方法:Method
  2. 事件:Event
  3. 属性:property

属性:

  1. attribute:表示状态,Java中没有该概念,很多人吧字段(Field)称之为属性(attribute)
  2. property:表示状态,但不是字段,是属性的操作方法(getter,setter)决定的,框架中使用的大多是属性

内省机制

作用:用于查看和操作JavaBean中的属性

  1. 获取JavaBean中的每一个属性名和属性类型;
  2. 通过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中的注解:

  1. @Override             限定覆写父类方法
  2. @Deprecated        标记已过时,不推荐使用
  3. @SuppressWarnings  抑制编译器发出的警告
  4. @SuppressWarnings(value="xxx')
  5. @SuppressWarnings("all")
  6. @SafeVarargs           抑制堆污染警告

该注解仅仅是抑制编译器不要报警告,但是风险依然存在,仅仅是不提示而已。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值