我有两个类,如下:
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/