溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java反射機(jī)制如何應(yīng)用

發(fā)布時間:2022-02-24 10:45:06 來源:億速云 閱讀:126 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Java反射機(jī)制如何應(yīng)用的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

反射的觸發(fā)時機(jī)

要想了解反射機(jī)制在什么時候發(fā)生作用,首先就要先了解類加載的過程。在馮·諾依曼定義的計算機(jī)模型中,任何的程序都需要加載到內(nèi)存中才可以和 CPU 進(jìn)行交流。字節(jié)碼 .class文件也是不例外的,同樣是要加載內(nèi)存中才能實現(xiàn)實例化。而類加載就是將一個.class字節(jié)碼文件實例化成java.lang.Class對象,并進(jìn)行相關(guān)初始化的過程。

反射的常見應(yīng)用場景

(1)反射機(jī)制的典型應(yīng)用——Tomcat服務(wù)器

(2)數(shù)據(jù)庫驅(qū)動的加載——使用 JDBC 連接數(shù)據(jù)庫時使用 Class.forName()

(3)框架設(shè)計的底層——Spring框架的IOC控制反轉(zhuǎn)

(4)對于繁重冗雜重復(fù)的代碼進(jìn)行優(yōu)化

    ……

反射案例實例展示

業(yè)務(wù)需求:開發(fā)一個工具類,在不修改工具類的代碼基礎(chǔ)上,用戶只需要在配置文件中簡單配置完成對象的創(chuàng)建和方法的調(diào)用。

程序設(shè)計:

游戲中有兩個可以供選擇英雄

角色1:安琪拉

職業(yè):中單

技能:在程序中使用public來修飾,代表角色行為的方法。

被動:在程序中使用private來修飾,代表角色行為的方法。

角色2:凱

職業(yè):上單

技能:在程序中使用public來修飾,代表角色行為的方法。

被動:在程序中使用private來修飾,代表角色行為的方法。

這時候我們需要一個配置文件來供玩家配置想要選擇的英雄角色以及要釋放的技能。

people.properties

創(chuàng)建一個普通的maven工程,利用反射機(jī)制實現(xiàn)上述的業(yè)務(wù)

定義角色1 AnQiLa:

package com.demo.roles;

public class AnQiLa {
    private String name="安琪拉";
    private String job="中單";

    //私有化角色觸發(fā)被動技能的方法
    private String getPassiveSkill(){
        return name+": [觸發(fā)了被動技能!]";
    }

    //角色一技能
    public String getFirstSkill(){
        return name+": [在中路使用了一技能]";

    }

    public String getName() {
        return name;
    }

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

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }
}

定義角色2:

package com.demo.roles;

public class Kai {
    private String name="凱";
    private String job="上單";

    //私有化角色觸發(fā)被動技能的方法
    private String getPassiveSkill(){
        return name+": [觸發(fā)了被動技能!]";
    }

    //角色一技能
    public String getFirstSkill(){
        return name+": [在上路使用了一技能]";

    }

    public String getName() {
        return name;
    }

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

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }
}

定義工具類:

package com.demo.controller;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectUtil {
    public static void main(String[] args) throws Exception {
        //加載玩家配置信息
        Properties properties = new Properties();
        ClassLoader classLoader = ReflectUtil.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("people.properties");
        properties.load(resourceAsStream);

        //從配置文件中讀取玩家選擇的英雄角色
        String role = properties.getProperty("object.role");
        //從配置文件中讀取玩家使用的技能
        String actions = properties.getProperty("method.skills");
        String[] skills = actions.split(",");

        //通過反射實例化玩家選擇的角色對象
        Class aClass = Class.forName(role);
        Object instance = aClass.newInstance();

        //遍歷玩家選擇使用的技能
        for (String skill : skills) {
            //獲取玩家使用角色的所有技能
            Method declaredSkill = aClass.getDeclaredMethod(skill);
            //判斷獲得的技能是否私有
            if (declaredSkill.toString().contains("private")) {
                //如果是私有的被動技能,則需設(shè)置私有技能可使用
                declaredSkill.setAccessible(true);
                //使用被動
                Object invoke = declaredSkill.invoke(instance, null);
                System.out.println(invoke.toString());
            } else {
                //如果是普通技能 則可以直接訪問
                Object invoke = declaredSkill.invoke(instance, null);
                System.out.println(invoke.toString());
            }
        }
    }
}

剩下的就只要玩家在配置文件people.properties中更改配置,工具類就會幫助玩家完成相應(yīng)的角色創(chuàng)建和技能釋放。

#玩家配置需要選擇的英雄角色
#選擇AnQiLa[安琪拉]
object.role=com.demo.roles.AnQiLa
#玩家配置需要使用的技能,多個技能之間用英文逗號隔開
#選擇使用一技能并觸發(fā)私有的被動技能
method.skills=getPassiveSkill,getFirstSkill

運行結(jié)果1:

安琪拉: [觸發(fā)了被動技能!] 
安琪拉: [在中路使用了一技能] 
 Process finished with exit code 0

想要更換英雄,就可以修改配置文件中的內(nèi)容:

#玩家配置需要選擇的英雄角色
#選擇Kai[凱]
object.role=com.demo.roles.Kai
#玩家配置需要使用的技能,多個技能之間用英文逗號隔開
#選擇使用一技能并觸發(fā)私有的被動技能
method.skills=getPassiveSkill,getFirstSkill

運行結(jié)果2:

凱: [觸發(fā)了被動技能!] 
凱: [在上路使用了一技能] 
 Process finished with exit code 0

以上就是“Java反射機(jī)制如何應(yīng)用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI