Можно ли переопределить метод во время выполнения? - PullRequest
9 голосов
/ 25 ноября 2011

Есть ли способ переопределить метод во время выполнения? Даже если это требует динамического создания подкласса из этого экземпляра?

Ответы [ 4 ]

12 голосов
/ 25 ноября 2011

С простой Java, нет.

С ByteBuddy (предпочтительно), asm , cglib или aspectj , да.

В простой Java в такой ситуации нужно создать прокси на основе интерфейса , который обрабатывает вызов метода и делегирует исходный объект (или нет).

2 голосов
/ 26 ноября 2011

Вы можете создать анонимный класс , который переопределяет метод и использует шаблон стратегии , чтобы решить, что делать.

Если вы ищете динамическую компиляцию из кода, вы можете следовать этим инструкциям

0 голосов
/ 09 февраля 2017

Как говорили другие, нет, вы не можете переопределить метод во время выполнения.Однако, начиная с Java 8, вы можете использовать функциональный подход.Function - это функциональный интерфейс, который позволяет рассматривать функции как ссылочные типы.Это означает, что вы можете создать несколько из них и переключаться между ними (динамически) по схеме а-ля стратегии.

Давайте рассмотрим пример:

public class Example {

    Function<Integer, Integer> calculateFuntion;

    public Example() {

        calculateFuntion = input -> input + 1;
        System.out.println(calculate(10));
        // all sorts of things happen
        calculateFuntion = input -> input - 1;
        System.out.println(calculate(10));
    }

    public int calculate(int input) {
        return calculateFuntion.apply(input);
    }

    public static void main(String[] args) {
        new Example();
    }
}

Вывод:

11
9

Я не знаю, при каких обстоятельствах и дизайне вы намерены переопределить, но дело в том, что вы заменяете поведение метода, то есть переопределение.

0 голосов
/ 26 ноября 2011

Я думаю, что это невозможно с простой Java. С отражением и / или cglib, вероятно, вы можете сделать это.

Посмотрите на эти ссылки:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

...