通过注释对方法的数组列表(Reflection Java)进行排序

时间:2018-07-16 15:31:46

标签: java spring hibernate reflection

我正在尝试对方法反射的arrayList进行排序,但是我不知道如何声明比较函数。

我在每个方法上都添加了一个注释,但是当我调用Collections.sort()时,它告诉我

Error:(222, 16) java: no suitable method found for sort(java.util.List<java.lang.reflect.Method>)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
      (inferred type does not conform to upper bound(s)
        inferred: java.lang.reflect.Method
        upper bound(s): java.lang.Comparable<? super java.lang.reflect.Method>)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))

这是我的代码:

RecommendationForm.java

public class test {

  @SortedMethod(3)
  public String[] getIssueRef() {
    return issueRef;
  }

  @SortedMethod(2)
  public String[] getAudRef() {
    return audRef;
  }

  @SortedMethod(1)
  public String[] getCradat() {
    return cradat;
  }


  @SortedMethod(4)
  public String[] getPriority() {
    return priority;
  }

  @SortedMethod(5)
  public String[] getStatus() {
    return status;
  }

}

SortedMethod.java:

public @interface SortedMethod{

  int value();



}

还有我的功能:

Method methods[] = ReflectionUtils.getAllDeclaredMethods(RecommendationForm.class);

    List<Method> getters = new ArrayList<Method>();

    for (int i = 0; i < methods.length; i++) {
      if ((methods[i].getName().startsWith("get")) && !(methods[i].getName().equals("getClass"))) {
        getters.add(methods[i]);
        //System.out.println(methods[i].toString());
      }
    }
    Collections.sort(getters);

谢谢!

我通过添加比较器方法解决了我的问题:

Collections.sort(getters, new Comparator<Method>() {
      @Override
      public int compare(Method o1, Method o2) {
        if(o1.getAnnotation(SortedMethod.class).value() > o2.getAnnotation(SortedMethod.class).value()){
          return 1;
        }
        else{
          return -1;
        }
      }
    });

2 个答案:

答案 0 :(得分:2)

您必须在Collections.sort中放置一个比较器,以便sort方法知道您的方法必须对哪些条件进行排序。将您的反射代码放入此比较器中。

Collections.sort(getters, new Comparator<Method>() {
        @Override
        public int compare(Method o1, Method o2) {
            // your code
        }
    });

答案 1 :(得分:1)

您需要在注释中添加RUNTIME保留策略,否则在编译后将其删除:

@Retention(RetentionPolicy.RUNTIME)
@interface SortedMethod {
    int value();
}

然后,您可以通过比较注释的value字段进行排序,例如:

List<Method> sorted = Arrays.stream(Test.class.getDeclaredMethods())
    .filter(m -> m.getAnnotation(SortedMethod.class) != null) // only use annotated methods
    .sorted(Comparator.comparingInt(m -> m.getAnnotation(SortedMethod.class).value())) // sort by value
    .collect(Collectors.toList());

System.out.println(sorted);