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

首頁 > 開發 > Java > 正文

Java高級特性之反射機制實例詳解

2024-07-14 08:42:13
字體:
來源:轉載
供稿:網友

本文實例講述了Java高級特性之反射機制。分享給大家供大家參考,具體如下:

老規矩我們還是先提出幾個問題,一門技術必然要能解決一定的問題,才有去學習掌握它的價值

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

一、 什么是反射?

用在Java身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。

如果你是一個Android Developer,前輩們都會教導你盡量少用反射,效率太低,太慢。“射”嘛,射的太快就不好了,所以反射雖然慢點,但是偶爾射一下還是很”爽”的。

二、反射能做什么?

1、新建類的實例

我們知道所有的類都繼承子頂級父類Object,而Object中有hashCode()equals()clone()、toString()getClass()等。其中getClass()返回一個Class 對象。我們這里就需要使用的Class對象,注意C是大寫,我們可以通過一下方式來獲取Class對象

  • 1.Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名)
  • 2.類名.class
  • 3.實例對象.getClass()

在Class類中有一個非常重要的方法

public T newInstance() throws InstantiationException, IllegalAccessException {    return newInstanceImpl();}private native T newInstanceImpl() throws IllegalAccessException, InstantiationException;

查看Api可以看到調用newInstace方法可以返回當前class對應的實例對象。接下來看一個小的Demo

