具有通用元素的方法列表和通过反射访问字段

时间:2014-01-16 06:51:26

标签: java android reflection

我有一个复合问题。我想写一个接收3个参数的方法:

  • 要比较的字符串
  • 通用元素类型列表
  • 用于将其值与第一个参数
  • 进行比较的字段名称(List元素)

这是我到目前为止所做的,但它不完整,因为我不知道如何定义第二个参数,我不知道如何让List元素类定义单个元素(参见“ ?????“在下面的代码中”

public class Object1 {
    String name;
    ...
}

public class Object2 {
    String address;
    ...
}

public class MyClass {
    ...
    private List<Object1> list1 = new ArrayList<Object1>();
    private List<Object2> list2 = new ArrayList<Object2>();
    ...
    private boolean isUnique(String s, List<?> list, String field) {
        boolean result = true;

        ?????? element = null;
        Field f = null;
        Class<?> c = ?????.class;
        try {
            f = c.getDeclaredField(field);
            f.setAccessible(true);
        } catch( NoSuchFieldException e ) {
            e.printStackTrace();
        }

        int size = list.size();
        for( int i = 0; i < size; i++ ) {
            element = list.get(i);
            try {
                if( s.equals(f.get(element))) {
                    result = false;
                    break;
                }
            } catch( IllegalArgumentException e ) {
                e.printStackTrace();
            } catch( IllegalAccessException e ) {
                e.printStackTrace();
            }
        }

        return result;
    }

    public boolean check(){
        boolean result = isUnique("Stewart", list1, "name");
        result = result & isUnique("21 pine", list2, "address");
        return result;
    }

}

1 个答案:

答案 0 :(得分:1)

    Object element = null;
    Field f = null;
    if(list.size()>0)
    {
      Class<?> c = list.get(0).getClass();
      try {
        f = c.getDeclaredField(field);
        f.setAccessible(true);
    } catch( NoSuchFieldException e ) {
        e.printStackTrace();
    }

    int size = list.size();
    for( int i = 0; i < size; i++ ) {
        element = list.get(i);
        try {
            if( s.equals(f.get(element))) {
                result = false;
                break;
            }
        } catch( IllegalArgumentException e ) {
            e.printStackTrace();
        } catch( IllegalAccessException e ) {
            e.printStackTrace();
        }
    }

    return result;
}else
{
  return true;
}