java
package com.daojia.beauty.open.utils; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.util.Comparator; /**
* 数据比较<br />
*/
public class CompareUtil { private static final Logger LOGGER = LoggerFactory.getLogger(CompareUtil.class); /**
*
*/
private CompareUtil() { }
/**
* 数据比较
* @param compare1
* @param compare2
* @param <T>
* @return 0-->相等 , >0 小于 , <0 大于 , null --> 异常情况
*/
public static <T> Integer compare(T compare1 , T compare2 ) {
if(compare1.getClass() != compare2.getClass()) {
throw new IllegalArgumentException("参与比较的两个对象必须属于一个类");
} Method method = isComparable(compare1.getClass()) ; Integer results = null ; if(method == null) {
throw new UnsupportedOperationException("当前类没有实现Comparable或Comparator接口");
}
try {
results = (Integer)method.invoke(compare1, compare2);
return results;
}catch (Exception e) {
LOGGER.error("反射比较对象大小出现异常",e);
}
return results;
} /**
* 判断是否可比较
* @return
*/
private static Method isComparable(Class cls) { Class[] interfaces = cls.getInterfaces();
Method method = null;
try {
for (Class cs : interfaces) {
if (cs == Comparable.class) {
method = cls.getMethod("compareTo", cls);
}
if (cs == Comparator.class) {
method = cls.getMethod("compare",cls);
}
}
} catch (Exception exception) {
LOGGER.error("反射获取比较对象的compareTo和compare方法出错",exception);
}
return method;
}
}

CompareUtil的更多相关文章

  1. 多字段 java对象排序

    public class ReflexUtil { static Logger logger = LoggerFactory.getLogger(ReflexUtil.class); //getMet ...

  2. 深入理解C#泛型

    前面两篇文章介绍了C#泛型的基本知识和特性,下面我们看看泛型是怎么工作的,了解一下泛型内部机制. 泛型内部机制 泛型拥有类型参数,通过类型参数可以提供"参数化"的类型,事实上,泛型 ...

  3. Java 多字段排序Comparator(兼容Date,Integer,Doubel,Long)

    Java 反射类:ReflexUtil public class ReflexUtil { static Logger logger = LoggerFactory.getLogger(ReflexU ...

  4. java编程排序之内置引用类型的排序规则实现,和自定义规则实现+冒泡排序运用

    第一种排序:[冒泡排序]基本数据类型的排序. [1]最简易的冒泡排序.效率低.因为比较的次数和趟数最多. /** * 最原始的冒泡排序. * 效率低. * 因为趟数和次数最多.都是按最大化的循环次数进 ...

  5. java怎么比较两个实体类的属性值

    分享一下比较两个实体类的工具包 package cn.mollie.utils; import java.beans.Introspector; import java.beans.PropertyD ...

  6. 开源流程引擎Camunda BPM如何扩展数据库表

    前言 在使用开源流程引擎(如:JBPM.Activiti.Flowable.Camunda等)的时候,经常会遇到这样的需求,我们需要按照业务需求增加一张数据库的表,而且这张表是跟工作流引擎有交互的(注 ...

随机推荐

  1. mysql初始(6)

    随着mysql的运用不断加深,一些更复杂点的用法又需要总结起来. 1.将一个表中的数据插入到另一个表中: a.两张表字段相同,并且数据全部插入,命令如下:  INSERT INTO 目标表 SELEC ...

  2. 将Excel表中的数据导入MySQL数据库

    原文地址: http://fanjiajia.cn/2018/09/26/%E5%B0%86Excel%E8%A1%A8%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5% ...

  3. php在类里如何调用call_user_func_array《细说php2》

  4. 关于逻辑运算符&&和||及!

    && 表示and ,|| 表示or,!表示not. And(&&):对两个Boolean表达式执行逻辑和. AndAlso(&):与AndAlso类似,关键差异 ...

  5. timeSetEvent()函数

    原文链接地址:http://www.cnblogs.com/kangwang1988/archive/2010/09/16/1827872.html 微软公司在其多媒体Windows中提供了精确定时器 ...

  6. chrome 不支持12px以下字体为题的解决

    现英文9px 设置 在chrome 下无效,可以通过 -webkit-transform: scale(0.75); 12*0.75 =9  得到小字体(在chrome浏览器下 大小缩放到0.75倍) ...

  7. Android开发注意点小记

    暂时主要讨论以下几点: Android引用外部包,报NoClassDefFoundError异常崩溃 同名包引用关系问题 程序图标 9patch图片素材 Android引用外部包,程序报java.la ...

  8. HTML5 Canvas圣诞树

    又逢圣诞了,为了让小站NowaMagic有点节日气氛,这里也弄一棵圣诞树放放-大家可以先看下效果. 效果演示 <canvas id="c"></canvas> ...

  9. css的padding,border,margin的意思

    下面的内边距(padding).边框(border) .外边距(margin)的意思是我自己的理解. 代码如下: <!DOCTYPE html> <html lang="e ...

  10. vue2学习篇一 $mount()手动挂载

    $mount()手动挂载 //当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: //假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ // ...