使用自定义注解将一个实体属性有序分成两组
自定义注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnotationTest { public enum Obj{A, B}; public Obj obj(); public int index() default Integer.MAX_VALUE; }
实体的使用注解
public class Person { private String username;//姓名 private int sex;//性别 private int age;//年龄 private String cardNo;//证件号 private String job; private Double salary; private String Address; @AnnotationTest(obj = Obj.A, index = 1) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @AnnotationTest(obj = Obj.A, index = 2) public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @AnnotationTest(obj = Obj.A, index = 3) public int getAge() { return age; } public void setAge(int age) { this.age = age; } @AnnotationTest(obj = Obj.A, index = 4) public String getCardNo() { return cardNo; } public void setCardNo(String cardNo) { this.cardNo = cardNo; } @AnnotationTest(obj = Obj.B, index = 1) public String getJob() { return job; } public void setJob(String job) { this.job = job; } @AnnotationTest(obj = Obj.B, index = 2) public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } @AnnotationTest(obj = Obj.B, index = 3) public String getAddress() { return Address; } public void setAddress(String address) { Address = address; } }
比较器排序
public class MethodComparator implements Comparator<Method> { @Override public int compare(Method o1, Method o2) { AnnotationTest at1 = o1.getAnnotation(AnnotationTest.class); AnnotationTest at2 = o1.getAnnotation(AnnotationTest.class); if(at1.index() < at2.index()) { return 1; } else if(at1.index() > at2.index()) { return -1; } else { return 0; } } }
测试
public class Test { public static void main(String[] args) { testAnnotation(); } public static void testAnnotation() { Person p = new Person(); p.setUsername("share"); p.setAge(25); p.setSex(1); p.setCardNo("123456"); p.setJob("intenet"); p.setSalary(12345.0); p.setAddress("shanghai"); List<Method> methodA = getMethod(p, Obj.A); List<Method> methodB = getMethod(p, Obj.B); for (Method method : methodA) { if(method.getName().startsWith("get")) { try { System.out.println(method.invoke(p)); } catch (Exception e) { e.printStackTrace(); } } } System.out.println("==========================="); for (Method method : methodB) { if(method.getName().startsWith("get")) { try { System.out.println(method.invoke(p)); } catch (Exception e) { e.printStackTrace(); } } } } /** * 对象分类存储 * 2015年10月25日 caifan * @param p * @param obj * @return */ public static List<Method> getMethod(Person p, Obj obj) { Method[] methods = p.getClass().getDeclaredMethods(); List<Method> methodList = new ArrayList<Method>(); for (Method method : methods) { AnnotationTest at = method.getAnnotation(AnnotationTest.class); if(method.isAnnotationPresent(AnnotationTest.class) && method.getName().startsWith("get")){ if(at.obj() == obj){ methodList.add(method); } } } MethodComparator mc = new MethodComparator(); Collections.sort(methodList, mc); return methodList; } }
输出结果:(结果根据注解中的Obj 和 index 分成了两类)
share
1
25
123456
===========================
shanghai
intenet
12345.0