日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java高級(jí)特性之反射學(xué)習(xí)總結(jié)

老規(guī)矩我們還是先提出幾個(gè)問(wèn)題,一門技術(shù)必然要能解決一定的問(wèn)題,才有去學(xué)習(xí)掌握它的價(jià)值

東遼ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

  • 一、 什么是反射?
  • 二、反射能做什么?

一、 什么是反射?

用在Java身上指的是我們可以于運(yùn)行時(shí)加載、探知、使用編譯期間完全未知的classes。換句話說(shuō),Java程序可以加載一個(gè)運(yùn)行時(shí)才得老牌稱的class,獲悉其完整構(gòu)造(但不包括methods定義),并生成其對(duì)象實(shí)體、或?qū)ζ鋐ields設(shè)值、或喚起其methods。

如果你是一個(gè)Android Developer,前輩們都會(huì)教導(dǎo)你盡量少用反射,效率太低,太慢?!吧洹甭?,射的太快就不好了,所以反射雖然慢點(diǎn),但是偶爾射一下還是很”爽”的。

二、反射能做什么?

1、新建類的實(shí)例

我們知道所有的類都繼承子***父類Object,而Object中有hashCode()、equals()、clone()、toString()、getClass()等。其中g(shù)etClass()返回一個(gè)Class 對(duì)象。我們這里就需要使用的Class對(duì)象,注意C是大寫,我們可以通過(guò)一下方式來(lái)獲取Class對(duì)象

  1. Class.forName(“類名字符串”) (注意:類名字符串必須是全稱,包名+類名)
  2. 類名.class
  3. 實(shí)例對(duì)象.getClass()

在Class類中有一個(gè)非常重要的方法

 
 
 
  1. public T newInstance() throws InstantiationException, IllegalAccessException {
  2.        return newInstanceImpl();
  3.    }
  4. private native T newInstanceImpl() throws IllegalAccessException, InstantiationException; 

