java - 通过反射在类中设置值,将类、字段和值作为方法中的参数

标签 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

我尝试使用对象(而不是类),但它从未找到我需要的字段,它只找到对象类具有的字段。 我也尝试过使用泛型,但发生了同样的事情。

最佳答案

您需要将对象的实际实例发送到 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/

相关文章:

java - Sobel 边缘检测、图像卷积

c# - 如何使用反射获取特定接口(interface)类型的所有字段

android - 在 android 2.1 中使用 NFC?

java - 部署 Spring MVC 应用程序以在 Tomcat8 中以根目录运行

java - bin/hadoop jar hadoop-0.20.0-examples.jar wordcount/tmp/gutenberg gutenberg-output

java - 用于推送通知和通知绑定(bind)的 ExchangeService 对象(EWS 应用程序)

java - 通过 Java 使用 Selenium Webdriver 缺少 size() 选项

python - 如何在 Python 中获取当前模块中所有类的列表?

java - Eclipse 调试变量到实例

java - java中是否存储了运行时类型信息?