开头一注:本代码是在学习comparator时,想到是否能写一个排序的工具类,在思考过后决定结合注解来实现排序,目前代码还比较粗犷,请大神指教,请大家轻喷。

一、新增自定义注解

@Documented
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MySort {int value() default 0;
}

注解小释:

@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。

@Retention注解,翻译为持久力、保持力。即用来修饰自定义注解的生命力。

RetentionPolicy.RUNTIME,表示这个注解可以在运行期的加载阶段被加载到Class对象中。所以在程序运行阶段,可以通过反射得到这个注解,并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段。

@Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。

ElementType.FIELD 表示本注解可以作用在属性上。

ElementType.METHOD  表示可以注解到方法上。期待的是可以兼容方法排序,目前本文章还未实现。

value 表示的是排序优先级,目前还存在待优化的地方,现在只能从零开始,一直+1,中间不能中断不能重复。

二、实现排序工具类

public class MyComparatorUntil {public static List<?> sort(List<?> list) {// 校验if (list == null || list.size() == 0) {return list;}// 通过反射获取类Object t = list.get(0);Class<?> cls = t.getClass();// 获取所有字段Field[] fields = cls.getDeclaredFields();List<String> fieldNames = new ArrayList<>();for (Field field : fields) {if (field.isAnnotationPresent(MySort.class)) {MySort sort = field.getAnnotation(MySort.class);// 此处需要优化顺序问题 TODOfieldNames.add(sort.value(), field.getName());}}if (fieldNames.size() == 0) {return list;}list.sort((o1, o2) -> {Class<?> o1cls = o1.getClass();Class<?> o2cls = o2.getClass();for (String name : fieldNames) {try {// 获取属性值Field o1clsDeclaredField = o1cls.getDeclaredField(name);Field o2clsDeclaredField = o2cls.getDeclaredField(name);o1clsDeclaredField.setAccessible(true);Object value1 = o1clsDeclaredField.get(o1);o2clsDeclaredField.setAccessible(true);Object value2 = o2clsDeclaredField.get(o2);if (value1.equals(value2)) {continue;}// 需要优化比较方法 TODOif (value1 instanceof Integer) {return ((Integer) value1).compareTo((Integer) value2);} else if(value1 instanceof String) {return ((String) value1).compareTo((String) value2);}} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}return 0;});return list;}
}

有两处TODO的地方,第一个就是上面说的,排序优先级的问题需要优化。

第二个是目前没有好的方法直接比较两个Object的值大小,所以只能根据类型判断比较,此处简化,只写了Integer和String的类型。

三、测试

新建实体类Student

public class Student {Student(int age, int sex, String name) {this.age = age;this.sex = sex;this.name = name;}@MySort()private int age;@MySort(1)private int sex;@MySort(2)private String name;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", sex=" + sex +", name='" + name + '\'' +'}';}
}

在想要参与排序的属性上添加注解。

写main方法测试

    public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(4, 1, "zhangshan"));list.add(new Student(2, 1, "lisi"));list.add(new Student(1, 1, "wangwu"));list.add(new Student(1, 0, "chuchu"));list.add(new Student(1, 1, "kiki"));MyComparatorUntil.sort(list);System.out.println(list);}

输出结果

[
Student{age=1, sex=0, name='chuchu'},
Student{age=1, sex=1, name='kiki'},
Student{age=1, sex=1, name='wangwu'},
Student{age=2, sex=1, name='lisi'},
Student{age=4, sex=1, name='zhangshan'}
]

结合自定义注解,java反射和comparator实现对象的排序相关推荐

  1. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  2. 注解 java 反射_java注解和反射

    2020-05-19 注解的作用: 不是程序本身,可以对程序做出解释,和注释有相似之处. 可以被其他程序(如编译器)所读取. 注解的格式:以"@注解名"在代码上存在,还可以在其中添 ...

  3. 通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明

    原标题:java反射注解妙用-获取所有接口说明 转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html 前言 最近在做项目权限,使用shir ...

  4. Java反射基础(一)--Class对象获取

    Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...

  5. Java核心技术之Comparator和Comparable在排序中的应用

    自定义的类User: package com.example.testcomparator;public class User{private String name;private int age; ...

  6. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  7. java反射创建带参数对象_反射 Java反射对象创建 - 闪电教程JSRUN

    Java反射 -Java反射对象创建 我们可以使用反射动态创建类的对象.通过调用其中一个构造函数. 然后我们可以访问对象的细分的值,设置它们的值,并调用它们的方法. 有两种方法来创建对象: 使用no- ...

  8. Java通用工具类之按对象属性排序工具类

    本工具类为按对象属性排序工具类,实现的功能: 1.按对象的一个属性和多个属性进行排序. 2.按对象属性正序和倒序排列. 3.完美支持int等基础类和Integer等包装类. 4.完美支持属性为实现了C ...

  9. java 对多个元素对象的排序_java list按照元素对象的指定多个字段属性进行排序...

    ListUtils.java---功能类 package com.enable.common.utils; import java.lang.reflect.Field; import java.te ...

最新文章

  1. 【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
  2. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 第八期直播《立体视觉之立体匹配理论与实战》精彩回录
  4. android_launcher的源码详细分析和壁纸修改 .
  5. sharepoint简单说明
  6. php 数组元素分类,数组分类、定义及遍历
  7. matlab常用函数——文件操作函数
  8. Spoken English(001)
  9. 人大金仓数据库sql语句_数据库SQL语句大全——最常用的SQL语句
  10. c语言有趣源代码,分享一段有趣的小代码
  11. 2017计算机考研统考,2017年计算机考研408统考真题及答案.pdf
  12. POJ 2242 The Circumference of the Circle G++ 海伦公式 三角形外接圆半径公式 背
  13. 分享一个空手反套白狼的骚操作
  14. 贪心算法解决雷达站建站问题
  15. mysql rebuild index_MSSQL Rebuild(重建)索引
  16. PO、VO、DO、TO、DTO、 BO、 QO、DAO、POJO
  17. Spring学习详细代码+图片解释笔记
  18. 关于nextInt()、next()和nextLine()的用法
  19. letter-shell | 一个功能强大的嵌入式shell
  20. 搜索 SAP成都研究院廖婧:SAP C4C社交媒体集成概述

热门文章

  1. Android 最完美的取色盘ColorPickView
  2. 软件测试需要学什么?软件测试难学吗?简单几句让你认识
  3. WiFi的STA和AP模式及相关概念
  4. 读 《成为技术领导者》 有感
  5. 2021年起重机司机(限桥式起重机)考试题及起重机司机(限桥式起重机)考试试卷
  6. Golang的基本语法学习笔记
  7. 【Unity3D】坦克对战游戏 AI 设计
  8. 老韩思考:为什么毕业后3年,同学之间相差如此大?
  9. 高效管理顾客体验,提升顾客转化的王牌选择
  10. 关于ABB软件的使用和干涉区设定