zoukankan      html  css  js  c++  java
  • 反射四(动态代理)

    1.动态代理

    (1)Proxy提供用于创建动态代理类和代理对象的静态方法,它是所有动态代理类的父亲

    (2)Proxy提供了两个方法来创建动态代理类和动态代理实例

    2.使用动态代理实现AOP(面向切面编程)

    代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。

    3.实现

    
    
    /**
    * 动态代理
    */
    @Test
    public void testProxy(){

    final ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculatorImpl();//final防止该对象被提前回收
    /**
    * Proxy.newProxyInstance(classLoader,Class<?>[],InvocationHandler
    * classLoader由动态代理产生的对象由那个类加载其加载,通常情况下和被代理对象使用一样的类加载器
    * Class<?>[]:由动态代理产生的对象必须需要实现的接口的Class数组,数组中必须是接口对应的class
    * InvocationHandler:当具体调用代理对象的方法时,将产生什么行为
    */

    ArithmeticCalculator proxy = (ArithmeticCalculator) Proxy.newProxyInstance(arithmeticCalculator.getClass().getClassLoader(), new Class[]{ArithmeticCalculator.class}, new InvocationHandler() {
    /**
    *
    * @param proxy
    * @param method:正在被调用的方法
    * @param args:调用方法传入的参数
    * @return
    * @throws Throwable
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //调用被代理的目标方法,真正执行目标方法
    System.out.println("方法执行前操作");
    Object result = method.invoke(arithmeticCalculator,args);
    System.out.println("方法执行后操作");
    return result;
    }
    });
    //调用的是上边的invoke方法
    int result = proxy.add(2,5);
    System.out.println(result);
    result = proxy.mul(1,2);
    System.out.print(result);
    }
    
    
    /**
    * 接口定义,接口实现省略
    */
    public interface ArithmeticCalculator {
    int add(int i,int j);
    int sub(int i,int j);
    int mul(int i,int j);
    int div(int i,int j);
    }

    
    

    4.代码调用

  • 相关阅读:
    3D 立体动态图 代码:
    自由切换 网页上的 ico 图标
    ES6 基本语法:
    JavaScript中class类的介绍
    React_01_ECMAScript6
    使用JS计算前一天和后一天
    Web 前端学习计划
    read
    java对象实例化
    关于为什么java需要垃圾回收
  • 原文地址:https://www.cnblogs.com/yxqing/p/10605777.html
Copyright © 2011-2022 走看看