动态代理小案例

我们现在提出一个需求,比如现有一个交通工具的接口:

public interface Vehicle {
    public void run();
    public String fly(int height);
}

我们想让小汽车(Car)和小船(ship)来继承这个接口,然后在实现接口中方法时,分别在方法实现前和实现后添加固定的语句。

传统方法就是直接每个在实现的时候都输出一边,但是这样比较不灵活,下面我们使用动态代理的方法来实现一下。

public class Car implements Vehicle{
    @Override
    public void run() {
        System.out.println("小汽车在公路 running..");
    }

    @Override
    public String fly(int height) {
        System.out.println("小汽车在" + height + "米处飞");
        return "小汽车在" + height + "米处飞";
    }
}
public class Ship implements Vehicle{
    @Override
    public void run() {
        System.out.println("大轮船在水上 running...");
    }
    @Override
    public String fly(int height) {
        return "小轮船在" + height + "米处飞";
    }
}

下面我们写一个类,类中有一个方法可以返回交通工具接口的代理对象:

public class VehicleProxyProvider {
    private Vehicle target_vehicle;

    public VehicleProxyProvider(Vehicle target_vehicle) {
        this.target_vehicle = target_vehicle;
    }

    public Vehicle getProxy(){
        ClassLoader classLoader = target_vehicle.getClass().getClassLoader();
        Class<?>[] interfaces = target_vehicle.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("start...");
                Object invoke = method.invoke(target_vehicle, args);
                System.out.println("end...");
                return invoke;
            }

        };
        Vehicle o = (Vehicle)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return o;
    }
}

上面的方法在创建代理对象的时候需要三个参数,分别是类加载器、反射获得的接口、接口的匿名实现类,

在匿名类中实现交通工具接口中指定方法的调用,然后在反射前后实现自定义的输出语句。

public class Test {
    public static void main(String[] args) {
        VehicleProxyProvider vehicleProxyProvider = new VehicleProxyProvider(new Car());
        Vehicle proxy = vehicleProxyProvider.getProxy();
        proxy.fly(234);
    }
}
posted @ 2022-07-13 20:31  紫英626  阅读(69)  评论(0)    收藏  举报

紫英