我被告知不要在这里使用反射...为什么不呢?

Dal*_*ale 5 java reflection

此代码用于对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.

har*_*rpo 5

这里使用反射会潜在地慢得多,因为你是通过使用加入堆栈帧到每个比较的数目getClass,getMethodinvoke而不是使用对象的原生比较方法.

理想情况下,您可以编写方法以避免object在签名中使用."合适的比较器"至少会强烈绑定到对象的类型(您假设它们是相同的).如果必须进行动态字段比较(如图所示),那么至少可以将反射封装在该比较器中.

但是,如果要打几次这样的话,最好将比较器预先绑定到要排序的字段.这样,您只需预先呼叫getMethod一次,而不是每次比较一次.