亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

【JavaEE】Java內省Introspector、PropertyDescriptor與JavaBean

2019-11-11 06:48:50
字體:
來源:轉載
供稿:網友

1.java內省概念

Sun公司開發了一套API,專門用于操作Java對象的屬性。【Introspector】 在開發框架時,需要使用Java對象的屬性來封裝程序的數據,使用反射技術完成此類操作過于麻煩,我們使用內省。 內省(Introspector) 是Java 語言對 JavaBean 類屬性、事件的一種缺省處理方法。

JavaBean是一種特殊的類,主要用于傳遞數據信息,這種類中的方法主要用于訪問私有的字段,且方法名符合某種命名規則。 如果在兩個模塊之間傳遞信息,可以將信息封裝進JavaBean中,這種對象稱為”值對象”(Value Object),或”VO”。 方法比較少。這些信息儲存在類的私有變量中,通過set()、get()獲得。 在Student中有屬性name, age, birthday。我們可以通過getName, setName來訪問name屬性,這就是默認的規則。 Java JDK中提供了一套 API 用來訪問某個屬性的 getter/setter 方法,這就是內省。 PRopertyDescriptor類: PropertyDescriptor類表示JavaBean類通過存儲器導出一個屬性。主要方法: 1. getReadMethod(),獲得用于讀取屬性值的方法; 2. getWriteMethod(),獲得用于寫入屬性值的方法; 3. setReadMethod(Method readMethod),設置用于讀取屬性值的方法; 4. setWriteMethod(Method writeMethod),設置用于寫入屬性值的方法。

通過PropertyDescriptor與Introspector的比較可以看出,都是需要獲得PropertyDescriptor,只是方式不一樣: PropertyDescriptor通過創建對象直接獲得,Introspector需要遍歷, 所以使用PropertyDescriptor類更加方便。

Introspector類,將JavaBean中的屬性封裝起來進行操作。 1.在程序中把一個類當做JavaBean來看,調用Introspector.getBeanInfo()方法, 得到的BeanInfo對象封裝了這個類的屬性信息。 2.通過BeanInfo來獲取屬性的屬性描述器PropertyDescriptor 。

3.通過PropertyDescriptor獲取某個屬性對應的getter/setter方法, 然后通過反射機制來調用這些方法。

BeanInfo bi = Introspector.getBeanInfo(Student.class); PropertyDescriptor [] pds = bi.getPropertyDescriptors();

BeanUtils工具包 內省操作非常的繁瑣,所以所以Apache開發了一套簡單、易用的API來操作Bean的屬性,BeanUtils工具包。 beanutils內省框架(依賴commons-logging):apache 準備包:commons-beanutils.jar, commons-logging.jar BeanUtils工具包: 下載:commons-beanutils.jar http://commons.apache.org/beanutils/  commons-logging.jar http://commons.apache.org/logging/

1.獲得屬性的值,例如,BeanUtils.getProperty(stu,”stuName”),返回字符串 2.設置屬性的值,例如,BeanUtils.setProperty(stu,”age”,38),參數是字符串或基本類型自動包裝。 設置屬性的值是字符串,獲得的值也是字符串,不是基本類型。    3.BeanUtils的特點: ①對基本數據類型的屬性的操作:String<—–>基本類型 在WEB開發、使用中,錄入和顯示時,值會被轉換成字符串,但底層運算用的是基本類型,這些類型轉到動作由BeanUtils自動完成。 ②非基本類型的屬性的操作:String<—-> 其他類型 例如:

