開發框架時,常常須要使用java對象(javaBean)的屬性來封裝程序的數據,封裝javaBean的方法有不少,好比反射,內省,以及使用工具類。下面從反射開始介紹。java
編寫要求:
javaBean自己是一個類,設計該類的時候要遵循一下方法:sql
1.若是成員變量的名字是xxx,則相應地有兩個用來獲得成員變量值和設置變量值的方法,它們分別是getXxx()和setXxx()且是public的:
public datatype getXxx();
public void setXxx(datatype data);
(2)若是成員變量是boolean型數據,使用is代替get方法;:
public boolean isXxx();
(3)須要一個無參數的構造函數。
//javaBean
public class Person {
private int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
//無參數構造函數
public Person(){}
//得到Id屬性
public int getId() {
return id;
}
//設置
public void setId(int id) {
this.id = id;
}
//get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//tostring不在要求之中;
@Override
public String toString() {
return "id:"+ this.id+" name:"+ this.name;
}
}
經過反射更改對象域來封裝JavaBean,經過getDeclaredField方法得到對應的域,並調用set方法進行修改。
下面的方法經過配置文件更改JavaBean的屬性:數據庫
配置文件內容以下:obj.txt
com.rlovep.bean.Person
id=22
name=peace
代碼與註釋:
public class CofigRef {
public static void main(String[] args) {
try {
//得到更改後的對象;
Person p=(Person)getInstance();
System.out.println(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//根據配置文件的內容生產對象的對象而且要把對象的屬性值封裝到對象中。
public static Object getInstance() throws Exception{
//經過字符流進行輸入;
BufferedReader bufferedReader = new BufferedReader(new FileReader("obj.txt"));
String className = bufferedReader.readLine(); //讀取配置文件獲取到完整的類名。
Class clazz = Class.forName(className);
//經過class對象獲取到無參的構造方法
Constructor constructor = clazz.getConstructor(null);
//建立對象
Object o = constructor.newInstance(null);
//讀取屬性值
String line = null;
while((line = bufferedReader.readLine())!=null){
String[] datas = line.split("=");
//經過屬性名獲取到對應的Field對象。
Field field = clazz.getDeclaredField(datas[0]);
field.setAccessible(true);
if(field.getType()==int.class){
//更改屬性內容;
field.set(o, Integer.parseInt(datas[1]));
}else{
field.set(o, datas[1]);
}
}
bufferedReader.close();
return o;
}
此去用反射進行更改,直接更改實現域的值;比較麻煩。須要各類判斷和操做,不適合用於開發。apache
內省(Introspector) 是Java 語言對 JavaBean 類屬性、事件的一種缺省處理方法。Java JDK中提供了一套 API 用來訪問某個屬性的 getter/setter 方法,這就是內省。
1. PropertyDescriptor類:
屬性描述器類,利用該類能夠得到對應屬性的get和set方法。
getReadMethod(),得到用於讀取屬性值的方法;getWriteMethod(),得到用於寫入屬性值的方法;
演示以下:框架
//屬性描述器
PropertyDescriptor descriptor = new PropertyDescriptor("id", Person.class);
//獲取屬性對應的get或者是set方法設置或者獲取屬性了。
Method m = descriptor.getWriteMethod(); //獲取屬性的set方法。
//執行該方法設置屬性值
m.invoke(p,110);
//得到get方法;
Method readMethod = descriptor.getReadMethod(); //是獲取屬性的get方法
System.out.println(readMethod.invoke(p, null));
//Introspector 內省類
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
//經過BeanInfo獲取全部的屬性描述
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); //獲取一個類中的全部屬性描述器
for(PropertyDescriptor p : descriptors){
//得到全部get方法
System.out.println(p.getReadMethod()); //get方法
}
經過這兩個類的比較能夠看出,都是須要得到PropertyDescriptor,只是方式不同:前者經過建立對象直接得到,後者須要遍歷,因此使用PropertyDescriptor類更加方便。
內省封裝比反射相對來講簡單點,可是實質上是反射的一種變體。ide
private int id;
private String userName;
private String pwd;
private int age;
private Date birth;
public class BeanOpr {
private String name;
@Test
/** * * @Title: testHello * @Description: beanutiils拷貝的介紹 * @return:void * @throws * @author peace w_peace@163.com */
public void testHello(){
Admin admin=new Admin();
try {
//得到屬性方法:
System.out.println(BeanUtils.getProperty(admin,"userName"));
//拷貝屬性
BeanUtils.copyProperty(admin, "usetName", "peace");
//相似於設置屬性
BeanUtils.setProperty(admin, "id", 001);
//對象的拷貝
Admin admin2=new Admin();
BeanUtils.copyProperties(admin2, admin);
//輸出兩個admin
System.out.println(admin);
System.out.println(admin2);
//map數據,拷貝到對象中
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
//經過Map拷貝:
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** * * @Title: testRegist * @Description: 實現對不支持的類進行轉換。 * @return:void * @throws * @author peace w_peace@163.com */
@Test
public void testRegist(){
// 註冊日期類型轉換器:1, 自定義的方式
ConvertUtils.register(new Converter() {
/** * 轉換函數,實現對date的轉換。 */
@Override
public Object convert(Class type, Object value) {
//判斷是否爲Date類型
if(type!=Date.class)
return null;
//判斷是否爲空
if(value==null||"".equals(value.toString().trim()))
return null;
try {
//轉換方式
SimpleDateFormat date=new SimpleDateFormat("yyyy-mm-dd");
return date.parse(value.toString());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);
//執行
Admin admin=new Admin();
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
map.put("birth", new Date(2015, 10, 9));
try {
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
/** * * @Title: testRigest2 * @Description: 使用提供的date類型轉換器 * @return:void * @throws * @author peace w_peace@163.com */
public void testRigest2(){
ConvertUtils.register(new DateConverter(), Date.class);
//執行
Admin admin=new Admin();
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
map.put("birth", new Date(2015, 10, 9));
try {
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,而且使用dbutils能極大簡化jdbc編碼的工做量,同時也不會影響程序的性能。
下載連接:連接
此去只是簡要介紹,後面jdbc教程中在作完整介紹使用以下:函數
@Test
/** * * @Title: testQueryOne * @Description: 使用組件提供的結果集對象封裝數據。 * @return:void * @throws * @author peace w_peace@163.com */
public void testQueryOne(){
String sql="select * from admin where id=?";
//獲取鏈接
connection=JdbcUtil.getConnection();
//建立Dbutils核心工具類
QueryRunner qr=new QueryRunner();
//查詢返回單個對象
try {
//使用beanhandle進行封裝
//參數依次爲:鏈接,sql語句,結果處理器,位置參數
//查下你結果封裝到Admin
Admin admin=qr.query(connection,sql, new BeanHandler<Admin>(Admin.class), 4);
System.out.println(admin);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
封裝javaBean的方法介紹就到這裏.來自一條小鯊魚wpeace(rlovep.com)工具