Я создаю специальный компонент для Talend Open Studio для доступа к источнику данных из приложения (JIRA), у которого есть оболочка для получения всех данных. Он предоставляет 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
Gabriele B 16 Янв 2013 в 03:23
Непонятно, какие перечисления должны это делать. Вы говорите, что этот код работает вне перечисления? Было бы очень полезно, если бы вы привели короткий, но полный пример этой неудачи.
 – 
Jon Skeet
16 Янв 2013 в 03:24
Какая сигнатура метода?
 – 
assylias
16 Янв 2013 в 03:24
Уверены, что это общедоступный метод в общедоступном классе?
 – 
Tom Hawtin - tackline
16 Янв 2013 в 03:26
«Есть ли что-то, чего я не знаю?» Томас Эдисон сказал: «Мы ни о чем не знаем и миллионной доли процента». Так что я ожидаю ответ на этот вопрос. да.
 – 
Andrew Thompson
16 Янв 2013 в 03:26
Я даже не знаю, сколько не знаю. ;)
 – 
Peter Lawrey
16 Янв 2013 в 03:45

1 ответ

Лучший ответ

Я не уверен, почему вы больше не используете varargs, но вы можете попробовать

m[i] = initClass.getMethod(methods[i]);
3
Peter Lawrey 16 Янв 2013 в 03:44
Ах да, это getMethod(methods[0], new Class<?>[] { null });, которое на самом деле выглядит как неопределенное поведение.
 – 
Tom Hawtin - tackline
16 Янв 2013 в 04:03
+1, это было намного проще, чем я предполагал. Проблема заключалась в приведении Class ; снятие броска решило проблему. Однако мне интересно, смогу ли я найти лучший дизайн (массив методов вместо массива строк? Прототип varargs? Ничего подобного?)
 – 
Gabriele B
16 Янв 2013 в 12:16
Вы сможете сделать это в Java 8, поскольку в нем есть объекты методов первого класса. то есть вы можете обратиться к методу и получить к нему доступ без явного использования отражения.
 – 
Peter Lawrey
16 Янв 2013 в 17:26