在反思中如何影响方法的顺序



我想创建一个动态布局的Swingtable,关于被设置为源的类数据。
更具体地说:
我有一个具有多个属性的类。当创建表时,我想这样做,这样表看起来:"哪个公共getFunction与返回类型字符串是可用的",并使用这个函数背后的属性作为columnname,后来也作为行源。

目前正在工作。

我的问题是:
如何使用这种方法确保列的特定顺序?例如,我有一个列"ID","呼号","类别"。
我想按这个顺序显示它们。
无论我如何排列源代码中的方法,列总是以相同的顺序("ID","category","callsign")。

        java.lang.reflect.Method methodes[] = null;
        methodes = classObjectOfT.getMethods();
        List<String> tempList=new ArrayList<String>();
        for (java.lang.reflect.Method m: methodes)
        {
            if (m.getReturnType().equals(String.class)&&m.getName().startsWith("get"))
            {
                tempList.add(m.getName().substring(3));
            }
        }
        columnNames=(String[]) tempList.toArray(new String[tempList.size()]);
上面的

是我用来检索列名的代码。

一个解决办法是命名属性/getmethods"ID_00","Callsign_01","Categorie_02",并通过使用字符串的最后2个字符做排序,但这将是相当丑陋的,我正在寻找一个更干净的解决方案。

我建议创建一个注释,用于定义表列的顺序和更多元数据,例如标签:

@Retention(RetentionPolicy.RUNTIME)
@interface TableColumn {
    String label();
    int order();
}

然后像这样检索它们:

public Set<Method> findTableColumsGetters(Class<TestTableData> clazz) {
    Set<Method> methods = new TreeSet<>(new Comparator<Method>() {
        @Override
        public int compare(Method o1, Method o2) {
            return Integer.valueOf(o1.getAnnotation(TableColumn.class).order())
                    .compareTo(o2.getAnnotation(TableColumn.class).order());
        }
    });
    for(Method method : clazz.getMethods()) {
        if(method.isAnnotationPresent(TableColumn.class)) {
            methods.add(method);
        }
    }
    return methods;
}

下面是一些测试:

测试表数据

static class TestTableData {
    private String id, callsign, categorie;
    @TableColumn(label = "Caterogy", order = 3)
    public String getCategorie() {
        return categorie;
    }
    public void setCategorie(String categorie) {
        this.categorie = categorie;
    }
    @TableColumn(label = "Call sign", order = 2)
    public String getCallsign() {
        return callsign;
    }
    public void setCallsign(String callsign) {
        this.callsign = callsign;
    }
    @TableColumn(label = "ID", order = 1)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
测试:

@Test
public void findTableColumsGetters() {
    Set<Method> getters = findTableColumsGetters(TestTableData.class);
    for(Method getter : getters) {
        TableColumn annotation = getter.getAnnotation(TableColumn.class);
        System.out.printf("%d %s (%s)%n", annotation.order(), annotation.label(), getter.getName());
    }
}
输出:

1 ID (getId)
2 Call sign (getCallsign)
3 Caterogy (getCategorie)

我建议您不要检索注释到达时间,您需要从中获取信息,而是为您的方法创建一个元数据类,您在执行搜索时将所有内容包括方法本身放在其中。

相关内容

  • 没有找到相关文章

最新更新