Dynamique De La Coulée À L'Aide De Java Réflexion

J'ai deux classes, comme suit:

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

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

Je suis la définition de ces valeurs de manière dynamique à l'aide de Java Réflexion.

Tout d'abord, je crée une instance de Person et j'ai mis la valeur de dob. Après cela, j'ai besoin de mettre un PersonName valeur dans Person. J'ai donc créé une autre instance de PersonName et j'ai mis les valeurs que PersonName. Après cela, je suis en train de mettre la PersonName exemple dans le Person entité.

Pour cela j'ai utilisé un code comme ceci:

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

Ici, parentClass est un Person instance et componentClass est un PersonName instance. Je suis en train de mettre la PersonName dans le Person, mais je suis l'exception suivante:

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

Alors, comment puis-je définir les valeurs dynamiquement?

Grâce.

Tout Mon Code:

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;
}
Et pourquoi voulez-vous faire? Il ressemble à un XY problème.
Class.forName(clazz.getName()) semble un peu redondant.
Hay Paul, Pourquoi sa redondant..?
Vous avez la classe, et que vous êtes en lui demandant ce nom, afin d'obtenir la classe qui a ce nom. Mais vous avez eu depuis le début. Class.forName(clazz.getName()) == clazz.
Java réflexions n'est pas simple. Il nécessite une bonne compréhension de base de la distinction entre les différents concepts de classe, d'exemple, de référence, de la valeur, membre, etc. Et, en particulier, la documentation pour le java.lang.refléter les classes nécessite TRÈS prudent de la lecture, même pour quelqu'un qui est assez à l'aise avec la terminologie. Ralentir et prendre le temps de comprendre.

OriginalL'auteur Amar | 2013-08-01