java - 使用反射更改最终变量,或在代码中设置它之前更改它调用的内容
问题描述
所以基本上,我正在尝试获取一个 Minecraft 变量(不受支持的版本,而且没人知道它是什么时候发生的),我需要将变量所具有的块更改为一个新块。我检查了这个问题,结果发现尝试设置最终变量不起作用,因为使用它的代码仍然返回旧值,而使用反射变量的代码返回新值。有人让它在 1.7.2 上工作,但我使用的是 1.7.10 并且代码不再适用于该版本,我前一段时间对其进行了测试。不幸的是,我找不到此代码的来源线程,并且我不再拥有它。
我希望在这一行中将“new BlockFence(“planks_oak”,Material.wood)”更改为“new BlockNewFence(“planks_oak”,Material.wood)”,但我对反射很陌生,不知道如何. 这是行:
blockRegistry.addObject(85, "fence", (new BlockFence("planks_oak", Material.wood)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("fence"));
感谢阅读,如果有的话。我自己尝试过,但老实说一无所获,因为我真的不确定该怎么做才能实现这一点,我真的只知道如何获取和设置一个私有/受保护的字段,但正如我之前发现的那样,最终字段并没有真正起作用一样的方法。如果我需要提供更多信息,请告诉我。我之前提到 final 字段和东西的原因是因为 blockRegistry 和使用这个注册表项的变量都是 final 的。
解决方案
很简单,你可以试试。但请注意,这不是一个好方法。您可能会遭受无法预料的行为。
static class Value {
public static final Integer VALUE = 10;
}
static void setFinalField(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String args[]) throws Exception {
setFinalField(Value.class.getField("VALUE"), 200);
System.out.println(Value.VALUE); //200 here
}
推荐阅读
- firebase - 如何从firebase函数将一个对象访问到查询数据库中的另一个对象?
- php - woocommerce Rest api的php错误
- ios - 如何在viewDidLoad之外设置按钮的标题文本
- java - 将字符串转换为 BigDecimal 并添加逗号分隔符
- spring-boot - Spring Cloud Stream IntegrationFlow with Rabbitmq 消息传递,消费者提供 ASCII 数字作为消息有效负载
- javascript - fabricjs改变视口打破了触摸坐标
- angular - 如何在 RxJS 的订阅中“解决”角度快照
- php - JSON 解析错误。Volley 无法将字符串转换为 JSON 数组
- angular - 角度单位画廊 g_ugFunctions 未定义
- angularjs - 有没有办法将 $scope.variable 传递给 $http.post ?问题 # 在有效载荷中我的变量没有发布