JAVA \ Компилировать функцию только во время выполнения - PullRequest
3 голосов
/ 29 мая 2011

Мой код используется как часть двух больших версий и взаимодействует с внешним интерфейсом.В одной из версий был добавлен новый API (мне нужно вызвать новый метод).

Я бы хотел запретить поддержку двух версий моего кода и использовать оператор if:

If VersionX
   Do Method1()
If VersionY
   Do Method2()

при условии, что method2() - это новая функция, которую мне нужно вызывать, есть ли способ, которым код может компилироваться только во время выполнения (это означает, что, если я буду работать в VersionX системе, не будет проблем компиляции и исключений, хотя method 2() там не существует)?

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Этого можно добиться с помощью интерфейса и двух классов:

interface API {
    void Method();
}

class APIX implements API {
    void Method() {
        someInstance.Method1();
    }
}

class APIY implements API {
    void Method() {
        anotherInstance.Method2();
    }
}

Затем, в зависимости от текущей версии, вы создаете экземпляр либо APIX , либо APIY * 1007.*:

API api;
if (isVersionX) 
    api = new APIX();
else
    api = new APIY();
api.Method();

Этот код скомпилирован с использованием более нового API, содержащего оба метода.Поскольку загрузка классов осуществляется только по запросу, класс, использующий более новый метод, не загружается, когда доступен только старый API, и у вас нет никаких конфликтов во время выполнения.

0 голосов
/ 29 мая 2011

Вы можете использовать отражение для вызова метода, если он существует.

// calls a method if it exists or throws an exception.
Method method = object.getClass().getMethod("DoMethod1");
method.invoke(object);
...