在枚举中使用反射,但总是得到NoSuchMethodException

时间:2013-01-15 23:23:19

标签: java reflection enums talend

我正在为Talend Open Studio构建一个自定义组件,以便从应用程序(JIRA)访问数据源,该应用程序具有包装器以获取其所有数据。它为所有数据结构公开了一个充满非常易变的getter的API。由于Talend Open Studio仅支持基本类型,我通常需要链接几个调用来获取原始数据(即Project.getProjectDetail()。getOwner()。getName())

但是这些API经常变化,我不想每次都改变我的代码。所以我决定使用枚举方法:当暴露一个新字段时,我只需要在枚举中添加一个元素。这样的事情:

(我将大多数元素简化为简洁)

public enum JiraProjectField {

    KEY(new String[]{"getKey"}),
    COMPONENTS_NUM(new String[]{"getComponents", "size"}),

    private Method[] m;
    private ArrayList<Class<?>> r;

    private JiraProjectField(String[] methods) {

        this.r = new ArrayList<Class<?>>(methods.length);

        Class<?> initClass = Project.class;
        for(int i=0; i< methods.length; i++){
            try {
                m[i] = initClass.getMethod(methods[0], (Class<?>)null);
                r.add(m[i].getReturnType());
                initClass = m[i].getReturnType();
            } catch (SecurityException e) {
                throw new ExceptionInInitializerError(e.toString());
            } catch (NoSuchMethodException e) {
                throw new ExceptionInInitializerError(e.toString());
            }
        }
}

但是我总是得到NoSuchMethodException,即使我确定具有该名称的方法存在。有什么我不知道的吗?

1 个答案:

答案 0 :(得分:3)

我不确定为什么你不再使用varargs但你可以试试

m[i] = initClass.getMethod(methods[i]);