public void test5 () throws Exception{ Student s = new Student (); //給BeanUtils注冊轉換器, ConvertUtils.register(new Converter (){ //type是目標類型, value是當前傳入的值 public Object convert(Class type, Object value) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //字符串轉換為Date String v= (String) value; try{ Date d = df.parse(v); return d; }catch (ParseException e){ throw new RuntimeException (e); } } }, Date.class); BeanUtils.setProperty(s, "birthday", "1990-08-25"); System.out.println(s.getBirthday()); } /** * 給BeanUtils注冊轉換器,參數:converter 要注冊的轉換器 * clazz 此轉換器執行的轉換的目標類 */ public static void register(Converter converter, Class clazz); public interface Converter { /* *將特定輸入轉換成特定的輸出類型 *參數:type 目標轉換類型,value 待轉換的輸入值 *返回值: 轉換的結果 */ public Object convert(Class type, Object value);}

2. Java內省實例

JavaBean

package cn.edu;import java.util.Date;public class Student { private String stuName; private int age; private Date birthday; public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Student [stuName=" + stuName + ", age=" + age + ", birthday=" + birthday + "]"; }}package cn.edu;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.Converter;import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;public class BeanInfoUtil { public static void main(String[] args) throws Exception { Student stu = new Student(); BeanInfoUtil.setProperty(stu, "stuName","Tom"); BeanInfoUtil.getProperty(stu, "stuName"); setPropertyByIntrospector(stu, "stuName","Ben"); getPropertyByIntrospector(stu, "stuName"); /* * 3.BeanUtils工具包操作JavaBean * */ BeanUtils.setProperty(stu, "stuName", "Green"); BeanUtils.setProperty(stu, "age", 18); System.out.println("get stuName:"+BeanUtils.getProperty(stu, "stuName")); System.out.println("get age:"+BeanUtils.getProperty(stu, "age")); convertUtilsGetBirthday(stu, "1990-08-25"); convertUtilsGetBirthday2(stu, "1993-08-25"); } /** * 1.直接通過 PropertyDescriptor類的操作Bean屬性 * */ public static void setProperty(Student stu, String stuName, String value) throws Exception, IllegalArgumentException, InvocationTargetException{ //1.獲取stuName屬性 PropertyDescriptor propDesc=new PropertyDescriptor(stuName,Student.class); //2.得到setStuName()方法 Method methodSetStuName=propDesc.getWriteMethod(); //3.調用setStuName()方法 methodSetStuName.invoke(stu, value); System.out.println("set name:"+stu.getStuName()); } public static void getProperty(Student stu, String stuName) throws Exception{ PropertyDescriptor proDescriptor =new PropertyDescriptor(stuName,Student.class); Method methodGetStuName=proDescriptor.getReadMethod(); Object objStuName=methodGetStuName.invoke(stu); System.out.println("get name:"+objStuName.toString()); } /** *  2.通過Introspector類獲取BeanInfo對象,再通過BeanInfo獲取PropertyDescriptor,操作Bean屬性 * */ public static void setPropertyByIntrospector(Student stu,String stuName, String value)throws Exception{ //1.獲取BeanInfo對象 BeanInfo beanInfo=Introspector.getBeanInfo(Student.class); //2.通過BeanInfo對象獲取PropertyDescriptor PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors(); //3.遍歷 if(proDescrtptors !=null && proDescrtptors.length > 0){ for(PropertyDescriptor propDesc : proDescrtptors){ if(propDesc.getName().equals(stuName)){ Method methodSetUserName=propDesc.getWriteMethod(); methodSetUserName.invoke(stu, value); System.out.println("set stuName:"+stu.getStuName()); break; } } } } public static void getPropertyByIntrospector(Student stu,String stuName)throws Exception{ BeanInfo beanInfo=Introspector.getBeanInfo(Student.class); PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors(); if(proDescrtptors !=null && proDescrtptors.length > 0){ for(PropertyDescriptor propDesc : proDescrtptors){ if(propDesc.getName().equals(stuName)){ Method methodStuUserName=propDesc.getReadMethod(); Object objStuName=methodStuUserName.invoke(stu); System.out.println("get StuName:"+objStuName.toString()); break; } } } } /** * 給BeanUtils注冊時間日期轉換器 * */ public static void convertUtilsGetBirthday(Student stu, String date) throws Exception{ //給BeanUtils注冊轉換器, type是目標類型, value是當前傳入的值 ConvertUtils.register(new Converter (){ public Object convert(Class type, Object value) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //字符串轉換為Date String v= (String) value; try{ Date d = df.parse(v); return d; }catch (ParseException e){ throw new RuntimeException (e); } } }, Date.class); BeanUtils.setProperty(stu, "birthday", date); System.out.println(stu.getBirthday()); } /** * 給BeanUtils注冊時間日期轉換器 * */ public static void convertUtilsGetBirthday2(Student stu, String date) throws Exception{ ConvertUtils.register(new DateLocaleConverter(), Date.class); BeanUtils.setProperty(stu, "birthday", date); System.out.println(stu.getBirthday()); } }/* set name:Tom get name:Tom set stuName:Ben get StuName:Ben get stuName:Green get age:18 Sat Aug 25 00:00:00 CDT 1990 Wed Aug 25 00:00:00 CST 1993 * */

3.Java封裝客戶端請求參數至JavaBean

JavaBeanpublic class User { private String username; private String passWord[]; private String gender; public String getUsername() {//讀屬性,屬性名稱username return username; } public void setUsername(String username) {//寫屬性,屬性名username this.username = username; } public String[] getPassword() { return password; } public void setPassword(String[] password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User [username=" + username + ", password=" + Arrays.toString(password) + ", gender=" + gender + "]"; }}

封裝請求參數的幾種方案:

/*1.使用Java內省,將請求參數的值封裝到JavaBean中。 約定優于編碼:表單的輸入域的name取值和JavaBean中的屬性(getter和setter方法)保持一致 */ private void test1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Enumeration<String> e = request.getParameterNames();//參數名 User user = new User(); while(e.hasMoreElements()){ String paramName = e.nextElement();//即是JavaBean中的屬性名稱 String paramValue = request.getParameter(paramName); //JavaBean的內省 try { PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class); Method m = pd.getWriteMethod();//setter方法 m.invoke(user, paramValue); } catch (Exception e1) { e1.printStackTrace(); } } } /*2.getParameterMap獲取參數*/ private void test6(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //key:請求參數名 value:請求參數值數組 Map<String,String[]> map = request.getParameterMap(); for(Map.Entry<String, String[]> me:map.entrySet()){ System.out.println(me.getKey()+"="+Arrays.asList(me.getValue())); } } /* 3.getParameterMap獲取參數結合Java 內省,封裝到JavaBean中 */ private void test2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //key:請求參數名 value:請求參數值數組 Map<String,String[]> map = request.getParameterMap(); User user = new User(); for(Map.Entry<String, String[]> me:map.entrySet()){ String paramName = me.getKey();//參數名稱 String paramValues[] = me.getValue();//參數值 try { PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class); Method m = pd.getWriteMethod();//setter方法 if(paramValues.length > 1){ m.invoke(user, (Object)paramValues); }else{ m.invoke(user, paramValues); } } catch (Exception e1) { e1.printStackTrace(); } } } /*3.借助第三方工具包:借助BeanUtil框架*/ private void test8(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user = new User(); try { BeanUtils.populate(user, request.getParameterMap()); } catch (Exception e) { e.printStackTrace(); } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲韩国青草视频| 欧美成人在线网站| 午夜精品久久久久久久99热| 日韩av不卡在线| 亚洲美女性视频| 亚洲欧美日韩一区在线| 国外成人在线播放| 亚洲欧美另类在线观看| 亚洲成人动漫在线播放| 亚洲国产精品99| 性色av一区二区咪爱| 热re99久久精品国产66热| 91夜夜揉人人捏人人添红杏| 日韩精品福利在线| 亚洲精品综合久久中文字幕| 欧美精品久久久久久久免费观看| 久久综合伊人77777尤物| 91国语精品自产拍在线观看性色| 亚洲天堂开心观看| 国产做受69高潮| 久久在精品线影院精品国产| 国产精品三级久久久久久电影| 国产一区香蕉久久| 久久国内精品一国内精品| 夜色77av精品影院| 精品久久香蕉国产线看观看gif| 久久在线精品视频| 亚洲国产日韩欧美在线动漫| 亚洲а∨天堂久久精品喷水| 久久久久久久电影一区| 黄色一区二区在线观看| 亚洲网址你懂得| 国产精品国内视频| 国产噜噜噜噜噜久久久久久久久| 欧美精品电影在线| 欧美激情一区二区三级高清视频| 国产精品视频永久免费播放| 日韩欧美在线中文字幕| 久久999免费视频| 亚洲精品欧美日韩| 亚洲已满18点击进入在线看片| 最好看的2019年中文视频| 国产精品极品美女在线观看免费| 中文字幕亚洲欧美在线| 日韩电影在线观看永久视频免费网站| 国内成人精品一区| 欧美一级免费看| 97精品一区二区三区| 亚洲欧洲在线播放| 国产成人免费91av在线| 国产亚洲视频在线| 欧美成年人在线观看| 91久久精品日日躁夜夜躁国产| 日韩欧美在线看| 九九热99久久久国产盗摄| 欧洲精品久久久| 久久久久久欧美| 国产91成人在在线播放| 97涩涩爰在线观看亚洲| 久久久久久久久久久网站| 久久男人av资源网站| 国内外成人免费激情在线视频网站| 欧美另类第一页| 欧美大片va欧美在线播放| 91中文字幕一区| 欧美激情videoshd| 国产剧情日韩欧美| 欧美激情综合亚洲一二区| 国产中文字幕亚洲| 98精品国产自产在线观看| 国产一区二区在线免费视频| 日韩电影在线观看永久视频免费网站| 欧美精品一区在线播放| 欧美亚洲日本黄色| 色婷婷亚洲mv天堂mv在影片| 亚洲精品av在线播放| 成人黄色在线播放| 国产视频精品在线| 久久久久久国产三级电影| 777777777亚洲妇女| 精品日韩美女的视频高清| 国产精品久久久久久亚洲调教| 久久精品成人欧美大片古装| 亚洲视频欧美视频| 日日摸夜夜添一区| 欧美激情一区二区三区高清视频| 久久6免费高清热精品| 欧美自拍视频在线观看| 爽爽爽爽爽爽爽成人免费观看| 欧美一区二区影院| 亚洲丁香婷深爱综合| 欧美性极品少妇精品网站| 日韩欧美在线视频免费观看| www.99久久热国产日韩欧美.com| 热久久美女精品天天吊色| 日韩黄色在线免费观看| 91在线看www| 国产欧美va欧美va香蕉在线| 91精品久久久久| 久久久久久中文字幕| 最近2019好看的中文字幕免费| 欧美午夜无遮挡| 欧美中文字幕在线| 欧美亚洲另类激情另类| 色播久久人人爽人人爽人人片视av| 一本色道久久综合亚洲精品小说| 日韩在线中文视频| 97精品久久久| 中文欧美日本在线资源| 国产91对白在线播放| 有码中文亚洲精品| 国产精品精品一区二区三区午夜版| 日本老师69xxx| 国产成人综合一区二区三区| 国产亚洲精品高潮| 国产亚洲精品激情久久| 色偷偷888欧美精品久久久| 91精品国产91久久久久| 亚洲aaa激情| 欧美色视频日本版| 98精品国产自产在线观看| 欧美亚洲在线观看| 色综合视频一区中文字幕| 欧美成人精品三级在线观看| 日韩欧美在线中文字幕| 欧美日本亚洲视频| 欧美激情第1页| 亚洲国产私拍精品国模在线观看| 久久久中精品2020中文| 亚洲激情电影中文字幕| 亚洲成人国产精品| 亚洲午夜精品久久久久久性色| 爱福利视频一区| 日韩成人激情在线| 国产综合在线看| 精品国偷自产在线视频99| 欧美大码xxxx| 自拍偷拍免费精品| 成人网欧美在线视频| 久久九九全国免费精品观看| 亚洲国产精品999| 欧美极度另类性三渗透| 欧美大成色www永久网站婷| www.99久久热国产日韩欧美.com| 亚洲女人天堂色在线7777| 一区二区欧美日韩视频| 亚洲精品videossex少妇| 欧美日韩中国免费专区在线看| 精品国产精品自拍| 亚洲成人激情小说| 亚洲女人天堂成人av在线| 亚洲jizzjizz日本少妇| 亚洲国产天堂久久国产91| 国产视频在线观看一区二区| 久久久久久九九九| 成人免费网视频| 日韩av免费一区| 在线亚洲午夜片av大片| 午夜精品美女自拍福到在线| 国产成人一区二区在线| 国产视频丨精品|在线观看| 精品中文视频在线| 国产亚洲精品一区二555| 中文字幕九色91在线|