Java 将字段转换为HashMap

Java 将字段转换为HashMap,java,hashmap,Java,Hashmap,我想遍历类的字段,比如class.getDeclaredFields() 但现在我想检查一个字段是否是HashMap,如果是,它应该删除 它的一个价值。 我怎样才能到达这里? 我是无知的,但正在努力 这是我到目前为止的代码:(它使用了spigetAPI) @EventHandler 公共无效onInvClose(InventoryClose事件e){ Player p=(Player)e.getPlayer(); List listeners=HandlerList.getRegisteredL

我想遍历类的字段,比如class.getDeclaredFields() 但现在我想检查一个字段是否是HashMap,如果是,它应该删除 它的一个价值。 我怎样才能到达这里? 我是无知的,但正在努力

这是我到目前为止的代码:(它使用了spigetAPI)

@EventHandler
公共无效onInvClose(InventoryClose事件e){
Player p=(Player)e.getPlayer();
List listeners=HandlerList.getRegisteredListeners(Core.Core);
for(RegisteredListener l:侦听器){
字段[]字段=l.getClass().getDeclaredFields();
用于(字段:字段){
//检查字段是否为哈希映射
if(field.getType().isAssignableFrom(HashMap.class)){
//将球员p从场上移除
}
}
}
}
var-map=(map)字段。get(l)应该可以工作,然后用p键删除。

虽然我现在无法在手机上尝试此操作。

您可以使用
field.get(objectInstance)
获取特定实例的特定字段,然后从该映射中删除特定条目

具体步骤如下:

步骤1:通过调用getDeclaredFields()获取所有声明的字段

步骤2:对于返回的每个字段,使用 等于方法

步骤3:如果字段类型与HashMap匹配,则通过 调用get(objectInstace)并从映射中删除非必需的值

请参考下面的完整示例

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
jshell>class播放器{
…物体某物;
HashMap-someMap;
...> {
…>someMap=newhashmap();
放(1,“玩家”);
...> }
...> }
|改良类玩家
jshell>
jshell>
jshell>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:fields){
…>//检查字段是否为哈希映射
…>if(field.getType().equals(HashMap.class)){
...> 
HashMap data=(HashMap)(field.get(player));
删除(1);
…>System.out.println(“地图中留下的数据是”+Data.size());
...>             }
...>         }
地图中剩余的数据为0

查看可能的重复,不幸的是,var map不是有效的Java。它没有使用
,并且在没有格式化的情况下,在手机上查找正确类型的撇号并不容易。xD也
var
在Java10中完全是一个东西。但是我可以尝试Map:POk,我已经监督了VARJava10的构造。感谢您指出这一点。如果您没有java 10,请使用与您在var的转换中相同的方法。您能更详细地描述get(objectInstance)方法吗?这样我就能更好地记住它:P@RicheeNektar我在回答中也分享了这个例子。您可以从字段变量调用此函数,并传递要检索其值的实例,因此在您的情况下,objectInstance将为l
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