此代码用于对List进行排序.该列表可以包含数千个但不到10k的元素.
protected <E> int compareFields(E o1, E o2, String fieldName){
try {
Comparable o1Data = (Comparable) o1.getClass().getMethod(fieldName).invoke(o1);
Comparable o2Data = (Comparable) o2.getClass().getMethod(fieldName).invoke(o2);
return o1Data == null ? o2Data == null ? 0 : 1 :
o2Data == null ? -1 : o1Data.compareTo(o2Data);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我被告知
"请不要对这样的事情使用反射!!要么使用合适的比较器提供方法,要么提取相关属性的方法(可能以原始类型不支持的方式计算),或两者兼而有之."
一个更好的方法来做这个例子会很好.
上下文:我有很多带数据表的屏幕.每个都是从List构建的.每个数据表需要按其6列中的每一列进行排序.列是Date或String.
这里使用反射会潜在地慢得多,因为你是通过使用加入堆栈帧到每个比较的数目getClass,getMethod和invoke而不是使用对象的原生比较方法.
理想情况下,您可以编写方法以避免object在签名中使用."合适的比较器"至少会强烈绑定到对象的类型(您假设它们是相同的).如果必须进行动态字段比较(如图所示),那么至少可以将反射封装在该比较器中.
但是,如果要打几次这样的话,最好将比较器预先绑定到要排序的字段.这样,您只需预先呼叫getMethod一次,而不是每次比较一次.