JavaWeb基础之JavaBean

1.JavaBean规范

(1)广义:所有的类都是JavaBean,狭义:遵循某一规范的类
(2)JavaBean是一种Java语言写成的可重用组件(类),必须遵循一定的规范:

  • 类必须使用public修饰符,一个文件一个类
  • 必须保证有公共无参数构造器
  • 包含了属性的操作手段(给属性赋值,获取属性值
//演示JavaBean
public class User {
	private Long id;
	private String firstName;
	private String lastName;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
}

2.JavaBean分类

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

3.JavaBean成员以及属性

(1)成员:
1):方法:Method
2):事件:event
3):属性:property
(2)属性:
1):attribute:表示状态,Java中只有注解中的抽象方法有该概念,很多人把字段(Field)称之为属性(attribute),学术上讲这是完全错误的.
2):property: 表示状态,但是不是字段,是属性的操作方法(getter/setter)决定的,框架中使用的大多是是属性.
(3)设置属性值(setter方法):
public void setXxx(数据类型 变量){
把参数变量赋值给字段操作;
}
若:setName---->属性:name
若:setUserName---->属性:userName
若:setISBN-------->属性:ISBN(第一第二个字母都大写,后面的字母照写)
(4)获取属性值(getter方法):
public 数据类型 getXxx(){
返回一个结果值/返回一个字段存储的值;
}
若:getName---->属性:name
若:getUserName---->属性:userName
若:getISBN-------->属性:ISBN
若:数据类型是boolean,则不叫get方法,而是is方法.

4.Lombok插件

(1)Lombok是什么?
Lombok是一款小巧的代码生成工具。官方网址:http://projectlombok.org/
LomBok主要特性有:自动生成默认的getter/setter方法、自动化的资源管理(通过@Cleanup注解)及注解驱动的异常处理等。目前在国外广泛应用。
LomBok它和jquery一样,目标是让程序员写更少的代码,以及改进一些原始语法中不尽人意的地方。Lombok能做到这一点。既不是用annotations process,也不是用反射。而是直接黑到了编译过程中。所以对运行效率没有任何影响,我们可以通过反编译class文件进行验证。

(2)为何项目中要引入Lombok(让程序员编写更少的代码):
主要为以下三点:

  1. 提高开发效率
  2. 使代码直观、简洁、明了、减少了大量冗余代码(一般可以节省60%-70%以上的代码)
  3. 极大减少了后期维护成本
    如何安装,如何使用
    1:java -jar lombok.jar(指定路径cmd输入)
    2:在Java项目中导入lombok.jar包
    3:使用注解@Setter/@Getter/@ToString/@Data/@AllArgsConstructor/@NoArgsConstructor等
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
	private Long id;
	private String firstName;
	private String lastName;
	private boolean man;
}

5.Introspector

(1)Introspector:内省/自省:获取和操作JavaBean中的属性.
操作JavaBean的属性:
1):获取属性相关信息.属性名,属性类型
2):给属性设置数据,调用setter方法.
3):获取属性的数据,调用getter方法
(2)java.beans.Introspector接口:
常用API:
static BeanInfo getBeanInfo(Class<?> beanClass) : 获取字节码对象对应的JavaBean信息
static BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass)
(3)java.beans.BeanInfo接口:
常用API:
PropertyDescriptor[] getPropertyDescriptors() : 获取所有的属性描述器
(4)java.beans.PropertyDescriptor接口:
常用API:
String getName() : 获得属性的名称
Class<?> getPropertyType() : 获得属性的类型
Method getReadMethod() : 获得用于读取属性值的方法
Method getWriteMethod() : 获得用于设置属性值的方法

IntrospectorDemo.java(读取上面Person类)

