Java Dynami c прокси - класс реализует несколько интерфейсов - PullRequest
0 голосов
/ 07 мая 2020

Я смотрю некоторые примеры 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() в примере выше?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...