使用反射在类中设置值,将Class,Field和value作为方法中的参数

时间:2013-11-16 00:41:59

标签: java reflection

我有这个方法应该将给定类中的字段设置为指定值:

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类所具有的字段。 我也试过使用泛型,但同样的事情发生了。

1 个答案:

答案 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);