- 浏览: 307532 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
every:
真JB坑爹,标题redhat6 结果用的时5.3 ,尼玛标 ...
RedHat Linux 6企业版开启VNC Server远程桌面 -
okooo00:
五年光景蹉跎,最终还是烂尾了,从此人生又少了一样追求
《凡人修仙传》点评 -
mikey_5:
原来是这样子判断数据格式的,Thanks
POI读取Excel浅谈 -
jveqi:
tracy_meimei 写道楼主,我试过N多次了,在我的my ...
MyEclipse6.5 下Axis2插件的下载和安装 -
jsx112:
...
MySQL select into和SQL select into
近来由于项目的需要,准备实现对象集合的排序问题,了解一下互联网上的排序方式,都是先声明一个类实现Comparator接口,在compare方法中对某一个具体的属性进行处理,然后通过Collections的排序方法进行集合排序。
这样做的确能实现对象集合按对象某个已知的属性进行排序,譬如我实现姓名的排序(假定此对象拥有name属性),那么我可以这么写:
//实现一个内部类实现Comparator,并重写其compare方法 static class NameComparator implements Comparator<Object> { /** * 根据name的ASCII比较对象 */ public int compare(Object o1, Object o2) { return (o1.getName()).compareTo(o2.getName()); } } /** * 对指定的集合按照name属性进行排序 * @param list * @return */ public static List<Object> TransmitSort(List<Object> list) { NameComparator wt = new NameComparator(); Collections.sort(list, wt); return list; }
这样的确可以实现集合按name属性进行排序,那么如果系统希望按age年龄这个属性进行排序呢,我们是不是还要写个AgeComparator来实现Comparator并重写其compare方法呢,答案是肯定的。
那将来系统需求发生变更,需要对其它属性进行类似的功能呢,我不得不为这排序的策略感到头疼,这无止境的实现并重写可不是一个明智的选择。不过在了解了Java反射的机制后,我突然有一种想法,能不能通过反射的手段在compare方法中做文章呢,这样,一旦我在实现Comparator的类中传递了某个属性,我就可以及时的获取相应的method并进行操作,这样可以吗?答案是肯定的,下面是我的代码实现:
package com.ysb.services.util; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.Comparator; import java.util.List; import com.ysb.services.entity.Resume; /** * SortUtil.java verson 1.0 Aug 5, 2011 * * @author 贾世雄 * */ public class SortUtil { // 按任意属性进行排序 static class AnyProperComparator implements Comparator<Object> { private String properName;// 根据此关键字属性排序 private boolean flag;// 为true的时候是正序,为false的时候是倒序 public AnyProperComparator(String properName, boolean flag) { super(); this.properName = properName; this.flag = flag; } public void setProperName(String properName) { this.properName = properName; } public String getProperName() { return properName; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } /** * 实现Comparator的对比方法 * * @param r1 * @param r2 */ @SuppressWarnings("unchecked") public int compare(Object r1, Object r2) { Class c = r1.getClass(); double result = 0; try { Field field = c.getDeclaredField(properName); String classType = field.getType().getSimpleName(); Method method = null; // 这里仅根据方法的返回值类型的名称来判定,比较方便 if ("String".equals(classType)) { method = c.getMethod("get" + properName.substring(0, 1).toUpperCase() + properName.substring(1), new Class[] {}); if (flag) { result = ((String) method.invoke(r1)).compareTo((String) method.invoke(r2)); } else { result = ((String) method.invoke(r2)).compareTo((String) method.invoke(r1)); } } else if ("Integer".equals(classType) || "int".equals(classType)) { method = c.getMethod("get" + properName.substring(0, 1).toUpperCase() + properName.substring(1), new Class[] {}); if (flag) { result = ((Integer) method.invoke(r1)) - ((Integer) method.invoke(r2)); } else { result = ((Integer) method.invoke(r2)) - ((Integer) method.invoke(r1)); } } else if ("Double".equals(classType) || "double".equals(classType)) { method = c.getMethod("get" + properName.substring(0, 1).toUpperCase() + properName.substring(1), new Class[] {}); if (flag) { result = ((Double) method.invoke(r1)) - ((Double) method.invoke(r2)); } else { result = ((Double) method.invoke(r2)) - ((Double) method.invoke(r1)); } } else if ("Float".equals(classType) || "float".equals(classType)) { method = c.getMethod("get" + properName.substring(0, 1).toUpperCase() + properName.substring(1), new Class[] {}); if (flag) { result = ((Float) method.invoke(r1)) - ((Float) method.invoke(r2)); } else { result = ((Float) method.invoke(r2)) - ((Float) method.invoke(r1)); } } else { System.out.println("属性排序只支持数据类型和String类型,其它类型暂不支持。"); result = -100; } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } // 确定返回值 if (result > 0) { return 1; } else if (result < 0) { return -1; } return 0; } } /** * 按任意给定的字段进行排序,升序或降序由flag决定 * * @param list * @param properName * @param flag * @return */ @SuppressWarnings("unchecked") public static List<Resume> anyProperSort(List<Resume> list, String properName, boolean flag) { AnyProperComparator comparator = new AnyProperComparator(properName, flag); Collections.sort(list, comparator); return list; } }
这样一来,我想对某个集合排序,只需要调用SortUtil的方法anyProperSort即可,这样就可以大大的提高系统的扩展性,将来不用再为用户需求的变更而头疼了。
不过需要注意的是反射一般比直接写性能要降低大约一倍,所以请读者慎重。
发表评论
-
Mina开发笔记
2014-12-08 20:08 0import java.nio.charset.Ch ... -
Excel中日期与数字的转换代码
2014-05-30 23:24 2728public static void main(St ... -
求一个月有几周
2013-02-22 18:19 1139int year = 2013; int month= ... -
The error is weblogic.descriptor.DescriptorException: Unmarshaller failed
2012-09-13 11:58 2278部署 web project 到weblogic92(换成10 ... -
ecllipse无法启动,一直停留刚开始启动界面
2012-07-18 11:47 23671、 故障发生原因 :由于电脑配置较差 ,经常死机 或者 ... -
启动JBOSS,提示错误1098端口被占用的解决方案
2012-06-25 10:25 1755问题:启动JBOSS,提示错误1098端口被占用 方案一: ... -
Version 1.3.1_01 of the JVM is not suitable for this product.Version:1.4.1 or gr
2012-05-30 17:06 1107Version 1.3.1_01 of the JVM is ... -
java.lang.AbstractMethodError: com.microsoft.jdbc.base.BaseDatabaseMetaData.supp
2012-04-10 21:51 1936java.lang.AbstractMethodError: ... -
org.apache.axis2.databinding.utils.BeanUtil.getPullParser错误
2012-03-28 12:56 1870在开发ssh+axis2的webservice应用中,报这个错 ... -
增加eclipse启动的Tomcat内存的
2011-09-30 10:04 8872JAVA程序启动时JVM都会分配一个初始内存和最大内存给这 ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-09-26 10:02 12101、 PermGen space的全称 ... -
POI读取Excel浅谈
2011-09-24 15:30 2899先看代码,挨句解释: 一般遍历使用两种方式,1:得到总的行数 ... -
POI读取EXCEL教程
2011-09-24 14:22 1795一、Excel基础 二、HSSF概况 三、通过user ... -
有关java中的Date,String,Timestamp之间的转化问题
2011-09-22 17:10 1386一.获取系统当前时间: 1.System.out.print ... -
Hibernate温习(4)--三大类查询总结
2011-09-14 12:49 1307[url]Hibernate目前总共分为三大类查询:creti ... -
hibernate 关系映射 annotation 版
2011-09-06 16:29 1486关于mappedBy 双向关联 ... -
hibernate+spring 注解 对事务的一些信息
2011-09-06 16:27 1587事务注解说明@Transactional 类事务说明机制 ... -
JPA一对多,多对多映射
2011-09-03 23:46 3995JPA(Java Persistence API)是Sun ... -
Rational Rose 生成java代码
2011-08-25 10:26 1927一,正向工程 1、设置默认语言为Java,Tools- ... -
SOA服务设计原则-转载
2011-08-24 10:27 1055这一部分是有关整个 SOA 系统的指南,代表了在建立系统时需要 ...
相关推荐
主要介绍了利用Java反射机制实现对象相同字段的复制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java 对象集合按字段排序
java集合某个字段按照中文拼音排序 java集合某个字段按照中文拼音排序
利用java反射技术实现动态搜索所有字段
反射给指定字段赋值
对于任意一个对象,都能够调用它的任意一个方法,常见的应用如下 逆向代码 ,例如反编译 与注解相结合的框架 例如Retrofit 单纯的反射机制应用框架 例如EventBus 2.x 动态生成类框架 例如Gson Java高级程序设计实战...
Java的反射机制是指在运行时通过分析类的信息实现动态调用类的方法和访问类的属性的能力。它允许程序在运行时获取类的信息并操作类或对象的属性、方法和构造函数等。通过反射机制,可以实现很多高级特性,如动态代理...
主要介绍了java反射机制给实体类相同字段自动赋值实例,具有
Java排序算法实现 Java排序算法实现 Java排序算法实现
OrderByInterceptor,配合PageHelper实现字段排序插件,前端传入要排序的字段和排序规则,插件自动将实体字段映射成数据库字段,不用设置表明前缀。插件通过ResultMap或ResultType读取映射关系,若没有设置,则根据...
一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。
在Java中运用反射+泛型,实现数据库的动态增删改查等功能,可以是Mysql, 也可以是SQL Server,oracle 也行。本代码是支持SQL Server和oracle的。
反射就是把java的各种成分(字段,方法)映射成响应的java类
该篇文章主要介绍当我们碰到参数或者返回值是一个对象时,如何通过frida反射调用该对象的方法(methods)与获取该对象的字段(fields)。感兴趣的朋友可以下载下来看看,了解了解
对ArrayList里装载的对象进行自定义排序(任意对象、任何字段、任何规则) !...ArrayList中可装载任何对象,并以指定的该对象的字段对该集合中的对象进行指定形式的排序(正序、反序)。 任何类通用........
在web开发中,经常遇到...而使用hibernate,它的修改是基于对象的,如果用户修改的字段非常多,但是我们并不知道用户到底修改了那个字段,这时候就需要一个一个的去判断,因此非常耗时,所以我写了个工具类来帮助大家!
JS实现:数组中的json对象,按某个字段来进行字母排序
主要介绍了Android List(集合)中的对象以某一个字段排序案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用...运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的例子演示了反射的一些实现。
List,List, Object>>,多字段组合排序。提供一个简易的思路,如果需要进行参考。