Я использую отражение для сопоставления методов получения из одного класса с установщиками в другом, то есть у меня есть классы форм, используемые stuts1 для отображения в основном текста (Strings), и у меня есть чистые объекты Java, используемые серверной частью, которая содержит значения в конкретный тип. В настоящее время у меня работает отображение между геттерами и сеттерами, что было легко, но у меня проблемы со смешанными типами. Я использую тип параметра из установщика, чтобы увидеть, что ожидается, и поэтому мне нужно определить тип объекта из геттера и привести его как к ожидаемому типу.
* 1003 Е.Г. *
HomePageForm -> HomePageData
Name="Alexei" -> String name; (Maps correctly)
Age="22" -> int age; (Needs casting from string to int and visa-vera in reverse)
Ниже приведен мой код
/**
* Map the two given objects by reflecting the methods from the mapTo object and finding its setter methods. Then
* find the corresponding getter method in the mapFrom class and invoke them to obtain each attribute value.
* Finally invoke the setter method for the mapTo class to set the attribute value.
*
* @param mapFrom The object to map attribute values from
* @param mapTo The object to map attribute values to
*/
private void map(Object mapFrom, Object mapTo) {
Method [] methods = mapTo.getClass().getMethods();
for (Method methodTo : methods) {
if (isSetter(methodTo)) {
try {
//The attribute to map to setter from getter
String attName = methodTo.getName().substring(3);
//Find the corresponding getter method to retrieve the attribute value from
Method methodFrom = mapFrom.getClass().getMethod("get" + attName, new Class<?>[0]);
//If the methodFrom is a valid getter, set the attValue
if (isGetter(methodFrom)) {
//Invoke the getter to get the attribute to set
Object attValue = methodFrom.invoke(mapFrom, new Object[0]);
Class<?> fromType = attValue.getClass();
//Need to cast/parse type here
if (fromType != methodTo.getParameterTypes()[0]){
//!!Do something to case/parse type!!
} //if
//Invoke the setter to set the attribute value
methodTo.invoke(mapTo, attValue);
} //if
} catch (Exception e) {
Logger.getLogger(Constants.APP_LOGGER).fine("Exception in DataFormMappingService.map: "
+ "IllegalArgumentException" + e.getMessage());
continue;
}
} //if
} //for
} //map
Заранее спасибо,
Алексей Блю.