Отражение Java: Создайте класс с реализацией

Ответ Даниэля был хорош, за исключением того, что мне пришлось изменить этот код ...

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", sf, 443));

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

к этому коду ...

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
    SchemeRegistry registry = ccm.getShemeRegistry()
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", sf, 443));

, чтобы заставить его работать.

67
задан Daniel Rikowski 4 July 2009 в 20:00
поделиться

3 ответа

Создать что-то, претендующее на реализацию интерфейса "на лету", на самом деле не так уж и сложно. Вы можете использовать java.lang.reflect.Proxy после реализации InvocationHandler для обработки любых вызовов методов.

Конечно, вы можете создать настоящий класс с такой библиотекой, как ] BCEL .

Если это сделано для целей тестирования, вам следует взглянуть на макеты фреймворков, такие как jMock и EasyMock .

54
ответ дан 24 November 2019 в 14:37
поделиться

Фактически, вы должны использовать имя класса в методе Class.fromName () и привести его к типу вашего интерфейса. Посмотрите, поможет ли приведенный ниже пример.

public class Main {

    public static void main(String[] args) throws Exception {
        Car ferrari = (Car) Class.forName("Mercedez").newInstance();
        System.out.println(ferrari.getName());
    }
}

interface Car {
    String getName();
}

class Mercedez implements Car {

    @Override
    public String getName() {
        return "Mercedez";
    }

}

class Ferrari implements Car {

    @Override
    public String getName() {
        return "Ferrari";
    }

}
-4
ответ дан 24 November 2019 в 14:37
поделиться

Если вы хотите выйти за рамки интерфейсов, вы можете взглянуть на cglib и ] objenesis . Вместе они позволят вам делать довольно мощные вещи, расширяя абстрактный класс и создавая его экземпляры. ( jMock использует их для этой цели, например.)

Если вы хотите придерживаться интерфейсов, сделайте то, что сказал Джон Скит :).

3
ответ дан 24 November 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: