最近遇到问题的解决方案关于反射

2020/04/10 Java

介绍

    最近维护数据中遇到一个问题,就是玩家某一个模块使用不正当的方式把可达关卡刷上去了
但是这个数据要想给玩家重置掉需要玩家在线,这不是最麻烦的。最麻烦的是这种数据维护肯定不会以停服为代价进行实现。
在可以执行groovy脚本的前提下,可以通过脚本话哦去玩家对应的数据。但是这个数据是private修饰,没有对应的setter/getter.

private Map<BattleFieldBattleType, Set<Integer>> passedIds;

属性是这样的。
目的需要通过反射获取这个字段的引用,并且把指定key对应的value clear掉。

实现

GuildBattleFieldManager guildBattleFieldManager = _player.getGuildBattleFieldManager();
Class<? extends GuildBattleFieldManager> aClass = guildBattleFieldManager.getClass();
//GuildBattleFieldManager 就是数据对应的对象
try {
    Field declaredField = aClass.getDeclaredField("passedIds"); //passedIds 就是属性名称
    declaredField.setAccessible(true);
    Set<Integer> o =
            ((Map<BattleFieldConstants.BattleFieldBattleType,Set<Integer>>)declaredField.get(guildBattleFieldManager))
                    .get(key); // 这样就通过反射获取到map中key对应的集合了。
    o.clear();
} catch (Exception e) {
    e.printStackTrace();
};

Search

    Table of Contents