我想遍历类的字段,例如Class.getDeclaredFields() 但是现在我想检查一个字段是否为HashMap,如果是,则应将其删除 一个价值。 我怎样才能做到这一点? 我一无所知,但尝试
到目前为止,这是我的代码:(它利用了Spigot API)
@EventHandler
public void onInvClose(InventoryCloseEvent e) {
Player p = (Player) e.getPlayer();
List<RegisteredListener> listeners = HandlerList.getRegisteredListeners(Core.core);
for(RegisteredListener l : listeners) {
Field[] fields = l.getClass().getDeclaredFields();
for(Field field : fields) {
// Check if field is a HashMap
if(field.getType().isAssignableFrom( HashMap.class )) {
// Remove Player p from field
}
}
}
}
答案 0 :(得分:1)
var map = (Map<Player, YourValueObject>)field.get(l);
应该可以工作,然后只需用p键将其删除即可。
虽然我现在无法在手机上尝试。
答案 1 :(得分:0)
您可以使用field.get(objectInstance)
获取特定实例的特定字段,然后从该映射中删除特定条目。
详细步骤如下:
步骤1:通过调用getDeclaredFields()获取所有声明的字段
第2步:对于每个返回的字段,通过使用HashMap将类型进行比较 等于方法。
第3步:如果字段类型与HashMap匹配,则通过 调用get(objectInstace)并从map中删除不需要的值。
请参考下面的完整示例;
jshell> class Player{
...> Object someObject;
...> HashMap<Integer,String> someMap;
...> {
...> someMap = new HashMap<>();
...> someMap.put(1,"Player");
...> }
...> }
| modified class Player
jshell>
jshell>
jshell> Player player = new Player();
player ==> Player@71423665
jshell> java.lang.reflect.Field[] fields = player.getClass().getDeclaredFields();
fields ==> Field[2] { java.lang.Object Player.someObject, ja ... l.HashMap Player.someMap }
jshell> for(java.lang.reflect.Field field : fields) {
...> // Check if field is a HashMap
...> if(field.getType().equals( HashMap.class)) {
...>
...> HashMap<Integer,String> data = (HashMap<Integer,String>)(field.get(player));
...> data.remove(1);
...> System.out.println("Data left in map is "+data.size());
...> }
...> }
Data left in map is 0