使用自定义注解将一个实体属性有序分成两组
自定义注解
@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