Java基于接口的动态代理

tech2025-06-17  2

         * 动态代理:          *  特点:字节码随用随创建,随用随加载          *  作用:不修改源码的基础上对方法增强          *  分类:          *      基于接口的动态代理          *      基于子类的动态代理          *  基于接口的动态代理:          *      涉及的类:Proxy          *      提供者:JDK官方          *  如何创建代理对象:          *      使用Proxy类中的newProxyInstance方法          *  创建代理对象的要求:          *      被代理类最少实现一个接口,如果没有则不能使用          *  newProxyInstance方法的参数:          *      ClassLoader:类加载器          *          它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法。          *      Class[]:字节码数组          *          它是用于让代理对象和被代理对象有相同方法。固定写法。          *      InvocationHandler:用于提供增强的代码          *          它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。          *          此接口的实现类都是谁用谁写。          */

    代码示例: 准备一个演示的Product的接口和实现类 public interface IProducer { public void sale(float money); public void service(float money); }

 

public class Producer implements IProducer{ public void sale(float money){ System.out.println("卖出产品,卖出了" + money + "元"); } public void service(float money){ System.out.println("提供服务,得到了" + money + "元"); } }

  /**                      * 作用:执行被代理对象的任何接口方法都会经过该方法                      * 方法参数的含义                      * @param proxy   代理对象的引用                      * @param method  当前执行的方法                      * @param args    当前执行方法所需的参数                      * @return        和被代理对象方法有相同的返回值                      * @throws Throwable                      */

public static void main(String[] args) { //被代理的对象要用final修饰 final Producer producer = new Producer(); /* newProxyInstance需要3个参数 类加载器:被代理对象的类加载器,写法固定 字节码数组:让代理对象和被代理的对象有相同的方法 InvocationHandler:用于提供增强的代码,一般是一个匿名内部类 */ IProducer iProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() { /* Object proxy:代理对象的引用 Method method:当前执行的方法 Object[] args:当前的方法的参数 有了方法,有了实现方法的对象,有了方法的参数,即可对方法进行增强 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object value = null; if("sale".equals(method.getName())){ float money = (float)args[0]; value = method.invoke(producer,money*0.7f); } return value; } }); iProducer.sale(10000); }

 

最新回复(0)