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

首頁 > 開發 > Java > 正文

Java內省實例解析

2024-07-13 10:16:02
字體:
來源:轉載
供稿:網友

圖像中輪廓的個數,里面vector的size代表了輪廓上點的個數。了解JavaBean

java/237382.html">內省對應的英文單詞為IntroSpector,它主要用于對JavaBean進行操作,JavaBean是一種特殊的Java類,其中的某些方法符合某種命名規則,如果一個Java類中的一些方法符合某種命名規則,則可以把它當作JavaBean來使用。

JavaBean是一種特殊的Java類,主要用于傳遞數據信息,這種java類中的方法主要用于訪問私有的字段,且方法名符合某種命名規則。

如果要在兩個模塊之間傳遞多個信息,可以將這些信息封裝到一個JavaBean中,這種JavaBean的實例對象通常稱之為值對象(ValueObject,簡稱VO)。這些信息在類中用私有字段來存儲,如果讀取或設置這些字段的值,則需要通過一些相應的方法來訪問,大家覺得這些方法的名稱叫什么好呢?JavaBean的屬性是根據其中的setter和getter方法來確定的,而不是根據其中的成員變量。如果方法名為setId,中文意思即為設置id,至于你把它存到哪個變量上,用管嗎?如果方法名為getId,中文意思即為獲取id,至于你從哪個變量上取,用管嗎?去掉set前綴,剩余部分就是屬性名,如果剩余部分的第二個字母是小寫的,則把剩余部分的首字母改成小的。

例如:

setId()的屬性名-->id

isLast()的屬性名-->last

setCPU的屬性名是什么?-->CPU

getUPS的屬性名是什么?-->UPS

總之,一個類被當作javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量。

一個符合JavaBean特點的類可以當作普通類一樣進行使用,但把它當JavaBean用肯定需要帶來一些額外的好處,我們才會去了解和應用JavaBean!好處如下:

在JavaEE開發中,經常要使用到JavaBean。很多環境就要求按JavaBean方式進行操作,別人都這么用和要求這么做,那你就沒什么挑選的余地!

JDK中提供了對JavaBean進行操作的一些API,這套API就稱為內省。如果要你自己去通過getX方法來訪問私有的x,怎么做,有一定難度吧?用內省這套api操作JavaBean比用普通類的方式更方便。

對JavaBean的簡單內省操作

主要用到了java.beans.PropertyDescriptor類,用來得到某個Class對象屬性集中的某個JavaBean屬性,然后調用getReadMethod()、getWriteMethod()方法獲得相應的get、set方法。

代碼示例:

Domain類:

[cpp]viewplaincopy

intmain()

package ustc.lichunchun.bean;import java.util.Date;public class ReflectPoint {   private Date birthday = new Date();private int x;public int y;public String str1 = "ball";public String str2 = "basketball";public String str3 = "itcast";public ReflectPoint(int x, int y) {	super();	this.x = x;	this.y = y;}@Override   public int hashCode() {	final int prime = 31;	int result = 1;	result = prime * result + x;	result = prime * result + y;	return result;}@Override   public Boolean equals(Object obj) {	if (this == obj) 	      return true;	if (obj == null) 	      return false;	if (getClass() != obj.getClass()) 	      return false;	final ReflectPoint other = (ReflectPoint) obj;	if (x != other.x) 	      return false;	if (y != other.y) 	      return false;	return true;}@Override   public String toString(){	return str1 + ":" + str2 + ":" + str3;}public int getX() {	return x;}public void setX(int x) {	this.x = x;}public int getY() {	return y;}public void setY(int y) {	this.y = y;}public Date getBirthday() {	return birthday;}public void setBirthday(Date birthday) {	this.birthday = birthday;}}

簡單內省操作:

