(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 }