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