动态代理小案例
我们现在提出一个需求,比如现有一个交通工具的接口:
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); } }
本文来自博客园,作者:紫英626,转载请注明原文链接:https://www.cnblogs.com/recorderM/p/16475494.html


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号