我正在尝试修改位于我必须使用反射的地方的一些内容。问题是我希望将这些值(恰好是一个列表)作为Field然后更改它。当我得到该字段时,我得到字段的引用(副本)还是得到实际字段(这意味着如果我编辑它将从我从哪里开始改变)?
//Get command map
Field field = this.getServer().getClass().getDeclaredField("commandMap");
field.setAccessible(true);
CommandMap cmdmap = (CommandMap) field.get(this.getServer());
//Get commands map
Field f = cmdmap.getClass().getDeclaredField("knownCommands");
f.setAccessible(true);
Map<String, Command> kcmds = (Map<String, Command>) f.get(cmdmap);
//Unregister all
for(String s: cmdToUnregister)
{
for(String fp : kcmds.keySet())
{
if(s.equalsIgnoreCase(kcmds.get(fp).getName()))
{
kcmds.remove(fp);
}
}
}
//Re set fields
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException ex) {
Logger.getLogger(DivinityRealm.class.getName()).log(Level.SEVERE, null, ex);
}
我试过这个,它并没有刻意地工作。无论我不知道问题是我使用Reflection的方式还是我使用错误方法的事实?
答案 0 :(得分:0)
当我发现kcmds
实际上是实际列表的副本时,我的问题得到解决,必须使用反射重新设置它才能实际进行任何更改。另外,您只是获取副本并对其进行编辑以使其成为GC