Я смотрю некоторые примеры Java Dynami c прокси. Базовый c тот, который просто перехватывает вызов метода и добавляет распечатку:
public interface IVehicle {
public void forward();
}
public class Car implements IVehicle {
private String name;
public Car(String name) {this.name = name;}
public void forward() {
System.out.println("Car " + name + " forward");
}
}
public class VehicleHandler implements InvocationHandler {
private Car v;
public VehicleHandler(Car v) {this.v = v;}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
System.out.println("Vehicle Handler: Invoking " + m.getName());
return m.invoke(v, args);
}
}
public class Client {
public static void main(String[] args) {
Car c = new Car("audi");
ClassLoader cl = Car.class.getClassLoader();
IVehicle v = (IVehicle) Proxy.newProxyInstance(cl,
new Class[] {IVehicle.class}, new VehicleHandler(c));
v.forward();
}
}
Этот пример работает хорошо и выводит сообщения обработчика и объекта. Но затем я думаю, что, если класс Car в приведенном выше примере реализует несколько интерфейсов, и я вызываю все методы во всех реализованных интерфейсах?
public interface IVehicle {
public void forward();
}
**public interface IVehicle2 {
public void forward2();
}**
public class Car implements IVehicle, **IVehicle2** {
private String name;
public Car(String name) {this.name = name;}
public void forward() {
System.out.println("Car " + name + " forward");
}
**public void forward2() {
System.out.println("Car " + name + " forward2");
}**
}
public class VehicleHandler implements InvocationHandler {
private Car v;
public VehicleHandler(Car v) {this.v = v;}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
System.out.println("Vehicle Handler: Invoking " + m.getName());
return m.invoke(v, args);
}
}
public class Client {
public static void main(String[] args) {
Car c = new Car("audi");
ClassLoader cl = Car.class.getClassLoader();
**Car** v = **(Car)** Proxy.newProxyInstance(cl,
new Class[] {IVehicle.class, **IVehicle2.class**}, new VehicleHandler(c));
v.forward();
**v.forward2();**
}
}
Я получил ошибку ниже:
Exception in thread "main" java.lang.ClassCastException: class com.sun.proxy.$Proxy0 cannot be cast to class Car
Мои вопросы: 1. Почему я получаю ошибку выше? 2. Как правильно использовать прокси, если я хочу вызвать и forward()
, и forward2()
в примере выше?
Большое спасибо!