查看Api可以看到調(diào)用newInstace方法可以返回當(dāng)前class對(duì)應(yīng)的實(shí)例對(duì)象。接下來(lái)看一個(gè)小的Demo

 
 
 
  1. public class Reflection {
  2.     public static void main(String[] args) {
  3.         // 普通創(chuàng)建類的實(shí)例
  4.         People p1 = new People();
  5.         System.out.println(p1.getName());
  6.         // 利用反射獲取類的實(shí)例
  7.         Class clazz = People.class;
  8.         // 常用方式,注意括號(hào)中需要放類的全路徑名
  9.         // Class clazz = Class.forName("reflection.People");
  10.         // Class clazz = p1.getClass();
  11.         try {
  12.             People p2 = (People) clazz.newInstance();
  13.             System.out.println(p2.getName());
  14.         } catch (Exception e) {
  15.             e.printStackTrace();
  16.         }
  17.     }
  18. }
  19. class People {
  20.     private String name = "張三";
  21.     private int age;
  22.     public String getName() {
  23.         return name;
  24.     }
  25.     public void setName(String name) {
  26.         this.name = name;
  27.     }
  28.     public int getAge() {
  29.         return age;
  30.     }
  31.     public void setAge(int age) {
  32.         this.age = age;
  33.     }

輸入結(jié)果:

 
 
 
  1. 張三
  2.  張三 

2、獲取成員變量和方法

在講之前我們先來(lái)看這樣一個(gè)小按理,JSON數(shù)據(jù)轉(zhuǎn)JavaBaen對(duì)象,在不用解析庫(kù)的情況下,一般我們會(huì)這樣做

 
 
 
  1. private void analysisDate(JSONObject response) throws JSONException {
  2.         int announceid = response.getInt("announceid");
  3.         String title = response.getString("title");
  4.         String hits = response.getString("hits");
  5.         String addtime = response.getString("addtime");
  6.         NewsNotifyItem newsNotifyItem = new NewsNotifyItem(announceid,
  7.                 title, hits, addtime);
  8.     }

每當(dāng)我們需要解析額時(shí)候,都需要根據(jù)不同javabean來(lái)進(jìn)行相應(yīng)的解析,我們每次進(jìn)行的操作都是一樣的,只是解析的數(shù)據(jù)不同而已,結(jié)合上篇帖子講到的泛型,這里我們就可以再利用反射來(lái)自己做一個(gè)Json解析工具。

下面是我寫的一個(gè)JsonObject對(duì)象轉(zhuǎn)JavaBean的一個(gè)工具類,需要注意的是,JSON的key需要和字段名保持一致,先說(shuō)下思路

①首先通過(guò)反射獲取JavaBean中的所有字段值的名稱

②拼接出set方法

③由于字段名和Json的key值相同,利用自動(dòng)名獲取Json中的值并填充的實(shí)例對(duì)象中

 
 
 
  1. public class Json2BeanUtils {
  2.     public static  T jsonToBean(JSONObject response, Class clazz) {
  3.         try {
  4.             // 創(chuàng)建類的實(shí)例
  5.             Object object = Class.forName(clazz.getName()).newInstance();
  6.             // 獲取類中的所有成員變量
  7.             Field[] fields = object.getClass().getDeclaredFields();
  8.             for (int i = 0; i < fields.length; i++) {
  9.                 //設(shè)置權(quán)限
  10.                 fields[i].setAccessible(true);
  11.                 // 獲取字段的名稱
  12.                 String fieldName = fields[i].getName();
  13.                 // 過(guò)濾掉UID
  14.                 if (fieldName.endsWith("serialVersionUID")) {
  15.                     continue;
  16.                 }
  17.                 // 獲取字段的類型
  18.                 String fieldType = fields[i].getGenericType().toString();
  19.                 // 拼接出JavaBean中的set方法 這里有一個(gè)坑 后面講解
  20.                 String methodName = "set"
  21.                         + fieldName.substring(0, 1).toUpperCase()
  22.                         + fieldName.substring(1);
  23.                 try {
  24.                     // 判斷變量類型
  25.                     if (fieldType.endsWith("class java.lang.String")) {
  26.                         // 獲取到set方法
  27.                         Method m = object.getClass().getMethod(methodName,
  28.                                 String.class);
  29.                         String value = null;
  30.                         try {
  31.                             // 從JsonObj中取出相應(yīng)的值
  32.                             value = response.getString(fieldName);
  33.                         } catch (Exception e) {
  34.                             e.printStackTrace();
  35.                             value = "";
  36.                         }
  37.                         if (TextUtils.isEmpty(value)) {
  38.                             value = "";
  39.                         } else if (value.endsWith("null")) {
  40.                             value = "";
  41.                         }
  42.                         // 賦值
  43.                         m.invoke(object, value);
  44.                     } else if (fieldType.endsWith("int")
  45.                             || fieldType.endsWith("class java.lang.Integer")) {
  46.                         // int 類型
  47.                         System.out.println();
  48.                         Method m = object.getClass().getMethod(methodName,
  49.                                 int.class);
  50.                         int value = -1;
  51.                         try {
  52.                             value = response.getInt(fieldName);
  53.                         } catch (Exception e) {
  54.                             e.printStackTrace();
  55.                             value = -1;
  56.                         }
  57.                         m.invoke(object, value);
  58.                     } else if (fieldType.endsWith("boolean")
  59.                             || fieldType
  60.                                     .endsWith("fieldType:class java.lang.Boolean")) {
  61.                         // boolean 類型
  62.                         Method m = object.getClass().getMethod(methodName,
  63.                                 boolean.class);
  64.                         boolean value = false;
  65.                         try {
  66.                             value = response.getBoolean(fieldName);
  67.                         } catch (Exception e) {
  68.                             e.printStackTrace();
  69.                             value = false;
  70.                         }
  71.                         m.invoke(object, value);
  72.                     } else if (fieldType.endsWith("double")
  73.                             || fieldType
  74.                                     .endsWith("fieldType:class java.lang.Double")) {
  75.                         // double 類型
  76.                         Method m = object.getClass().getMethod(methodName,
  77.                                 double.class);
  78.                         double value = -1D;
  79.                         try {
  80.                             value = response.getDouble(fieldName);
  81.                         } catch (Exception e) {
  82.                             e.printStackTrace();
  83.                             value = -1D;
  84.                         }
  85.                         m.invoke(object, value);
  86.                     } else if (fieldType.endsWith("char")) {
  87.                         // char類型 JSONObject 沒(méi)有char
  88.                         Method m = object.getClass().getMethod(methodName,
  89.                                 String.class);
  90.                         String value = "";
  91.                         try {
  92.                             value = response.getString(fieldName);
  93.                         } catch (Exception e) {
  94.                             e.printStackTrace();
  95.                             value = "";
  96.                         }
  97.                         m.invoke(object, value);
  98.                     } else if (fieldType.endsWith("float")
  99.                             || fieldType
  100.                                     .endsWith("fieldType:class java.lang.Float")) {
  101.                         // float類型
  102.                         Method m = object.getClass().getMethod(methodName,
  103.                                 double.class);
  104.                         double value = -1D;
  105.                         try {
  106.                             value = response.getDouble(fieldName);
  107.                         } catch (Exception e) {
  108.                             e.printStackTrace();
  109.                             value = -1D;
  110.                         }
  111.                         m.invoke(object, value);
  112.                     } else if (fieldType.endsWith("short")
  113.                             || fieldType
  114.                                     .endsWith("fieldType:class java.lang.Short")) {
  115.                         // short
  116.                         Method m = object.getClass().getMethod(methodName,
  117.                                 short.class);
  118.                         int value = -1;
  119.                         try {
  120.                             value = response.getInt(fieldName);
  121.                         } catch (Exception e) {
  122.                             e.printStackTrace();
  123.                             value = -1;
  124.                         }
  125.                         m.invoke(object, value);
  126.                     } else if (fieldType.endsWith("byte")
  127.                             || fieldType
  128.                                     .endsWith("fieldType:class java.lang.Byte")) {
  129.                         Method m = object.getClass().getMethod(methodName,
  130.                                 byte.class);
  131.                         int value = -1;
  132.                         try {
  133.                             value = response.getInt(fieldName);
  134.                         } catch (Exception e) {
  135.                             e.printStackTrace();
  136.                             value = -1;
  137.                         }
  138.                         m.invoke(object, value);
  139.                     } else if (fieldType.endsWith("long")
  140.                             || fieldType
  141.                                     .endsWith("fieldType:class java.lang.Long")) {
  142.                         Method m = object.getClass().getMethod(methodName,
  143.                                 long.class);
  144.                         Long value = -1L;
  145.                         try {
  146.                             value = response.getLong(fieldName);
  147.                         } catch (Exception e) {
  148.                             e.printStackTrace();
  149.                             value = -1L;
  150.                         }
  151.                         m.invoke(object, value);
  152.                     }  
  153.                 } catch (Exception e) {
  154.                     // TODO: handle exception
  155.                 }
  156.             }
  157.             return (T) object;
  158.         } catch (Exception e) {
  159.             e.printStackTrace();
  160.         }
  161.         return null;
  162.     }

這里需要注意一個(gè)坑,先來(lái)看一段代碼

 
 
 
  1. class People {
  2.     private String name;
  3.     private int age;
  4.     private String mSex;
  5.     public String getName() {
  6.         return name;
  7.     }
  8.     public void setName(String name) {
  9.         this.name = name;
  10.     }
  11.     public int getAge() {
  12.         return age;
  13.     }
  14.     public void setAge(int age) {
  15.         this.age = age;
  16.     }
  17.     public String getmSex() {
  18.         return mSex;
  19.     }
  20.     // 這里就出了問(wèn)題  
  21.     public void setmSex(String mSex) {
  22.         this.mSex = mSex;
  23.     }

當(dāng)我們自動(dòng)生成get set方法時(shí),會(huì)將字段的首字母大寫,我們?cè)谏厦嫫唇觭et 方法時(shí),也是基于這樣的規(guī)則來(lái)拼裝的。但是 當(dāng)我們的字段名為 aAbbb 時(shí),則生成的get set 方法則不會(huì)大寫。解決方案也很簡(jiǎn)單,注意字段命名或者在拼接時(shí)對(duì)第二個(gè)自動(dòng)進(jìn)行大小寫判斷。這樣我們自己寫的Json解析工具就搞定, 以后每次解析只需一行代碼即可OK。


文章題目:Java高級(jí)特性之反射學(xué)習(xí)總結(jié)
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/dheidgc.html