public static <E> void sort(List<E> list, final String method, final String sort) {
Comparator<E> comparator = new Comparator<E>() {
public int compare(E a, E b) {
int ret = 0;
try {
Method m1 = (a).getClass().getMethod(method);
Method m2 = (b).getClass().getMethod(method);
Object valueB = m2.invoke(b);
Object valueA = m1.invoke(a);
Method compareTo = valueB.getClass().getMethod("compareTo", valueA.getClass());
if (sort != null && "desc".equals(sort)) {
// 倒序
ret = (int) compareTo.invoke(valueB, valueA);
} else {
// 正序
ret = (int) compareTo.invoke(valueA, valueB);
}
} catch (NoSuchMethodException ne) {
logger.error("NoSuchMethod", ne);
} catch (IllegalAccessException ie) {
logger.error("IllegalAccess", ie);
} catch (InvocationTargetException it) {
logger.error("InvocationTarget", it);
}
return ret;
}
};
Collections.sort(list, comparator);
}
通用,但三次反射损耗不少
优化之后:
public static <E> void sort(List<E> list, final String method, final String sort) {
Comparator<E> comparator = new Comparator<E>() {
public int compare(E a, E b) {
int ret = 0;
try {
Method m1 = (a).getClass().getMethod(method);
Method m2 = (b).getClass().getMethod(method);
Object valueB = (Object)m2.invoke(b);
Object valueA = (Object)m1.invoke(a);
if (sort != null && "desc".equals(sort)) {
// 倒序
ret = (int) ((Comparable<Object>) valueB).compareTo(valueA);
} else {
// 正序
ret = (int) ((Comparable<Object>) valueA).compareTo(valueB);
}
} catch (NoSuchMethodException ne) {
logger.error("NoSuchMethod", ne);
} catch (IllegalAccessException ie) {
logger.error("IllegalAccess", ie);
} catch (InvocationTargetException it) {
logger.error("InvocationTarget", it);
}
return ret;
}
};
Collections.sort(list, comparator);
}