我有这个方法应该将给定类中的字段设置为指定值:
public void setValue(Class<?> instance, String fieldName, Object value) {
try {
Field field = instance.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(instance, value);
} catch (NoSuchFieldException e) {
if (instance.getSuperclass() != null) {
setValue(instance.getSuperclass(), fieldName, value);
} else {
try {
throw new NoSuchFieldException("Could not find field " + fieldName + " in any class.");
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
e.printStackTrace();
}
}
} catch (SecurityException | IllegalArgumentException | IllegalAccessException exx) {
exx.printStackTrace();
}
}
但是,当我尝试设置任何字段时,它会出现此错误:
java.lang.IllegalArgumentException: Can not set float field net.minecraft.server.v1_6_R2.Packet43SetExperience.a to java.lang.Class
我尝试过使用Object(而不是Class),但它从未找到我需要的字段,它只找到Object类所具有的字段。 我也试过使用泛型,但同样的事情发生了。
答案 0 :(得分:4)
您需要将对象的实际实例设置为pass in to the set
method,而不是Class
对象本身。在方法中添加一个参数以获取实际实例:
public void setValue(Class<?> clazz, Object instance, String fieldName, Object value) {
为了清晰起见,我重命名了Class<?>
参数clazz
,因此需要在其他地方进行更改:
Field field = clazz.getDeclaredField(fieldName);
并将实际实例传递给set
:
field.set(instance, value);