基于接口和子类的动态代理

(1)基于接口的动态代理

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

 1 //Producer.java
 2 public class Producer implements IProducer{
 3     public void saleProduct(float money){
 4         System.out.println("销售产品,并拿到钱"+money);
 5     }
 6     public void afterService(float money){
 7         System.out.println("提供售后服务"+money);
 8     }
 9 }
10 //IProducer.java
11 public interface IProducer  {
12     public void saleProduct(float money);
13     public void afterService(float money);
14 }
15 //Client.java
16 public class Client {
17     public static void main(String[] args) {
18         final Producer producer=new Producer();
19         IProducer producer1=(IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
20             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
21                 Object returnValue=null;
22                 Float money=(Float)args[0];
23                 if ("saleProduct".equals(method.getName())){
24                     returnValue= method.invoke(producer,money*0.8F);
25                 }
26                 return returnValue;
27             }
28         });
29         producer1.saleProduct(10000F);
30     }
31 }

(2)基于子类的动态代理

* 基于子类的动态代理:
* 涉及的类:Enhancer
* 提供者:第三方cglib库
* 如何创建代理对象:
* 使用Enhancer类中的create方法
* 创建代理对象的要求:
* 被代理类不能是最终类
* create方法的参数:
* Class:字节码
* 它是用于指定被代理对象的字节码。
* Callback:用于提供增强的代码
* 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
* 此接口的实现类都是谁用谁写。
* 我们一般写的都是该接口的子接口实现类:MethodInterceptor

 1 //Producer.java
 2 public class Producer{
 3     public void saleProduct(float money){
 4         System.out.println("销售产品,并拿到钱"+money);
 5     }
 6     public void afterService(float money){
 7         System.out.println("提供售后服务"+money);
 8     }
 9 }
10 //Client.java
11 public class Client {
12     public static void main(final String[] args) {
13         final Producer producer = new Producer();
14         Producer producer1= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
15             public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
16                 Object returnValue = null;
17                 Float money=(Float)args[0];
18                 if ("saleProduct".equals(method.getName())) {
19                     returnValue = method.invoke(producer, money * 0.8F);
20                 }
21                 return returnValue;
22             }
23         });
24         producer1.saleProduct(10000F);
25     }
26 }
原文地址:https://www.cnblogs.com/SanChauncy/p/12485187.html