java - 使用 Java 反射的动态转换

标签 java

我有两个类,如下:

public class Person {
    private String dob;
    private PersonName personName;
}

public class PersonName {
    private String firstName;
    private String lastName;
}

我正在使用 Java 反射动态设置这些值。

首先,我创建了一个 Person 的实例,并为 dob 设置了值。之后,我需要在 Person 中设置一个 PersonName 值。因此,我创建了另一个 PersonName 实例,并在该 PersonName 中设置了值。之后,我尝试在 Person 实体中设置 PersonName 实例。

为此我使用了这样的代码:

Class componentClass = Class.forName(clazz.getName());
Field field = parentClass.getDeclaredField(Introspector
                        .decapitalize(clazz.getSimpleName()));
field.setAccessible(true);
field.set(parentClass, componentClass);

这里,parentClass 是一个Person 实例,componentClass 是一个PersonName 实例。我试图在 Person 中设置 PersonName,但出现以下异常:

java.lang.IllegalArgumentException: Can not set com.rise.common.model.PersonName field
com.rise.common.model.Person.personName to java.lang.Class

那么如何动态设置值呢?

谢谢。

我的全部代码:

protected void assignProperties(List<Object[]> argResults,
        List<Class> argAllClassesList, Class argParentClass)
        throws ClassNotFoundException, NoSuchFieldException,
        SecurityException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException, InstantiationException {
    List<Object[]> results = (List<Object[]>) Precondition.ensureNotEmpty(
            argResults, "Output List");
    List<Class<?>> personClassList = new ArrayList<Class<?>>();
    for (Object[] recordValues : results) {
        Class parentClass = Class.forName(this.getPersistentClass()
                .getName());
        parentClass.newInstance();
        int count = 0;
        count = assignValues(recordValues, parentClass, count);
        for (Class clazz : argAllClassesList) {
            Class componentClass = Class.forName(clazz.getName());
            componentClass.newInstance();
            String decapitalize = Introspector.decapitalize(clazz
                    .getSimpleName());
            Field field = parentClass.getDeclaredField(decapitalize);
            field.setAccessible(true);
            assignValues(recordValues, componentClass, count);
             field.set(parentClass, componentClass);
        }
        personClassList.add(parentClass);
    }

    for (Class<?> class1 : personClassList) {
        Class<Person> person = (Class<Person>) class1;
        System.out.println(person);
    }

}

private int assignValues(Object[] argRecordValues, Class argClass,
        int argCount) {
    String paramName = Introspector.decapitalize(argClass.getSimpleName());
    if (Precondition.checkNotEmpty(paramName)) {
        List<Field> fieldNames = TenantConfigHelper.getInstance()
                .getModelNameVsFieldsMap().get(paramName);
        try {
            for (Field field : fieldNames) {
                BeanUtils.setProperty(argClass, field.getName(),
                        argRecordValues[argCount]);
                ++argCount;
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    return argCount;
}

最佳答案

该消息解释了错误所在:componentClass 不是 PersonName 的实例。它是 Class 类型的对象(可能是 Class<PersonName> )。您可能忘记了实例化该类。

编辑:

您的代码:

parentClass.newInstance();

componentClass.newInstance();

这相当于做

new Parent();

new ParentName();

所以它创建了一个实例,但没有将它分配给任何变量,因此不会对创建的实例做任何事情,这将立即成为垃圾回收器。

你想要

Object parent = parentClass.newInstance();
Object component = componentClass.newInstance();
field.set(parent, component);

关于java - 使用 Java 反射的动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18001824/

相关文章:

java - TableColumn JavaFX 的 SetPropertyValueFactory

java - 如何在模块的 Maven 构建期间从文件系统读取文件

java - 遍历一个图,但只有 n 层深

java - Intent-filter 在 Android Studio 中构建两个应用程序而不是一个应用程序

java - : Lcom/vungle/publisher/FullScreenAdActivity from inside codename one app 解析失败

java - 无法访问 AWS EC2 Linux Env​​ 上的 jboss 7 管理控制台

java - int 的基本算术运算 - Java

java - 我应该在 netbeans 中使用什么类型的表单?

java - 标准化迭代计数不起作用。我究竟做错了什么?

java - this 在类定义中的用法