public class IntrospectorDemo {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//需求:获取Person类中的属性
		//1:通过Introspector分析出字节码对象的信息BeanInfo
		BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
		//2:通过调用BeanInfo的方法获取对象的属性描述器
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor pd : pds) {
			//获取属性的名称
			String name = pd.getName();
			System.out.println("属性名:" + name);
			if(name.equals("fullName")) {
				Method method = pd.getReadMethod();
				Object obj = method.invoke(new User());
				System.out.println(obj);
			}
			//获取属性的类型
			System.out.println("属性类型:" + pd.getPropertyType());
			//获取操作属性的方法getter/setter
			System.out.println("读属性的方法:" + pd.getReadMethod());
			System.out.println("写属性的方法:" + pd.getWriteMethod());
			System.out.println("---------");
		}
	}
}

运行结果:
Java学习之路(二)

6.JavaBean和Map之间的转换

(1)JavaBean和 Map相互转换:
Map是由key-value组成,key是不能重复的.
JavaBean是由属性名和属性值组成,属性名是不同的.
如果把JavaBean的属性名看做是Map的key,把属性值看做是Map的value,那么一个Map对象和一个JavaBean是等级的.
(2)把JavaBean转换为Map对象.
public static Map<String,Object> bean2map(Object bean){}
(3)把Map对象转换为JavaBean.
public static T map2bean(Map<String,Object> beanMap,Class beanType){}

BeanUtil.java

/*
* 通过JavaBean和Map的转换方法
* @author Jie
*/public class BeanUtil {
	//把JavaBean转换为Map对象
	public static Map<String,Object> bean2map(Object bean) throws Exception{
		Map<String,Object> map = new HashMap<>();
		//1.获取对象的真实类型
		Class<?> clz = bean.getClass();
		BeanInfo beanInfo = Introspector.getBeanInfo(clz, Object.class);
		//2.获取类型的属性描述器
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor pd : pds) {
			//3.获取属性的名字
			String key = pd.getName();
			//4.获取属性的值getter方法
			Method method = pd.getReadMethod();
			Object value = method.invoke(bean);
			map.put(key, value);
		}
		return map;
	}
	
	//把Map对象转换为JavaBean.
	public static <T> T map2bean(Map<String,Object> beanMap,Class <T> beanType) throws Exception{
		@SuppressWarnings("deprecation")
		T obj = beanType.newInstance();
		//1.获取属性描述器
		BeanInfo beanInfo = Introspector.getBeanInfo(beanType, Object.class);
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor pd : pds) {
			//2.获取属性的名字
			String key = pd.getName();
			Object value = beanMap.get(key);
			//3.获取写属性的方法setter方法
			Method method = pd.getWriteMethod();
			method.invoke(obj, value);
		}
		return obj;
	}
}

7.BeanUtils

(1)第三方开源组织apache提供的快捷操作JavaBean属性的工具类

BeanUtilsDemo.java

public class BeanUtilsDemo {
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		Person p = new Person(1L, "尼玛", "王", true);
		Map<String,String> map = BeanUtils.describe(p);
		System.out.println(map);
		System.out.println("-----------");
		Person p2 = new Person();
		System.out.println(p2);
		//拷贝全部属性
		BeanUtils.populate(p2, map);
		System.out.println(p2);
		System.out.println("-----------");
		Person p3 = new Person();
		System.out.println(p3);
		//拷贝全部属性
		BeanUtils.copyProperties(p3, p2);
		System.out.println(p3);
	}
}

运行结果:
Java学习之路(二)
(2)当转换的类型不是常用类型时需要自己注册转换器,如String -> Date
使用CovertUtils注册创建一个日期格式转换器
ConvertUtils.register方法(了解即可)

public class BeanUtilsDemo {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Person p = new Person(1L, "尼玛", "王", true, null);
		Map<String, String> map = BeanUtils.describe(p);
		System.out.println(map);
		System.out.println("-----------");
		ConvertUtils.register(new Converter() {
			@Override
			public <T> T convert(Class<T> clz, Object value) {
				try {
					//参数1:类型 参数2:需要转换的值
					SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
					java.util.Date date =  format.parse((String) value);
					return (T)date;
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					throw new RuntimeException(e);
				}
			}
		}, java.util.Date.class);
		//拷贝单个属性
		BeanUtils.copyProperty(p, "birthday", "2014-10-10");
		System.out.println(p);
	}
}

运行结果:
Java学习之路(二)

相关文章: