所以我发现如何Change private static final field using Java reflection回来,并一直使用它来修改最终字段与反思,但是然后我想知道为什么我不能应用相同的逻辑到该字段的类型。我想出了可以反射改变字段的声明类型
public static void changeFieldType(Field field, Class newType){
try {
Field typeField = Field.class.getDeclaredField("type");
typeField.setAccessible(true);
typeField.set(field, newType);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
LogUtil.printErr("Failed to edit field type for " + field.getName());
}
}
然而,这促使我想知道如何,如果你说,一个字段的类型设置为Object
,当它最初是一个ArrayList
或其他一些高级别类,这将影响应用程序。这是否会在JVM中创建内部错误,或者这个值只是JVM数据的一个副本,并且改变它不会起作用。任何你可以解决这个问题的光是非常感谢。
简答:不。无法更改变量的类型,也无法更改其范围(例如,使其变为静态)。 –
只有JVM支持,Instrumentation才能执行此操作。主流JVM根本不支持这一点。 – Holger