java反射機(jī)制提供了一種強(qiáng)大的應(yīng)用程序接口來(lái)幫助我們?cè)谶\(yùn)行時(shí)檢測(cè)和執(zhí)行對(duì)象上的操作。該機(jī)制答應(yīng)程序員審閱一個(gè)未知對(duì)象,并且獲得它的屬性,例如對(duì)象上的方法,JavaBean的屬性以及繼續(xù)關(guān)系等。
Java中有兩種類型的值,一種是類類型,它把對(duì)象的屬性定義在一個(gè)類中。類類型是面向?qū)ο蠼Y(jié)構(gòu)的基本組成部分。第二種類型的值是基本數(shù)據(jù)類型。反射類型通常用于類類型,但是,其實(shí)它也可以很方便應(yīng)用到Java的基本類型上。
Java中的基本類型繼續(xù)自基于C的語(yǔ)法,其中包括boolean、byte、short、int、long、float、double、char等類型。
每一個(gè)基本類型都與一個(gè)java類相關(guān)聯(lián)。這些類封裝在java.lang.package中,這個(gè)package默認(rèn)導(dǎo)入所有的java源代碼文件。
在java.lang包的基本數(shù)據(jù)類型包裝類中,不是像定義對(duì)象那樣用類(class)而是用一些非凡的常量來(lái)表示基本數(shù)據(jù)的類型(type).例如,是常量Interger.TYPE而不是類Integer表示int類型,是Byte.TYPE常量表示了byte類型.這種方式使得為一個(gè)未知的JavaBean創(chuàng)建通用的組件成為可能.
下面是一個(gè)例子片斷,其作用是根據(jù)一個(gè)傳來(lái)的HttpServletRequest中設(shè)置JavaBean中的值。
// thrown
Exceptions are left out for ease of reading...
Object bean = ....
BeanInfo bi = Introspector.getBeanInfo(bean.getClass( ));
PRopertyDescriptor[ ] pds = bi.getPropertyDescriptors( );
for(int i=0; i
String name = pds[i].getName( );
String value = request.getParameter(name);
if(value != null) {
Method method = pds[i].getWriteMethod(
);
value = convert(value,
method.getParameterType( )[0]);
method.invoke(bean, new Object[
] { value } );
}
)
Convert方法中缺少的代碼定義如下:
public Object
convert(Object value, Class type) {
String name = type.getName( );
if( "java.lang.String.equals(name) ) {
return value.toString();
} else
if( "java.lang.Long".equals(name) (type ==
Long.TYPE) ) {
return convertToLong(value);
} else
if( "java.lang.Integer".equals(name) (type
== Integer.TYPE) ) {
return convertToInteger(value);
} else
.....
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注