Возможно ли создать Proxy-класс только из интерфейса

219
16 февраля 2018, 19:03

Всем добрый день. К примеру есть у меня лишь интерфейс, без реализации каким-либо классом. Имеется ли какая-то возможно создать прокси класс на основе этого интерфейса, без необходимости создания экземпляра класса, реализующего этот интерфейс?

Answer 1

без необходимости создания экземпляра класса, реализующего этот интерфейс?

Прокси класс и будет классом, реализующим интерфейс. Отличие от реализации обычного класса в том, что его создание происходит в runtime.

Proxy:

A dynamic proxy class (simply referred to as a proxy class below) is a class that implements a list of interfaces specified at runtime when the class is created, with behavior as described below. A proxy interface is such an interface that is implemented by a proxy class. A proxy instance is an instance of a proxy class.

Реализация всех методов интерфейсов прокси определяется в экземпляре класса InvocationHandler.

Например у меня есть интерфейс с 2 методами:

private interface Foo {
    void method1();
    void method2();
    void method3();
}

Я хочу создать прокси, который бы реализовывал method1, а на все остальные ничего не делал (либо бросал исключение, что метод не реализован). Это можно сделать, например, так:

public static void main(String... arg) {
    Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[]{Foo.class}, (proxy, method, args) -> {
        switch (method.getName()) {
            case "method1":
                System.out.println("method1");
                return null;
            default:
                break;
        }
        throw new RuntimeException(method.getName() + " is not implemented");
    });
    foo.method1();
    foo.method2();
}

Результат выполнения:

method1
Exception in thread "main" java.lang.RuntimeException: method2 is not implemented ...

READ ALSO
Как наложить текстуру на модель?

Как наложить текстуру на модель?

Считал файл nameTIF с изображением и поместил его в буфер для изображения:

249
Получение данных серверов методом POST

Получение данных серверов методом POST

Пишу веб-сервер на Java (не используя сервлет и тп

212
Обновить JAVA_HOME Ubuntu 16.04

Обновить JAVA_HOME Ubuntu 16.04

Сделал downgrade Java 9 to Java 8Системные переменные не обновились полностью

207
junit тест с Mockito и PowerMockito

junit тест с Mockito и PowerMockito

Нужно ли проверять вызов исключения путем замены локальной переменной File

241