介绍
最近维护数据中遇到一个问题,就是玩家某一个模块使用不正当的方式把可达关卡刷上去了
但是这个数据要想给玩家重置掉需要玩家在线,这不是最麻烦的。最麻烦的是这种数据维护肯定不会以停服为代价进行实现。
在可以执行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();
};