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

Java中反射機(jī)制和作用詳解

 更新時(shí)間:2021年05月06日 10:34:33   作者:Java大師-  
這篇文章主要給大家介紹了關(guān)于Java中反射機(jī)制和作用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

很多剛學(xué)Java反射的同學(xué)可能對(duì)反射技術(shù)一頭霧水,為什么要學(xué)習(xí)反射,學(xué)習(xí)反射有什么作用,不用反射,通過new也能創(chuàng)建用戶對(duì)象。

那么接下來大師就帶你們了解一下反射是什么,為什么要學(xué)習(xí)反射?

下面我們首先通過一個(gè)實(shí)例來說明反射的好處:

方法1、不用反射技術(shù),創(chuàng)建用戶對(duì)象,調(diào)用sayHello方法

1.1 我們首先創(chuàng)建一個(gè)User類

package com.dashi;

/**
 * Author:Java大師
 * User對(duì)象,包含用戶的id和姓名以及sayHello方法
 */
public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String sayHello(String who) {
        return who+ "{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

1.2 創(chuàng)建測試用例

package com.dashi;

import org.junit.Test;

/**
 * 創(chuàng)建Juinit測試對(duì)象
 */
public class Test01 {

    @Test
    public void test01(){
        User user = new User();
        user.setId(1);
        user.setName("Java大師");
        //調(diào)用sayHello方法
        System.out.println(user.sayHello("user1"));
    }
}

1.3運(yùn)行結(jié)果如下,打印出sayHello結(jié)果:

user1{id=1, name='Java大師'}

Process finished with exit code 0

方法2、通過反射技術(shù),創(chuàng)建用戶對(duì)象,調(diào)用sayHello方法

2.1 調(diào)用測試用例

@Test
    public void test02(){
        try {
            //創(chuàng)建用戶對(duì)象字符串
            String obj = "com.dashi.User";
            //通過用戶對(duì)象字符串加載類
            Class clz = Class.forName(obj);
            //通過newInstance方法,創(chuàng)建用戶對(duì)象
            User user = (User)clz.newInstance();
            user.setId(2);
            user.setName("Java大師2");
            //調(diào)用sayHello方法
            System.out.println(user.sayHello("user2"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

2.2 運(yùn)行結(jié)果如下,打印出sayHello結(jié)果:

user1{id=1, name='Java大師'}
user2{id=2, name='Java大師2'}

Process finished with exit code 0 

通過兩者以上對(duì)比,發(fā)現(xiàn)方法1和方法2都能創(chuàng)建用戶對(duì)象,并調(diào)用sayHello方法,并且打印的結(jié)果都正確。但是方法2比方法1先進(jìn)的地方是方法2針對(duì)字符串編程,方法1針對(duì)實(shí)體類編程。

那么針對(duì)字符串編程有什么好處呢,小伙伴們耐心接著往下看:

我們通過一個(gè)Dao層來演示下針對(duì)字符串編程的好處:

假設(shè)我們有一個(gè)IUserDao接口,里面有一個(gè)load方法,代碼如下:

package com.dashi;

public interface IUserDao {
    public void load();
}

有兩個(gè)實(shí)現(xiàn)類來實(shí)現(xiàn)該IUserDao接口,實(shí)現(xiàn)類如下:

package com.dashi;

/**
 * A實(shí)現(xiàn)類
 */
public class AUserDao implements IUserDao{
    @Override
    public void load() {
        System.out.println("這是AUserDao");
    }
}
package com.dashi;

/**
 * B實(shí)現(xiàn)類
 */
public class BUserDao implements IUserDao{
    @Override
    public void load() {
        System.out.println("這是BUserDao");
    }
}

方法3、不通過反射技術(shù),創(chuàng)建IUserDao,調(diào)用load方法

@Test
    public void testDao01(){
        IUserDao userDao = new AUserDao();
        userDao.load();
    }

打印結(jié)果如下:

這是AUserDao

Process finished with exit code 0 

方法4、通過反射技術(shù),創(chuàng)建IUserDao,調(diào)用load方法

@Test
    public void testDao02(){
        try {
            //創(chuàng)建接口實(shí)現(xiàn)類字符串
            String dao_str = "com.dashi.AUserDao";
            //通過類加載的方式創(chuàng)建IUserDao
            IUserDao userDao = (IUserDao) Class.forName(dao_str).newInstance();
            //調(diào)用load方法
            userDao.load();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

打印結(jié)果如下:

這是AUserDao
這是AUserDao

Process finished with exit code 0 

通過類加載的方式,我們也創(chuàng)建了IUserDao對(duì)象,調(diào)用了load方法,和方法3的運(yùn)行結(jié)果一樣

方法5、通過反射技術(shù),創(chuàng)建IUserDao,調(diào)用load方法

@Test
    public void testDao03(){
        try {
            //創(chuàng)建接口實(shí)現(xiàn)類字符串
            String dao_str = "com.dashi.BUserDao";
            //通過類加載的方式創(chuàng)建IUserDao
            Class clz = Class.forName(dao_str);
            IUserDao userDao= (IUserDao)clz.newInstance();
            //創(chuàng)建調(diào)用方法字符串
            String mm = "load";
            //創(chuàng)建method對(duì)象
            Method method =  clz.getMethod(mm);
            //調(diào)用通過反射調(diào)用invoke方法
            method.invoke(userDao);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

運(yùn)行結(jié)果如下:

這是AUserDao
這是AUserDao
這是BUserDao

Process finished with exit code 0 

通過method.invoke方法也可以實(shí)現(xiàn)load方法的調(diào)用

方法5比方法4和方法3更加靈活,不需要知道AUserDao和BUserDao實(shí)體類,只提供類的字符串和類的方法名稱,通過反射就可以實(shí)現(xiàn)方法的調(diào)用

實(shí)戰(zhàn)中的實(shí)際意義

假設(shè)我們的Dao層,從mysql遷移導(dǎo)oracle,SQL server等

運(yùn)用反射技術(shù),通過字符串編程,那么我們不需要進(jìn)行Dao層實(shí)體類的更改,只需要改動(dòng)我們的字符串名字就可以進(jìn)行Dao層的更新。比如:

1、不通過反射技術(shù),我們需要修改實(shí)現(xiàn)類中的AUserDao改為BUserDao
IUserDao userDao = new AUserDao();
userDao.load();
``如果有幾百個(gè)Dao,我們需要修改幾百次``
``
2、運(yùn)用發(fā)射技術(shù)通過字符串編程,我們可以把字符串定義在properties文件中,通過修改properties文件中的配置即可實(shí)現(xiàn)Dao的更新
 //創(chuàng)建接口實(shí)現(xiàn)類字符串
 String dao_str = "com.dashi.AUserDao"; //可以改寫為:String dao_str = PropertyUtil.get("dao");
 //通過類加載的方式創(chuàng)建IUserDao
 IUserDao userDao = (IUserDao) Class.forName(dao_str).newInstance();
 //調(diào)用load方法
 userDao.load();

這就是反射技術(shù)的實(shí)際運(yùn)用,通過以上實(shí)例就可以看出字符串編程和通過實(shí)現(xiàn)類編程的最大的區(qū)別和實(shí)際的意義

并且通過反射技術(shù)可以使我們的編程更加靈活

靈活運(yùn)用反射技術(shù),我們可以設(shè)計(jì)出更加靈活的框架哦~

總結(jié)

到此這篇關(guān)于Java中反射機(jī)制和作用詳解的文章就介紹到這了,更多相關(guān)Java反射機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java Executors工具類的相關(guān)方法使用創(chuàng)建

    java Executors工具類的相關(guān)方法使用創(chuàng)建

    這篇文章主要為大家介紹了java Executors工具類的相關(guān)方法使用創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java與Python兩種編程語言的比較與應(yīng)用舉例詳解

    Java與Python兩種編程語言的比較與應(yīng)用舉例詳解

    這篇文章主要介紹了Java與Python兩種編程語言比較與應(yīng)用的相關(guān)資料,Java和Python各有特點(diǎn),Java適用于企業(yè)級(jí)應(yīng)用開發(fā),Python則在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域占優(yōu)勢,兩者在語法、應(yīng)用領(lǐng)域、性能、開發(fā)效率等方面存在差異,需要的朋友可以參考下
    2025-02-02
  • java中的十個(gè)大類總結(jié)

    java中的十個(gè)大類總結(jié)

    java.lang.string字符串類將是無可爭議的冠軍在任何一天的普及和不可以否認(rèn)。這是最后一個(gè)類,用來創(chuàng)建操作不可變字符串字面值
    2013-10-10
  • Spring?Boot+RabbitMQ?通過fanout模式實(shí)現(xiàn)消息接收功能(支持消費(fèi)者多實(shí)例部署)

    Spring?Boot+RabbitMQ?通過fanout模式實(shí)現(xiàn)消息接收功能(支持消費(fèi)者多實(shí)例部署)

    這篇文章主要介紹了Spring?Boot+RabbitMQ?通過fanout模式實(shí)現(xiàn)消息接收(支持消費(fèi)者多實(shí)例部署),本文通過案例場景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot+Redis海量重復(fù)提交問題解決

    SpringBoot+Redis海量重復(fù)提交問題解決

    在實(shí)際的開發(fā)項(xiàng)目中,一個(gè)對(duì)外暴露的接口往往會(huì)面臨很多次請(qǐng)求,所以本文介紹一下SpringBoot+Redis海量重復(fù)提交問題解決,感興趣的可以了解一下
    2023-12-12
  • SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn)代碼

    SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java中靜態(tài)代理的使用與原理詳解

    Java中靜態(tài)代理的使用與原理詳解

    這篇文章主要介紹了Java中靜態(tài)代理的使用與原理詳解,代理模式是為一個(gè)對(duì)象提供一個(gè)替身,以控制對(duì)這個(gè)對(duì)象的訪問,即通過代理對(duì)象訪問目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能,需要的朋友可以參考下
    2023-09-09
  • 教你在JNA中將本地方法映射到JAVA代碼中的示例

    教你在JNA中將本地方法映射到JAVA代碼中的示例

    對(duì)于JNI來說,我們可以使用native關(guān)鍵字來定義本地方法。那么在JNA中有那些在JAVA代碼中定義本地方法的方式呢?對(duì)JNA本地方法映射JAVA代碼的相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • Java判斷一個(gè)實(shí)體是不是空的簡單方法

    Java判斷一個(gè)實(shí)體是不是空的簡單方法

    這篇文章主要給大家介紹了關(guān)于Java判斷一個(gè)實(shí)體是不是空的簡單方法,實(shí)際項(xiàng)目中我們會(huì)有很多地方需要判空校驗(yàn),文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • Spring Boot拓展XML格式的請(qǐng)求和響應(yīng)操作過程

    Spring Boot拓展XML格式的請(qǐng)求和響應(yīng)操作過程

    在我們開發(fā)過程中,我們經(jīng)常使用的參數(shù)絕大多少事HTML和JSON格式的請(qǐng)求和響應(yīng)處理,但是我們?cè)趯?shí)際開發(fā)過程中,我們可能經(jīng)歷一些,比如對(duì)于XML格式的請(qǐng)求,本文給大家介紹Spring Boot拓展XML格式的請(qǐng)求和響應(yīng),感興趣的朋友一起看看吧
    2023-10-10

最新評(píng)論

红河县| 呼图壁县| 敦化市| 尉氏县| 阆中市| 连江县| 麦盖提县| 海南省| 黑山县| 秦安县| 徐闻县| 雅江县| 会同县| 靖安县| 彰武县| 五常市| 额敏县| 会昌县| 浮山县| 丰镇市| 花莲县| 莱芜市| 柳河县| 阿克苏市| 乌拉特中旗| 颍上县| 阜平县| 全州县| 湖北省| 岳普湖县| 商洛市| 绍兴县| 田林县| 龙南县| 泸水县| 德惠市| 铜山县| 巴南区| 沂源县| 桑日县| 财经|