av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

關(guān)于Java反射機(jī)制的一個(gè)實(shí)例

JSP的規(guī)范中,有個(gè)表達(dá)式語(yǔ)言(Expression Language, 簡(jiǎn)稱EL),可以算是一個(gè)微型的語(yǔ)言,其中對(duì)request, page, session, application中預(yù)存的JavaBean對(duì)象的引用方式很是簡(jiǎn)單。最近正好需要寫一個(gè)支持簡(jiǎn)單EL的taglib,所以就研究了下Java反射機(jī)制,目前基本上實(shí)現(xiàn)了多級(jí)bean的屬性的訪問(wèn),經(jīng)測(cè)試,還是可以用的。如:

成都創(chuàng)新互聯(lián)公司是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)站空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,四川移動(dòng)機(jī)房托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。

 
 
 
  1. public static void main(String[] args){  
  2.     UserBean bean = new UserBean();  
  3.     bean.setName("John Abruzzi");  
  4.     bean.setNick("Abruzzi");  
  5.     bean.setAge(24);  
  6.       
  7.     AddressBean addr = new AddressBean();  
  8.     addr.setZip("0086");  
  9.     addr.setStreet("Bell Street #12");  
  10.     bean.setAddress(addr);  
  11.       
  12.     System.out.println(BeanParser.doParse(bean, "bean.address.street"));  
  13.     System.out.println(BeanParser.doParse(bean, "bean.address.zip"));  
  14.     System.out.println(BeanParser.doParse(bean, "bean.name"));  
  15.     System.out.println(BeanParser.doParse(bean, "bean.nick"));  
  16.     System.out.println(BeanParser.doParse(bean, "bean.age"));  

需要可以輸出:

 
 
 
  1. Bell Street #12 
  2. 0086 
  3. John Abruzzi  
  4. Abruzzi  
  5. 24 

反射,即由一個(gè)抽象的對(duì)象(如Object),取出這個(gè)具體對(duì)象的屬性或者方法(就EL中關(guān)于Bean的引用來(lái)說(shuō),這個(gè)定義已經(jīng)夠了)。在EL中,對(duì)一個(gè)Bean的某字段進(jìn)行引用,只需 ${bean.field},當(dāng)然,這個(gè)bean是已經(jīng)被set到容器中的,這就是Java反射機(jī)制。

我們從容器中取出以bean為名字的Object,通過(guò)Java反射機(jī)制知道它的真實(shí)類型,然后通過(guò)field以javabean規(guī)范拼出方法名,進(jìn)行調(diào)用,如果這個(gè)表達(dá)式是多級(jí)的,如${bean.field.field},其中第一個(gè)field本身就是一個(gè)bean對(duì)象,同樣需要遞歸的進(jìn)行解析。

大概原理就是這些了,看代碼吧:

現(xiàn)有一個(gè)UserBean, 其中的一個(gè)字段Address本身又是一個(gè)AddressBean。

 
 
 
  1. package elparser;  
  2.  
  3. public class AddressBean {  
  4.     private String street;  
  5.     private String zip;  
  6.       
  7.     public String getZip() {  
  8.         return zip;  
  9.     }  
  10.  
  11.     public void setZip(String zip) {  
  12.         this.zip = zip;  
  13.     }  
  14.  
  15.     public String getStreet() {  
  16.         return street;  
  17.     }  
  18.  
  19.     public void setStreet(String street) {  
  20.         this.street = street;  
  21.     }  
  22.       

然后是UserBean

 
 
 
  1. package elparser;  
  2.  
  3. public class UserBean {  
  4.     private String name;  
  5.     private String nick;  
  6.     private AddressBean address;  
  7.     private int age;  
  8.       
  9.     public int getAge(){  
  10.         return this.age;  
  11.     }  
  12.       
  13.     public void setAge(int age){  
  14.         this.age = age;  
  15.     }  
  16.       
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public String getNick() {  
  24.         return nick;  
  25.     }  
  26.     public void setNick(String nick) {  
  27.         this.nick = nick;  
  28.     }  
  29.     public AddressBean getAddress() {  
  30.         return address;  
  31.     }  
  32.     public void setAddress(AddressBean address) {  
  33.         this.address = address;  
  34.     }  

Bean都是很簡(jiǎn)單的,考慮到對(duì)基本類型的支持,所以在UserBean中加入一個(gè)int型的字段age

好了,看看怎么通過(guò)一個(gè)串和一個(gè)對(duì)象來(lái)取出其中的字段來(lái):

 
 
 
  1. package elparser;  
  2.  
  3. import java.lang.reflect.Method;  
  4.  
  5. public class BeanParser {  
  6.       
  7.     private static String getMethodName(String property, String prefix){  
  8.         String prop = Character.toUpperCase(property.charAt(0))+property.substring(1);  
  9.       
  10.         String methodName = prefix + prop;  
  11.       
  12.         return methodName;  
  13.     }  
  14.       
  15.     private static Object parse(Object bean, String expr){  
  16.         Class beanClass = bean.getClass();  
  17.           
  18.         Method method = null;  
  19.         Object result = null;  
  20.           
  21.         try{  
  22.             //這兩步是關(guān)鍵,get方法不需要傳入?yún)?shù),所以只是new出兩個(gè)空數(shù)組傳入  
  23.             method = beanClass.getMethod(getMethodName(expr, "get"), new Class[]{});  
  24.             result = method.invoke(bean, new Object[]{});  
  25.         }catch(Exception e){  
  26.             System.out.println(e.getMessage());  
  27.         }  
  28.           
  29.         return result;  
  30.     }  
  31.       
  32.     public static Object doParse(Object bean, String expr){  
  33.         String keys[] = expr.split("\\.");  
  34.           
  35.         Object obj = null;  
  36.           
  37.         for(int i = 1; i < keys.length;i++){  
  38.             obj = parse(bean, keys[i]);  
  39.             bean = obj;  
  40.         }//遞歸parse  
  41.           
  42.         return obj;  
  43.     }  
  44.       
  45.     public static void main(String[] args){  
  46.         UserBean bean = new UserBean();  
  47.         bean.setName("John Abruzzi");  
  48.         bean.setNick("Abruzzi");  
  49.         bean.setAge(24);  
  50.           
  51.         AddressBean addr = new AddressBean();  
  52.         addr.setZip("0086");  
  53.         addr.setStreet("Bell Street #12");  
  54.         bean.setAddress(addr);  
  55.           
  56.         System.out.println(BeanParser.doParse(bean, "bean.address.street"));  
  57.         System.out.println(BeanParser.doParse(bean, "bean.address.zip"));  
  58.         System.out.println(BeanParser.doParse(bean, "bean.name"));  
  59.         System.out.println(BeanParser.doParse(bean, "bean.nick"));  
  60.         System.out.println(BeanParser.doParse(bean, "bean.age"));  
  61.     }  

代碼比較簡(jiǎn)短,重要部分有注釋,應(yīng)該很容易理解。當(dāng)然這篇文章主要是關(guān)于Java的反射機(jī)制,如果需要對(duì)EL完全支持,可以使用JavaCC做一個(gè)簡(jiǎn)單的分析器(Apache的commons中包含一個(gè)el的項(xiàng)目,就是用javacc寫的分析器)。

【編輯推薦】

  1. 在Java應(yīng)用程序中使用Jfreechart配置
  2. Java程序員學(xué)習(xí)Flex和BlazeDS的十三個(gè)理由
  3. 用JavaFX編寫用戶界面控制器
  4. Java WEB開(kāi)發(fā)中的中文亂碼問(wèn)題解決
  5. 總結(jié)Java Web中幾個(gè)函數(shù)的作用

當(dāng)前文章:關(guān)于Java反射機(jī)制的一個(gè)實(shí)例
標(biāo)題來(lái)源:http://uogjgqi.cn/article/dhiddoh.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流