我有这个方法,应该将给定类中的字段设置为指定值:
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
我尝试使用对象(而不是类),但它从未找到我需要的字段,它只找到对象类具有的字段。 我也尝试过使用泛型,但发生了同样的事情。
最佳答案
您需要将对象的实际实例发送到 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);
关于java - 通过反射在类中设置值,将类、字段和值作为方法中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20013155/