App下載

用案例來展示Java反射機制的應用

猿友 2021-07-20 15:52:29 瀏覽數(shù) (2735)
反饋

在學習了 Java 的反射機制之后,就要想要怎么把Java的反射機制應用起來?它的具體應用場景應該是什么樣的?接下來,我將會用一個簡單的案例來展示 Java 的反射機制在場景中的應用。

反射的觸發(fā)時機

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

類加載的過程

反射的常見應用場景

(1)反射機制的典型應用——Tomcat服務器

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

(3)框架設計的底層——Spring框架的IOC控制反轉

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

    ……

反射案例實例展示

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

程序設計:

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

角色1:安琪拉

職業(yè):中單

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

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

角色2:凱

職業(yè):上單

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

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

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

people.properties

創(chuàng)建一個普通的maven工程,利用反射機制實現(xiàn)上述的業(yè)務,工程目錄如下:

工程目錄結構

定義角色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")) {
                //如果是私有的被動技能,則需設置私有技能可使用
                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?中更改配置,工具類就會幫助玩家完成相應的角色創(chuàng)建和技能釋放。

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

運行結果1:

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

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

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

運行結果2:

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

總結

以上就是關于 Java 反射機制的應用,以及具體代碼實例展示的全部內容。如果本篇文章對各位的學習有所幫助,還希望大家能夠多多地關注和支持W3Cschool


0 人點贊