如何影响反射中方法的顺序

时间:2015-06-03 10:44:14

标签: java reflection

我想创建一个带有动态布局的Swingtable,关于设置为源的类数据 更具体地说:
我有一个具有多个属性的类。在创建表时,我想这样做,以便表格看起来:“哪个公共getFunction与returntyp字符串可用”并使用此函数后面的属性作为列名,稍后也作为行的源。

目前正在努力。

我现在的问题是:
如何通过这种方法确保我的列的特定顺序? 例如,我有一个列“ID”,“呼号”,“类别” 我想按此顺序显示它们 我不知道如何在sourceCode中订购方法,列总是以相同的顺序排列(“ID”,“categories”,“callign”)。

        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()]);

以上是我用于重新检索列名的代码。

一种解决方法是命名属性/ getMethodes“ID_00”,“Callsign_01”,“Categorie_02”,并使用字符串的最后2个字符进行排序,但这将是相当难看的,我正在搜索一个更清洁的解决方案。

1 个答案:

答案 0 :(得分:1)

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

@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)

我建议你不要检索你需要信息的注释到达时间,而是为你的方法创建一个元数据类,你可以在执行搜索时将所有方法都包括在内。