Ответ Даниэля был хорош, за исключением того, что мне пришлось изменить этот код ...
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));
, чтобы заставить его работать.
Создать что-то, претендующее на реализацию интерфейса "на лету", на самом деле не так уж и сложно. Вы можете использовать java.lang.reflect.Proxy
после реализации InvocationHandler
для обработки любых вызовов методов.
Конечно, вы можете создать настоящий класс с такой библиотекой, как ] BCEL .
Если это сделано для целей тестирования, вам следует взглянуть на макеты фреймворков, такие как jMock и EasyMock .
Фактически, вы должны использовать имя класса в методе 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";
}
}
Если вы хотите выйти за рамки интерфейсов, вы можете взглянуть на cglib и ] objenesis . Вместе они позволят вам делать довольно мощные вещи, расширяя абстрактный класс и создавая его экземпляры. ( jMock использует их для этой цели, например.)
Если вы хотите придерживаться интерфейсов, сделайте то, что сказал Джон Скит :).