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

Spring反射內(nèi)置工具類ReflectionUtils用法及說明

 更新時間:2026年06月03日 15:10:33   作者:bingbingYang_88  
這段文章主要介紹了Java反射機制及其在獲取sentinel熔斷規(guī)則map和操作類屬性方法中的應用,通過JDK和Spring的ReflectionUtils展示了如何優(yōu)雅地處理反射操作,提升代碼的可閱讀性和維護性

前言

最近在搞通過sentinel熔斷后,觸發(fā)數(shù)據(jù)庫代理ShardingSphere 代理直連DB的時候,這里需要通過反射獲取sentinel熔斷的規(guī)則map。

原先是通過jdk反射機制,發(fā)現(xiàn)一堆異常處理,特別的不友好,代碼整潔度和可閱讀性也不是很好,后面發(fā)現(xiàn)spring給我們提供了一個ReflectionUtils。

簡直不要太香了。

反射

什么是反射

java反射機制在運行狀態(tài)中,對于任何一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性。

這種動態(tài)的獲取信息以及動態(tài)的調(diào)用對象的方法的功能我們稱之為java的反射機制

eg:

類的class聲明(class對象),變量(field),方法(method)等等信息,利用反射技術(shù)可以對一個類進行解剖,動態(tài)獲取信息進行處理。

反射的實現(xiàn)

獲取class對象的三種實現(xiàn)

Object ——> getClass();

 Demo demo = new Demo();
        Class<? extends Demo> clazz = demo.getClass();

任何數(shù)據(jù)對象(包括數(shù)據(jù)基本類型)都有一個靜態(tài)的class屬性

Class<Demo> clazz = Demo.class;

通過Class類的靜態(tài)方法:forName(String className)(常用)

Class clazz = Class.forName("com.demo.Demo");

例子 獲取類中hashMap的值

獲取com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager 實體類中hashMap的數(shù)據(jù),從以下JDK和spring的封裝類中,我們能明顯的感受到易用行。

通過JDK實現(xiàn)

 public void getRule()  {
        Class three = null;
        Object obj = null;
        Method getCircuitBreakers = null;
        try {
            three = Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            obj = three.newInstance();
            Field[] declaredFields = three.getDeclaredFields();
            Field circuitBreakers1 = three.getDeclaredField("circuitBreakers");
            circuitBreakers1.setAccessible(true);
            HashMap<String, List<CircuitBreaker>> map = new HashMap<>();
            map = (HashMap<String, List<CircuitBreaker>>)circuitBreakers1.get(three);

            Method[] declaredMethods = three.getDeclaredMethods();
            Method getCircuitBreakers1 = three.getDeclaredMethod("getCircuitBreakers", String.class);

            getCircuitBreakers1.setAccessible(true);
            List<AbstractCircuitBreaker> invoke = (List<AbstractCircuitBreaker>) getCircuitBreakers1.invoke(obj, "http-api:/listFeedMessages");
            System.out.println("invoke--------"+JSONObject.toJSONString(invoke.get(0)));
            System.out.println(invoke.get(0).currentState().toString()+System.currentTimeMillis());
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        }
    }

通過org.springframework.util.ReflectionUtils

 public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.getField(circuitBreakers,clazz);
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

對屬性的操作

public static Field findField(Class<?> clazz, String name) 在類中查找指定屬性

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

public static Field findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type) 更精確的在類中查找指定屬性,可以在指定屬性的類型

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers",Map.class);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

public static Object getField(Field field, @Nullable Object target) 獲取對象的值

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.getField(circuitBreakers,clazz);
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

void setField(Field field, Object target, Object value),可以設置 target 對象的 field 屬性值,值為 value。

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.setField(circuitBreakers,clazz,Lists.newArrayList());
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

void makeAccessible(Field field),取消java的權(quán)限控制檢查,方便private私有訪問權(quán)限的操作。

對方法的操作

  • Method findMethod(Class clazz, String name),在類中查找指定名字方法
  • Method findMethod(Class clazz, String name, Class… paramTypes),有的時候同一個類可能會有多個方法名相同,形參數(shù)不同的重載方法,可以使用這個方法更精確的在類中找到指定方法;
  • Method[] getAllDeclaredMethods(Class leafClass),獲得類中所有方法,包括繼承而來的。

執(zhí)行方法:

  • Object invokeMethod(Method method, Object target),執(zhí)行無參數(shù)的方法;
  • Object invokeMethod(Method method, Object target, Object… args),執(zhí)行有參數(shù)的方法
  • void makeAccessible(Method method),如果是私有方法,可以取消 Java 權(quán)限檢查,以便后續(xù)執(zhí)行該私有方法

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

正定县| 金阳县| 宜兰县| 晋宁县| 惠东县| 淮阳县| 贺兰县| 栾川县| 古田县| 达州市| 皋兰县| 双峰县| 金秀| 阳山县| 白河县| 高密市| 南郑县| 朝阳县| 兴安盟| 城固县| 无为县| 松原市| 九寨沟县| 黄浦区| 凉城县| 高碑店市| 锡林郭勒盟| 仙居县| 荃湾区| 揭阳市| 新绛县| 浦县| 平潭县| 巴彦淖尔市| 获嘉县| 手游| 罗源县| 杭锦旗| 兴国县| 双辽市| 临朐县|