2015-11-18 38 views
1

我读所有字段的值从一个对象,他的孩子们:如何从使用反射实现接口的类的字段获取值?

private List<Object> getAllFieldsValues(Class<?> clazz, String[] filter) throws IllegalArgumentException, IllegalAccessException { 
    List<Object> fieldsValues = new ArrayList<>(); 
    Field[] fields = clazz.getDeclaredFields(); 

    for (Field field : fields) { 

     // some code 

     if (field.getType().isInterface()) { 
      // get all fields from a class which implements the interface 
     } 
    } 
    return fieldsValues; 
} 

我需要从它实现了接口类得到的所有值。怎么样?

编辑: 我的目标是让所有字段的值生成一些散列:

public class HashGen<T extends Layout> {  
    public String hash(T layout, String[] filter) throws IllegalArgumentException, IllegalAccessException { 
     Class<?> current = layout.getClass(); 

     List<Object> fieldValues = new ArrayList<>(); 
     while (!current.getName().equals("Object")) { 
      fieldValues.addAll(getAllFieldsValues(current, filter)); 
      current = current.getSuperclass(); 
     } 

     return generateHashFromValues(fieldValues); 
    } 
} 

为例我的阶级结构:

public interface SomeInterface { } 

public class SomeClass implements SomeInterface { 
    private int someField; 

    // get/set 
} 


public interface Layout { } 

public interface X540 extends Layout { } 

public class X540Impl implements X540 { 
    private int id; 
    private SomeInterface; 

    // get/set 
} 


public static void main(String[] args) { 
    X540 x540 = new X540Impl(); 
    x540.setId(1); 

    SomeInterface someInterface = new SomeClass(); 
    someInterface.setSomeField(5454); 

    x540.setSomeInterface(someInterface); 

    // i need to generate an hash of all fields values of X540Impl and SomeClass because X540Impl has a SomeClass 
    String hash = new HashGen().hash(x540, new String[] {}); 

} 
+0

哪个对象?你为什么传递一个'Class'而不使用该对象的类? –

+0

那么*您希望从哪个实现中获得字段?可能有任何数量的他们。你想在这里做什么? –

+0

我需要从字段中获取所有值以生成一些散列值。在编译时,我现在不会使用clazz的类型 – Andrey

回答

0

您应该检查是否SomeInterface是从类型分配每个领域。例如:

if (SomeInterface.class.isAssignableFrom(field.getType())) { ... } 
0

要用反射读取类的值,可以使用Apache中的BeanUtils库来节省一些代码编写。

下面的例子做两件事情,可以帮助

  1. 它决定如果传递的对象实现了接口

  2. 如何使用反射来得到该对象的值。

    // obj = the object not the object.class 
    if (obj instanceof SomeInterface) { 
        for (Field field : obj.getClass().getDeclaredFields()) { 
         Object value = BeanUtils.getProperty(obj, field.getName()); 
         System.out.println(field.getName() + "=" + value); 
        } 
    } 
    
相关问题