[个人笔记]
问题描述:根据实体类Demo的字段test进行排序
大概分为两步:使用反射获取类中的方法,使用Collections.sort()进行排序
1、使用反射获取类中的方法
//实体类Demo的相关代码就不写了,getter/setter什么的,知道其中有一个方法是getTest()就可以了
public list<Demo> getSort(List<Demo> list, String sidx, String order) throws Exception{
//开始通过传入字符串获取get方法
Demo demo = new Demo();
Class<? extends Demo> demoClass = Demo.getClass();
// 字符串首字母大写
char[] cs = sidx.toCharArray();
cs[0] -= 32;
Method method = demoClass.getMethod("get" + String.valueOf(cs));
/*调用invoke,获取值,demo只是表示放这个类型的参数,不代表具体含义,在下面的排序的时候会用到invoke方法,写在这里方便理解
Object invoke = method.invoke(demo);*/
}
2、进行排序操作,顺序就是o1-o2,倒序就是o2-o1
//实体类Demo的相关代码就不写了,getter/setter什么的,知道其中有一个方法是getTest()就可以了
public void getSort(List<Demo> list, String sidx, String order) throws Exception {
// 排序操作
if (null != sidx) {
Demo demo = new Demo();
Class<? extends Demo> demoClass = demo.getClass();
// 字符串首字母大写
char[] cs = sidx.toCharArray();
cs[0] -= 32;
Method method = demoClass.getMethod("get" + String.valueOf(cs));
Collections.sort(list, new Comparator<Demo>() {
@Override
public int compare(Demo o1, Demo o2) {
int res = 0;
try {
if ("desc".equals(null == order ? "asc" : order)) {
//此处看传入字段在实体类中是什么属性,然后将obj转化为对应类型,此处用bigdecimal示例
res = objToBigDecimal(method.invoke(o2)).compareTo(objToBigDecimal(method.invoke(o1)));
} else {
res = objToBigDecimal(method.invoke(o1)).compareTo(objToBigDecimal(method.invoke(o2)));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return res;
}
});
}
}
/**
* obj转BigDecimal
* @param value
* @return BigDecimal
*/
public BigDecimal objToBigDecimal(Object value) {
BigDecimal ret = null;
if (value != null) {
if (value instanceof BigDecimal) {
ret = (BigDecimal) value;
} else if (value instanceof String) {
ret = new BigDecimal((String) value);
} else if (value instanceof BigInteger) {
ret = new BigDecimal((BigInteger) value);
} else if (value instanceof Number) {
ret = new BigDecimal(((Number) value).doubleValue());
} else {
throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass()
+ " into a BigDecimal.");
}
}
return ret;
}
至此,可以完成根据传入的字段进行排序的要求,好像一般是前端排序,这个好像有点不实用,但是,也写一下,记录一下,看到这篇笔记的筒子们也可以试试前端排序,比这个方便一点