将字段转换为HashMap

时间:2018-07-12 15:23:23

标签: java hashmap

我想遍历类的字段,例如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

            }
        }
    }
}

2 个答案:

答案 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