下面是我的bean结构。 Employee.java是父bean。我想迭代所有属性,直到Zip.java并操纵值。
我尝试使用反射迭代它,但getDeclaredFields()将仅提供顶级对象的字段。如何迭代更深层的对象。
有人可以让我知道如何在java中执行此操作。
Employee.java
private String id;
private String name;
private int age;
private Address addr;
private Contact cont;
Address.java
private String addr1;
private String addr2;
private String city;
private Zip zip;
Contact.java
private String phone;
private String email;
Zip.java
private String zipCd;
private String zipExt;
答案 0 :(得分:1)
for (Field field : yourObject.getClass().getDeclaredFields()) {
//do stuff
}
答案 1 :(得分:1)
我强烈建议使用现有的库并避免在这种情况下反射!使用JPA或Hibernate进行数据库使用,使用JAXB或类似的JSON / XML /其他序列化等。
但是,如果您想查看示例代码的样子,可以查看一下:
package myOwnPackage;
import java.lang.reflect.Field;
class Address {
private String addr1;
private String addr2;
private String city;
private Zip zip;
}
class Contact {
private String phone;
private String email;
}
class Employee {
private String id;
private String name;
private int age;
private Address addr;
private Contact cont;
public void setAddr(Address addr) {
this.addr = addr;
}
}
class Zip {
private String zipCd;
private String zipExt;
}
public class Main {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
Employee employee = new Employee();
employee.setAddr(new Address());
printFields("", employee);
}
private static void printFields(String prefix, Object container) throws IllegalAccessException {
Class<? extends Object> class1 = null;
Package package1 = null;
if (container != null)
class1 = container.getClass();
if (class1 != null)
package1 = class1.getPackage();
if (package1 == null || !"myOwnPackage".equals(package1.getName())) {
System.out.println(container);
return;
}
for (Field field : class1.getDeclaredFields()) {
System.out.print(prefix+field.getName()+": ");
// make private fields accessible
field.setAccessible(true);
Object value = field.get(container);
printFields(prefix+" ", value);
}
}
}
我的代码的缺点:
答案 2 :(得分:0)
您可以像这样使用java反射 -
for (Field f : Employee.class.getClass().getDeclaredFields()) {
}
答案 3 :(得分:0)
您可以尝试以下
首先让你的POJO在内部类中,并为每个POJO类型设置一个arraylist
Public class ModelPojo{
private ArrayList<Employee > employeeList;
private ArrayList<Address> employeeList;
private ArrayList<Zip> employeeList;
private ArrayList<Contact> employeeList;
class Employee {}
class Address{}
class Contact{}
class Zip{}
}
他们可以改变你的价值观
public class Logic {
someMethod{
ModelPojo.Employee employee ;
ArrayList<Employee > empList = new ArrayList<Employee >();
for(int i=0;i<empList .size();i++){
employee = new ModelPojo(). new Employee ();
employee .set***("");
employee .set***("");
empList .add(product);
}
}
}
希望这个帮助
答案 4 :(得分:0)
我这样做了,但我知道并且我强烈认为这被认为是错误的编程。 我这样做是因为有人强迫我这样做! (我认为,最好的解决方案是编写更多代码......这是最快的。)
public String getNestedDeclaredField(Object obj, String fieldName) {
if (null == fieldName) {
return null;
}
String[] fieldNames = fieldName.split("\\.");
Field field = null;
Class<? extends Object> requestClass = obj.getClass();
for (String s : fieldNames) {
try
{
field = getSuperClassField(requestClass,
requestClass.getSimpleName(), s);
field.setAccessible(true);
obj = field.get(obj);
if (null == obj) {
return null;
}
requestClass = obj.getClass();
}
catch (Exception e) {
log.error("Error while retrieving field {} from {}", s,
requestClass.toString(), e);
return "";
}
}
return obj.toString();
}
public Field getSuperClassField(Class<? extends Object> clazz,
String clazzName, String fieldName) throws NoSuchFieldException {
Field field = null;
try{
field = clazz.getDeclaredField(fieldName);
}
catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
if (StringUtils.equals(clazz.getSimpleName(), "Object")) {
log.error("Field {} doesn't seem to appear in class {}",
fieldName, clazzName);
throw new NoSuchFieldException();
}
field = getSuperClassField(clazz, clazzName, fieldName);
}
catch (Exception e) {
log.error("Error while retrieving field {} from {}", fieldName,
clazz.toString(), e);
}
return field;
}
其中fieldName是(对于zipCd):addr.zip.zipCd
它将从Employee对象中检索zipCd的String值。