最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射機(jī)制(Reflection)淺析

 更新時(shí)間:2014年07月01日 08:55:42   投稿:junjie  
這篇文章主要介紹了Java反射機(jī)制(Reflection)淺析,本文以實(shí)例講解Java的反射機(jī)制,需要的朋友可以參考下

Reflection也就是反射,是Java語(yǔ)言的一個(gè)重要特征,我們知道,在使用一個(gè)類之前,我們往往都已經(jīng)創(chuàng)建好它了,比如創(chuàng)建一個(gè)類文件,然后再寫些屬性、方法等,也就是這種類是靜態(tài)的,但反射機(jī)制卻允許你動(dòng)態(tài)地創(chuàng)建一個(gè)類。除了動(dòng)態(tài)地創(chuàng)建一個(gè)類外,我們還能動(dòng)態(tài)地獲取同類對(duì)象的數(shù)據(jù),并將這些數(shù)據(jù)賦給新創(chuàng)建的類,這有點(diǎn)類似克隆復(fù)制。在很多時(shí)候,我們都需要這種動(dòng)態(tài)創(chuàng)建類的特征,比如在處理一些業(yè)務(wù),但這些業(yè)務(wù)卻又稍有區(qū)別的時(shí)候,往往對(duì)應(yīng)著多個(gè)類,在處理的時(shí)候,我們就要根據(jù)不同的業(yè)務(wù)處理來(lái)調(diào)用不同的類,這個(gè)時(shí)候反射機(jī)制就派上用場(chǎng)了。

以下是JDK API中關(guān)于軟件包java.lang.reflect的描述:

提供類和接口,以獲取關(guān)于類和對(duì)象的反射信息。在安全限制內(nèi),反射允許編程訪問(wèn)關(guān)于加載類的字段、方法和構(gòu)造方法的信息,并允許使用反射字段、方法和構(gòu)造方法對(duì)對(duì)象上的基本對(duì)等項(xiàng)進(jìn)行操作。

如果必需的 ReflectPermission 可用,則 AccessibleObject 允許抑制訪問(wèn)檢查。

Arrays 提供動(dòng)態(tài)創(chuàng)建和訪問(wèn)數(shù)組的靜態(tài)方法。

此包中的類以及 java.lang.Class 可以適應(yīng)以下應(yīng)用程序的需要:調(diào)試程序、解釋程序、對(duì)象檢查程序、類瀏覽程序,以及服務(wù)(比如,Object Serialization 和 JavaBean,它們需要訪問(wèn)目標(biāo)對(duì)象(基于其運(yùn)行時(shí)類)的公共成員或給定類聲明的成員)。

下面通過(guò)兩個(gè)簡(jiǎn)單例子來(lái)說(shuō)明反射的用法,首先先創(chuàng)建一個(gè)Person類:

復(fù)制代碼 代碼如下:

package test;

public class Person {

private int age;

private String name = "";

private String[] arr = new String[2];

public Person(){}

public Person(String name,int age){
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String[] getArr() {
return arr;
}

public void setArr(String[] arr) {
this.arr = arr;
}

}

實(shí)例1:得到Person類的屬性及方法信息

復(fù)制代碼 代碼如下:

private static void testSimpleReflect(){
String className = "test.Person";
try {
Class c = Class.forName(className);
Field[] fields = c.getDeclaredFields();
Method[] m = c.getDeclaredMethods();
for (Field field : fields){
System.out.println(field.getName());
}
for (Method method : m){
System.out.println(m.getClass());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

這種是非常簡(jiǎn)單的,通過(guò)類所在包路徑來(lái)得到一個(gè)類,在實(shí)際的工作中,也是使用最多的。

實(shí)例2:對(duì)象復(fù)制

復(fù)制代碼 代碼如下:

@SuppressWarnings("unchecked")
public static Object copy(Object object) throws Exception {
// 獲得對(duì)象類型
Class classType = object.getClass();
System.out.println("" + classType.getName()); // 通過(guò)默認(rèn)構(gòu)造方法創(chuàng)建一個(gè)新的對(duì)象
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {}); // 獲得對(duì)象的所有屬性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 獲得和屬性對(duì)應(yīng)的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1); // 獲得和屬性對(duì)應(yīng)的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1); // 獲得和屬性對(duì)應(yīng)的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,
new Class[] {}); // 獲得和屬性對(duì)應(yīng)的setXXX()方法
Method setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() }); // 調(diào)用原對(duì)象的getXXX()方法
Object value = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value); // 調(diào)用拷貝對(duì)象的setXXX()方法
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}

