zoukankan      html  css  js  c++  java
  • AOP面向切面的基石——动态代理(一)

         其实动态代理在Java里不是什么新技术了,早在java 1.2之后便通过 java.lang.reflect.InvocationHandler 加入了动态代理机制。

    下面例子中,LancerEvolutionVI是Car接口的一个实现。

    CarTestModelFactory的getNewInstance接收一个LancerEvolutionVI对象,而返回一个代理对象。这个代理对象同LancerEvolutionVI一样,也实现了Car接口,在其Override实现的各个接口方法中,对LancerEvolutionVI的方法进行了拦截,并按照invoke方法中定义的那样安排各个切面方法的位置和调用顺序。

    package com.proxy;
    
    public interface Car {
        public void speed();
        public void torque();
    }
    package com.proxy;
    
    public class LancerEvolutionVI implements Car{
    
        @Override
        public void speed() {
            System.out.println("LancerEvolutionVI speed is 280");
        }
    
        @Override
        public void torque() {
            System.out.println("LancerEvolutionVI torque is 450");
        }
    
    }
    package com.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class CarTestModelFactory implements InvocationHandler{
        private Car testCar;
        
        public Car getNewInstance(Car car){
            this.testCar = car;
            Class c = car.getClass();
            Car testModel = (Car)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), this);
            return testModel;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            if(method.getName().equals("speed")){
                System.out.println("速度测试开始...");
                method.invoke(this.testCar, args);
                System.out.println("速度测试结束!");
            }else{
                System.out.println("扭矩测试开始...");
                method.invoke(this.testCar, args);
                System.out.println("扭矩测试结束!");
            }
            return null;
        }
    
    }

    测试代码:

    Car car = new CarTestModelFactory().getNewInstance(new LancerEvolutionVI());
    car.speed();
    car.torque();

    运行结果:

    速度测试开始...
    LancerEvolutionVI speed is 280
    速度测试结束!
    扭矩测试开始...
    LancerEvolutionVI torque is 450
    扭矩测试结束!

  • 相关阅读:
    IO模型
    协程
    线程
    进程总结
    HashMap和Hashtable有什么区别
    HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的
    GC线程是否为守护线程?
    float f=3.4;是否正确?
    final、finally和finalized的区别?
    Eureka注册中心是什么?
  • 原文地址:https://www.cnblogs.com/lyhero11/p/8430602.html
Copyright © 2011-2022 走看看