gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:05 25 4
gpt4 key购买 nike

我有一个示例 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com