利用反射來(lái)實(shí)現(xiàn)對(duì)象的復(fù)制,我們通常不用自己這么干,因?yàn)殚_源系統(tǒng)BeanUtils已經(jīng)替我們做好對(duì)象拷貝的封裝了,我們直接調(diào)用它的方法即可,但值得注意的是,BeanUtils也是基于反射機(jī)制來(lái)做的封裝

下面是一調(diào)用:

復(fù)制代碼 代碼如下:

public static void main(String[] args){
Person person = new Person("tom",22);
String[] strs = new String[]{"a","b"};
person.setArr(strs);
try {
Person p = (Person)copy(person);
System.out.println(p.getName()+">>"+p.getAge());
for (String str : p.getArr()){
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
//        testSimpleReflect();
}

相關(guān)文章

  • spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例代碼

    spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • SpringBoot實(shí)現(xiàn)接口校驗(yàn)簽名調(diào)用的項(xiàng)目實(shí)踐

    SpringBoot實(shí)現(xiàn)接口校驗(yàn)簽名調(diào)用的項(xiàng)目實(shí)踐

    在以SpringBoot開發(fā)后臺(tái)API接口時(shí),會(huì)存在哪些接口不安全的因素呢?通常如何去解決的呢?本文主要介紹了SpringBoot實(shí)現(xiàn)接口校驗(yàn)簽名調(diào)用的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2023-09-09
  • java面向?qū)ο罄^承與多態(tài)介紹

    java面向?qū)ο罄^承與多態(tài)介紹

    大家好,本篇文章主要講的是java面向?qū)ο罄^承與多態(tài)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • java8新特性之接口默認(rèn)方法示例詳解

    java8新特性之接口默認(rèn)方法示例詳解

    這篇文章主要給大家介紹了關(guān)于java8新特性之接口默認(rèn)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • jdk8的datetime時(shí)間函數(shù)使用示例

    jdk8的datetime時(shí)間函數(shù)使用示例

    這篇文章主要介紹了jdk8的datetime時(shí)間函數(shù)使用示例,需要的朋友可以參考下
    2014-03-03
  • SpringBoot 定制化返回?cái)?shù)據(jù)的實(shí)現(xiàn)示例

    SpringBoot 定制化返回?cái)?shù)據(jù)的實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot 定制化返回?cái)?shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java StringBuilder類相關(guān)知識(shí)總結(jié)

    Java StringBuilder類相關(guān)知識(shí)總結(jié)

    這篇文章主要介紹了Java StringBuilder類相關(guān)知識(shí)總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java?如何獲取某年的第一天和最后一天

    Java?如何獲取某年的第一天和最后一天

    在統(tǒng)計(jì)的數(shù)據(jù)是時(shí)候,要統(tǒng)計(jì)某年的數(shù)據(jù),開始時(shí)間是某年的第一天,結(jié)束時(shí)間是某年的最后一天,該如何獲取某年的第一天和最后一天,今天通過(guò)本文介紹下Java獲取某年的第一天和最后一天,需要的朋友可以參考下
    2023-07-07
  • java Stream的聚合功能面試精講

    java Stream的聚合功能面試精講

    這篇文章主要為大家介紹了java Stream的聚合功能面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java輕松使用工具類實(shí)現(xiàn)獲取MP3音頻時(shí)長(zhǎng)

    Java輕松使用工具類實(shí)現(xiàn)獲取MP3音頻時(shí)長(zhǎng)

    在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來(lái)獲取一個(gè)MP3音頻文件的時(shí)間長(zhǎng)度,感興趣的同學(xué)繼續(xù)往下閱讀吧
    2021-10-10

最新評(píng)論

五常市| 醴陵市| 屏东县| 龙南县| 洪泽县| 江山市| 永定县| 博爱县| 宁陵县| 新营市| 甘泉县| 横山县| 陵水| 明星| 定西市| 丰台区| 甘洛县| 大冶市| 徐州市| 吉林省| 潞城市| 工布江达县| 汽车| 惠水县| 牙克石市| 无锡市| 绵阳市| 固阳县| 大悟县| 灵武市| 蓝山县| 米泉市| 孟州市| 拉萨市| 宜昌市| 温泉县| 游戏| 黄浦区| 新兴县| 海淀区| 农安县|