java - 使用反射和注释比较 Java 中的两个对象

标签 java reflection casting annotations

我有一个示例 Student 对象,它有几个字段(索引号、姓名、姓氏等)。我想比较两个 Student 对象,但我想定义字段比较的优先级。为此,我使用字段注释,如下例所示:

注解接口(interface)定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CompareOrder {
    int order();    
}

用法:

@CompareOrder(order = 3)
private int indexNumber;
@CompareOrder(order = 2)
private String name;
@CompareOrder(order = 1)
private String familyName;
private ArrayList <Float> marks;
@CompareOrder(order = 5)
private float average;
@CompareOrder(order = 4)
private boolean fullTime;

某些字段不包含注释,在比较时会被忽略。我做的第一件事是使用反射提取类的所有字段并根据比较顺序对它们进行排序,这对应于我的compareTo重写函数体的第一部分:

@Override
public int compareTo(Student other) {
    // TODO Auto-generated method stub
    Class<? extends Student>  clazz = this.getClass();
    Field[] fields = clazz.getDeclaredFields();
    List <Field> fieldList = new ArrayList<Field> ();
    //ommiting unannotated fields
    for (Field f : fields)
    {
        if(f.getAnnotation(CompareOrder.class) != null) fieldList.add(f);
    }
    //sorting fields by compare order
    Collections.sort(fieldList, new Comparator <Field> (){

        @Override
        public int compare(Field f0, Field f1) {
            CompareOrder compOrder0 = f0.getAnnotation(CompareOrder.class);             
            CompareOrder compOrder1 = f1.getAnnotation(CompareOrder.class);             
            return compOrder0.order() - compOrder1.order();

        }
    });

    for (Field f : fieldList)
    {
        // HERE GOES COMPARISON OF OBJECTS FIELD BY FIELD, ACCORDING TO THE ORDERING
    }

    return 0;
}

现在我有点陷入困境。因为此时,我需要决定这个学生和另一个学生的领域是更大还是更小。我不能用原始对象类型做到这一点,我唯一能做的就是调用 equals 方法,这是不够的。我需要知道它是更大还是更小。我需要以某种方式将其转换到...是的,到底是什么?如何提取字段类型,然后进行转换?这可行吗?

PS。我知道,可能更简单的方法是使用方法注释并调用 getter 方法,但我只是好奇它是否可以按照我尝试的方式实现。

最佳答案

我认为你可以使用Class.isAssignableFrom(Class)和类似的东西

Class<Comparable> cls = Comparable.class;
for (Field f : fieldList) {
    if (cls.isAssignableFrom(f.getType())) {
        Comparable c = (Comparable) f.get(this);
        int r = c.compareTo((Comparable) f.get(other));
        if (r != 0) {
            return r;
        }
    }
}

关于java - 使用反射和注释比较 Java 中的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27679088/

相关文章:

java - 将带有二进制数据的 byte[] 转换为 String

java - 在水平布局中显示 ListView 时出现问题?

java - 通过反射计算方法调用传递的参数

Powershell 自定义对象隐藏属性类型

c++ - 我想存储指向函数的空指针及其类型

java - 访问可以是 ConcurrentHashMap 的对象的 ConcurrentHashMap

java - Stream findfirst Java 8 中递增计数器

java - 如何通过反射实现抽象类

delphi - 如何将整数转换为枚举类型?

java - Hadoop 设置最大并发 mapreduce 任务在伪模式下不起作用