package ustc.lichunchun.bean;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class IntroSpectorTest {	public static void main(String[] args) throws Exception {		ReflectPoint pt1 = new ReflectPoint(3, 5);		String propertyName = "x";		//"x"-->"X"-->"getX"-->MethodGetX--> 		getProperty(pt1, propertyName);		Object value = 7;		setProperty(pt1, propertyName, value);		System.out.println(pt1.getX());	}	private static void setProperty(Object pt1, String propertyName, Object value) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());		Method methodSetX = pd.getWriteMethod();		methodSetX.invoke(pt1, value);	}	private static Object getProperty(Object pt1, String propertyName) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());		Method methodGetX = pd.getReadMethod();		methodGetX.invoke(pt1);	}}

對JavaBean的復雜內省操作

采用遍歷BeanInfo的所有屬性方式來查找和設置某個RefectPoint對象的x屬性。在程序中把一個類當作JavaBean來看,就是調用IntroSpector.getBeanInfo方法,得到的BeanInfo對象封裝了把這個類當作JavaBean看的結果信息。

復雜內省操作:

package ustc.lichunchun.bean;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class IntroSpectorTest {	public static void main(String[] args) throws Exception {		ReflectPoint pt1 = new ReflectPoint(3, 5);		String propertyName = "x";		//"x"-->"X"-->"getX"-->MethodGetX--> 		Object retVal = getProperty(pt1, propertyName);		System.out.println(retVal);		Object value = 7;		setProperty(pt1, propertyName, value);		System.out.println(pt1.getX());	}	private static void setProperty(Object pt1, String propertyName, Object value) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());		Method methodSetX = pd.getWriteMethod();		methodSetX.invoke(pt1, value);	}	private static Object getProperty(Object pt1, String propertyName) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		/*     PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());     Method methodGetX = pd.getReadMethod();     methodGetX.invoke(pt1);     */		BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();		Object retVal = null;		for (PropertyDescriptor pd : pds){			if(pd.getName().equals(propertyName)){				Method methodGetX = pd.getReadMethod();				retVal = methodGetX.invoke(pt1);				break;			}		}		return retVal;	}}

使用BeanUtils工具包操作JavaBean

在前面內省例子的基礎上,用BeanUtils類先get原來設置好的屬性,再將其set為一個新值。get屬性時返回的結果為字符串,set屬性時可以接受任意類型的對象,通常使用字符串。

用PropertyUtils類先get原來設置好的屬性,再將其set為一個新值。get屬性時返回的結果為該屬性本來的類型,set屬性時只接受該屬性本來的類型。

注意:用這兩個類之前,需要在eclipse工程的lib文件夾中導入commons-beanutils.jar、commons-logging-1.1.jar兩個jar包,并且AddtoBuildPath。

代碼示例:

package ustc.lichunchun.bean;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.PropertyUtils;public class IntroSpectorTest {	public static void main(String[] args) throws Exception {		ReflectPoint pt1 = new ReflectPoint(3, 5);		String propertyName = "x";		//"x"-->"X"-->"getX"-->MethodGetX--> 		Object retVal = getProperty(pt1, propertyName);		System.out.println(retVal);		Object value = 7;		setProperty(pt1, propertyName, value);		System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());		//String 		BeanUtils.setProperty(pt1, "x", "9");		System.out.println(pt1.getX());		/*     Map map = {name:"zxx",age:18};//java7的新特性     BeanUtils.setProperty(map, "name", "lcc");     */		BeanUtils.setProperty(pt1, "birthday.time", "111");		//支持屬性鏈 		System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));		PropertyUtils.setProperty(pt1, "x", 23);		System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());		//Integer 		/*     BeanUtils和PropertyUtils的區別:     BeanUtils以字符串形式對JavaBean進行操作,也可以操作Map類,并且可以講JavaBean和Map進行互相轉換(describe、populate)     PropertyUtils以JavaBean屬性本身的數據類型進行操作        */	}	private static void setProperty(Object pt1, String propertyName, Object value) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());		Method methodSetX = pd.getWriteMethod();		methodSetX.invoke(pt1, value);	}	private static Object getProperty(Object pt1, String propertyName) 	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {		/*     PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());     Method methodGetX = pd.getReadMethod();     methodGetX.invoke(pt1);     */		BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();		Object retVal = null;		for (PropertyDescriptor pd : pds){			if(pd.getName().equals(propertyName)){				Method methodGetX = pd.getReadMethod();				retVal = methodGetX.invoke(pt1);				break;			}		}		return retVal;	}}

總結

以上就是本文關于Java內省實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久亚洲| 亚洲乱码国产乱码精品精| 97精品国产aⅴ7777| 一夜七次郎国产精品亚洲| 亚洲一区美女视频在线观看免费| 欧美极品少妇全裸体| 丝袜情趣国产精品| 国产精品高潮呻吟视频| 亚洲最大福利网| 欧美做爰性生交视频| 久久久精品视频在线观看| 亚洲成人av片在线观看| 欧美电影在线播放| 精品国产成人在线| 国产中文字幕日韩| 国产日韩欧美在线看| 久久久精品免费视频| 亚洲精品99久久久久中文字幕| 欧美日韩中文字幕综合视频| 色天天综合狠狠色| 国外色69视频在线观看| 亚洲色无码播放| 国产精品香蕉在线观看| 久久91亚洲精品中文字幕奶水| 国产黑人绿帽在线第一区| 久久久久久久久久久亚洲| 在线观看成人黄色| 亚洲第一精品夜夜躁人人躁| 亚洲伦理中文字幕| 午夜精品福利在线观看| 亚洲第一福利在线观看| 色婷婷成人综合| 久久99精品国产99久久6尤物| 国产啪精品视频| 黄色一区二区三区| 中文字幕在线观看日韩| 国产欧美一区二区| 欧美激情va永久在线播放| 欧美激情精品久久久久久| 成人a免费视频| 久久综合色88| 一区二区福利视频| 亚洲人成欧美中文字幕| 中文字幕在线日韩| 国产精品久久999| 国产精品久久久久久久久久久久| 91伊人影院在线播放| 久久夜色精品亚洲噜噜国产mv| 91精品视频在线免费观看| 国产日韩av在线| 久久久久亚洲精品国产| 美女少妇精品视频| 在线a欧美视频| 狠狠色香婷婷久久亚洲精品| 日韩av手机在线观看| 狠狠躁18三区二区一区| 98午夜经典影视| 日韩视频免费中文字幕| 成人国产精品日本在线| 久久久久久尹人网香蕉| 日韩精品免费看| 91在线观看免费高清| 亚洲一区二区三区久久| 美女视频黄免费的亚洲男人天堂| 欧美老女人xx| 青青青国产精品一区二区| 欧美日韩成人在线播放| 懂色av影视一区二区三区| 亚洲电影成人av99爱色| 日韩在线精品一区| 国产区亚洲区欧美区| 中文字幕av日韩| 中文字幕亚洲一区| 日韩高清电影好看的电视剧电影| 久久精品成人一区二区三区| 亚洲欧美日韩网| 91精品视频在线看| 国产精品亚洲欧美导航| 日韩高清不卡av| 美女国内精品自产拍在线播放| 国内精品久久久久影院 日本资源| 亚洲网站视频福利| 97视频网站入口| 国产精品对白刺激| 国产精品视频久久| 日韩高清电影免费观看完整| 久久久999成人| 成人伊人精品色xxxx视频| 国产精品露脸自拍| 国产亚洲视频中文字幕视频| 国产精品视频成人| 色综合色综合网色综合| 亚洲欧美国产精品| 欧美日韩国产丝袜美女| 欧美小视频在线| 在线观看亚洲区| 欧美精品九九久久| 国产精品日韩在线播放| 久久精品国产欧美亚洲人人爽| 欧美国产日韩一区二区| 欧洲成人在线视频| 91产国在线观看动作片喷水| 国产精品视频一区二区三区四| 久久精品国产成人精品| 国产亚洲精品久久| 国产视频欧美视频| 中文字幕精品久久| 成人精品久久久| 欧美日韩国产在线| 欧洲亚洲在线视频| wwwwwwww亚洲| 国产91在线高潮白浆在线观看| 亚洲精品美女网站| 在线视频精品一| 亚洲欧洲自拍偷拍| 91色视频在线观看| 色综合久综合久久综合久鬼88| 日韩电影免费在线观看| 久久久亚洲国产天美传媒修理工| 欧美激情视频网站| 日韩国产欧美精品在线| 欧美精品videosex极品1| 97人人爽人人喊人人模波多| 亲爱的老师9免费观看全集电视剧| 日韩精品免费综合视频在线播放| 日本成人免费在线| 欧美精品在线观看91| 欧美国产精品人人做人人爱| 国产主播在线一区| 国产一区玩具在线观看| 日韩亚洲欧美中文在线| 亚洲免费中文字幕| 亚洲精品久久久久久下一站| 亚洲一区二区久久| 国产成人亚洲综合91| 国产精品美女网站| 神马久久桃色视频| 色综合亚洲精品激情狠狠| 亚洲va欧美va在线观看| 91chinesevideo永久地址| 欧美日韩国产区| 欧美黑人视频一区| 欧美日韩亚洲激情| 日本免费久久高清视频| 色综合天天狠天天透天天伊人| 色樱桃影院亚洲精品影院| 欧美成人精品在线观看| 久久久久久久久久亚洲| 国产精品白丝av嫩草影院| 国内外成人免费激情在线视频| 5278欧美一区二区三区| 欧美视频不卡中文| 国产精品久久久久免费a∨| 欧美视频不卡中文| 亚洲自拍欧美色图| 欧美日韩国产激情| 欧美午夜电影在线| 国产精品久久久久影院日本| 国产精品久久中文| 欧美精品福利在线| 国内精品久久久久久中文字幕| 91精品国产高清久久久久久久久| 日韩在线一区二区三区免费视频| 97超级碰碰碰|