public class Reflection {  public static void main(String[] args) {    // 普通創建類的實例    People p1 = new People();    System.out.println(p1.getName());    // 利用反射獲取類的實例    Class clazz = People.class;    // 常用方式,注意括號中需要放類的全路徑名    // Class clazz = Class.forName("reflection.People");    // Class clazz = p1.getClass();    try {      People p2 = (People) clazz.newInstance();      System.out.println(p2.getName());    } catch (Exception e) {      e.printStackTrace();    }  }}class People {  private String name = "張三";  private int age;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }}

輸入結果:

張三
張三

2、獲取成員變量和方法

在講之前我們先來看這樣一個小按理,JSON數據轉JavaBaen對象,在不用解析庫的情況下,一般我們會這樣做

private void analysisDate(JSONObject response) throws JSONException {    int announceid = response.getInt("announceid");    String    String hits = response.getString("hits");    String addtime = response.getString("addtime");    NewsNotifyItem newsNotifyItem = new NewsNotifyItem(announceid,        title, hits, addtime);  }}

每當我們需要解析額時候,都需要根據不同javabean來進行相應的解析,我們每次進行的操作都是一樣的,只是解析的數據不同而已,結合上篇帖子講到的泛型,這里我們就可以再利用反射來自己做一個Json解析工具

下面 是我寫的一個JsonObject對象轉JavaBean的一個工具類,需要注意的是,JSON的key需要和字段名保持一致,先說下思路

①首先通過反射獲取JavaBean中的所有字段值的名稱
②拼接出set方法
③由于字段名和Json的key值相同,利用自動名獲取Json中的值并填充的實例對象中

public class Json2BeanUtils {  public static <T> T jsonToBean(JSONObject response, Class<T> clazz) {    try {      // 創建類的實例      Object object = Class.forName(clazz.getName()).newInstance();      // 獲取類中的所有成員變量      Field[] fields = object.getClass().getDeclaredFields();      for (int i = 0; i < fields.length; i++) {        //設置權限        fields[i].setAccessible(true);        // 獲取字段的名稱        String fieldName = fields[i].getName();        // 過濾掉UID        if (fieldName.endsWith("serialVersionUID")) {          continue;        }        // 獲取字段的類型        String fieldType = fields[i].getGenericType().toString();        // 拼接出JavaBean中的set方法 這里有一個坑 后面講解        String methodName = "set"            + fieldName.substring(0, 1).toUpperCase()            + fieldName.substring(1);        try {          // 判斷變量類型          if (fieldType.endsWith("class java.lang.String")) {            // 獲取到set方法            Method m = object.getClass().getMethod(methodName,                String.class);            String value = null;            try {              // 從JsonObj中取出相應的值              value = response.getString(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = "";            }            if (TextUtils.isEmpty(value)) {              value = "";            } else if (value.endsWith("null")) {              value = "";            }            // 賦值            m.invoke(object, value);          } else if (fieldType.endsWith("int")              || fieldType.endsWith("class java.lang.Integer")) {            // int 類型            System.out.println();            Method m = object.getClass().getMethod(methodName,                int.class);            int value = -1;            try {              value = response.getInt(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1;            }            m.invoke(object, value);          } else if (fieldType.endsWith("boolean")              || fieldType                  .endsWith("fieldType:class java.lang.Boolean")) {            // boolean 類型            Method m = object.getClass().getMethod(methodName,                boolean.class);            boolean value = false;            try {              value = response.getBoolean(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = false;            }            m.invoke(object, value);          } else if (fieldType.endsWith("double")              || fieldType                  .endsWith("fieldType:class java.lang.Double")) {            // double 類型            Method m = object.getClass().getMethod(methodName,                double.class);            double value = -1D;            try {              value = response.getDouble(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1D;            }            m.invoke(object, value);          } else if (fieldType.endsWith("char")) {            // char類型 JSONObject 沒有char            Method m = object.getClass().getMethod(methodName,                String.class);            String value = "";            try {              value = response.getString(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = "";            }            m.invoke(object, value);          } else if (fieldType.endsWith("float")              || fieldType                  .endsWith("fieldType:class java.lang.Float")) {            // float類型            Method m = object.getClass().getMethod(methodName,                double.class);            double value = -1D;            try {              value = response.getDouble(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1D;            }            m.invoke(object, value);          } else if (fieldType.endsWith("short")              || fieldType                  .endsWith("fieldType:class java.lang.Short")) {            // short            Method m = object.getClass().getMethod(methodName,                short.class);            int value = -1;            try {              value = response.getInt(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1;            }            m.invoke(object, value);          } else if (fieldType.endsWith("byte")              || fieldType                  .endsWith("fieldType:class java.lang.Byte")) {            Method m = object.getClass().getMethod(methodName,                byte.class);            int value = -1;            try {              value = response.getInt(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1;            }            m.invoke(object, value);          } else if (fieldType.endsWith("long")              || fieldType                  .endsWith("fieldType:class java.lang.Long")) {            Method m = object.getClass().getMethod(methodName,                long.class);            Long value = -1L;            try {              value = response.getLong(fieldName);            } catch (Exception e) {              e.printStackTrace();              value = -1L;            }            m.invoke(object, value);          }        } catch (Exception e) {          // TODO: handle exception        }      }      return (T) object;    } catch (Exception e) {      e.printStackTrace();    }    return null;  }}

這里需要注意一個坑,先來看一段代碼

class People {  private String name;  private int age;  private String mSex;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public String getmSex() {    return mSex;  }  // 這里就出了問題  public void setmSex(String mSex) {    this.mSex = mSex;  }}

當我們自動生成get set方法時,會將字段的首字母大寫,我們在上面拼接set 方法時,也是基于這樣的規則來拼裝的。但是 當我們的字段名為 aAbbb 時,則生成的get set 方法則不會大寫。解決方案也很簡單,注意字段命名或者在拼接時對第二個自動進行大小寫判斷。這樣我們自己寫的Json解析工具就搞定, 以后每次解析只需一行代碼即可OK。

今天反射就暫時講到這里。其實反射的作用遠不于此,這里只是使用了反射的冰山一角,結合注解和泛型,反射可以做的事更多,但是還是和開頭講的一樣,反射用起來雖然很爽,但是不能亂射,和頻繁的射,“射”的太多。“性”能會出問題!(o(∩_∩)o )。

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕在线视频| 91精品国产综合久久久久久久久| 亚洲欧洲激情在线| 亚洲欧美激情一区| 精品视频在线播放色网色视频| 91爱视频在线| 国产亚洲欧洲高清一区| 欧美疯狂性受xxxxx另类| 成人国产精品久久久久久亚洲| 亚洲的天堂在线中文字幕| 91网在线免费观看| 欧美精品videosex牲欧美| 一区二区欧美在线| 久久久精品一区二区三区| xxxxxxxxx欧美| 久久综合色影院| 岛国av在线不卡| 国产精品96久久久久久| 久久伊人91精品综合网站| 久久久久久久久亚洲| 蜜月aⅴ免费一区二区三区| 亚洲欧美精品中文字幕在线| 亚洲国产欧美在线成人app| 欧美精品手机在线| 成人黄色免费片| 亚洲一区中文字幕在线观看| 成人黄色免费在线观看| 国产视频久久网| 亲爱的老师9免费观看全集电视剧| 国产精品视频永久免费播放| 精品毛片三在线观看| 一区二区欧美日韩视频| 亚洲第一区第二区| 91精品久久久久久久久久另类| 国产精品十八以下禁看| 欧美国产亚洲视频| 日韩欧美在线看| 九九视频直播综合网| 中文字幕日韩欧美在线视频| 欧美国产日产韩国视频| 亚洲第一福利网站| 欧美日在线观看| 最新69国产成人精品视频免费| 精品久久久久久久久国产字幕| 欧美香蕉大胸在线视频观看| 狠狠干狠狠久久| 欧美日韩美女在线| 亚洲区bt下载| 欧美制服第一页| 国产在线视频一区| 日韩美女在线观看| 日韩中文字幕国产精品| 精品国内亚洲在观看18黄| 亚洲国内精品视频| 亚洲精品一区在线观看香蕉| 久久精彩免费视频| 欧美日韩在线影院| 亚洲综合精品一区二区| 亚洲精品视频免费在线观看| 日韩男女性生活视频| 欧美日韩国产色视频| 欧美性猛交xxxxx免费看| 欧美最近摘花xxxx摘花| 成人在线视频福利| 国产成人精品免高潮费视频| 欧美另类老女人| 都市激情亚洲色图| 国产精品国产自产拍高清av水多| 疯狂做受xxxx高潮欧美日本| 欧美性受xxx| 日韩av最新在线观看| 91伊人影院在线播放| 456亚洲影院| 色婷婷亚洲mv天堂mv在影片| 岛国av一区二区在线在线观看| 亚洲欧美精品一区二区| 亚洲美女自拍视频| 91精品久久久久久久久不口人| 日韩av免费网站| 国产成人鲁鲁免费视频a| 69视频在线播放| 亚洲无av在线中文字幕| 91av视频在线播放| 久久精品国产久精国产思思| 57pao成人国产永久免费| 国产精品久久久久久av下载红粉| 久久久免费精品| 日韩电影大片中文字幕| 亚洲精品久久视频| 国产精品视频不卡| 久久久精品免费视频| 亚洲福利精品在线| 欧美网站在线观看| 欧美国产日韩中文字幕在线| 亚洲深夜福利在线| 欧美放荡办公室videos4k| 亚洲高清色综合| 亚洲国产成人久久综合一区| 亚洲国产91精品在线观看| 一个人www欧美| 国产欧洲精品视频| 久久全国免费视频| 欧美亚洲另类制服自拍| 国产精品伦子伦免费视频| 久久久91精品国产| 日韩精品日韩在线观看| 久久久国产精品免费| 国产精品美腿一区在线看| 2021国产精品视频| 国产精品久久久999| 亚洲免费视频网站| 热久久这里只有| 日韩av网址在线观看| 日本人成精品视频在线| 亚洲free性xxxx护士hd| 26uuu另类亚洲欧美日本一| 一区二区欧美激情| 热久久这里只有| 亚洲国产精品va在线看黑人动漫| 亚洲精品久久视频| 国产亚洲xxx| 亚洲第一免费播放区| 成人久久一区二区| 欧美性少妇18aaaa视频| 久久久久久久久久久人体| 久久久久久久久久久免费精品| 成人激情视频在线播放| 欧美日韩精品在线| 亚洲人成毛片在线播放| 亚洲国产精品嫩草影院久久| 亚洲精品日韩激情在线电影| 成人看片人aa| 日韩av中文字幕在线免费观看| 日韩中文在线不卡| 国产日韩欧美日韩大片| 精品色蜜蜜精品视频在线观看| 亚洲欧美日韩第一区| 中文字幕一区日韩电影| 欧美性受xxxx黑人猛交| 黑人巨大精品欧美一区二区一视频| 亚洲国产精品字幕| 国产精品一区二区三区毛片淫片| 日韩在线视频中文字幕| 国产色婷婷国产综合在线理论片a| 欧美日韩亚洲一区二| 亚洲国产精品久久久| 最近2019年好看中文字幕视频| 欧美精品情趣视频| 国产小视频国产精品| 日韩在线视频一区| 日韩欧美国产免费播放| 欧美黄色免费网站| 一本大道久久加勒比香蕉| 国产精品入口日韩视频大尺度| 久久噜噜噜精品国产亚洲综合| 亚洲精品久久久久久久久久久| 日韩精品久久久久| 日韩av电影在线网| 日本精品免费一区二区三区| 亚洲国产天堂久久综合网| 欧美日韩在线第一页| 中文字幕在线看视频国产欧美在线看完整| 欧美理论电影在线观看| 日韩一级黄色av|