gpt4 book ai didi

java - 我如何从这个循环中拉出反射?

转载 作者:行者123 更新时间:2023-11-30 06:32:17 25 4
gpt4 key购买 nike

如果可能的话,我如何将反射从这个循环中拉出来并传入 getter 方法。

public <E> void sortBy(final String fieldName, final boolean sortAsc, List<E> list){
Collections.sort(list, new Comparator<E>() {
public int compare(E o1, E o2) {
return compareFields(o1,o2,fieldName.replace("SortBy", "get"),sortAsc);
}
}
);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected <E> int compareFields(E o1, E o2,String fieldName, boolean sortAsc){
try {
Comparable o1Data;
Comparable o2Data;
o1Data = (Comparable) o1.getClass().getMethod(fieldName).invoke(o1);
o2Data = (Comparable) o2.getClass().getMethod(fieldName).invoke(o2);
if(o1Data == null && o2Data == null){
return 0;
} else if (o1Data == null){
return 1;
} else if (o2Data == null){
return -1;
}
int result = o2Data.compareTo(o1Data);
return (sortAsc) ? -result : result ;
}
catch(Exception e) {
throw new RuntimeException(e);
}
}

上下文:我有很多带有数据表的屏幕。每个都是从列表构建的。每个数据表都需要按其 6 列中的每一列进行排序。列是日期或字符串。

最佳答案

如果您可以假设所有元素都是同一类型。

public <E> void sortBy(final String fieldName, final boolean sortAsc, List<E> list) throws NoSuchMethodException {
final Method f = list.get(0).getClass().getMethod(fieldName.replace("SortBy", "get"));
f.setAccessible(true);
final int direction = sortAsc ? +1 : -1;
Collections.sort(list, new Comparator<E>() {
public int compare(E o1, E o2) {
return compareFields(o1, o2, f, direction);
}
}
);
}

@SuppressWarnings({"rawtypes", "unchecked"})
protected <E> int compareFields(E o1, E o2, Method getter, int sortAsc) {
try {
Comparable o1Data = (Comparable) getter.invoke(o1);
Comparable o2Data = (Comparable) getter.invoke(o2);
if (o1Data == null)
return o2Data == null ? 0 : 1;
if (o2Data == null)
return -1;
return sortAsc * o2Data.compareTo(o1Data);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

关于java - 我如何从这个循环中拉出反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8885634/

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