需求
模拟一个客户通过经销商购买到货物,生产厂家能拿到钱。
基于接口的动态代理实现
关键类:Proxy类,提供方:JDK
使用要求
- 被代理类至少实现一个接口
- 获取代理对象
/**
*ClassLoader,类加载器,加载代理对象的字节码
*interfaces,让代理对象拥有和被代理对象一样的所有方法
*InvocationHandler,增强方法的具体实现
*/
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)
**创建生产厂商接口Producer **
package com.cncs.proxy;
/**
* 生产厂家的接口
*/
public interface Producer {
void sale(float money);
}
创建生产厂商接口的实现类
package com.cncs.proxy;
public class ProducerImpl implements Producer {
@Override
public void sale(float money) {
System.out.println("厂家卖出产品,得到钱:"+money);
}
}
创建模拟的客户类Client
package com.cncs.proxy;
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Client {
@Test
public void buyProduct() {
final Producer producer = new ProducerImpl();
//厂家直销
// producer.sale(5000f);
//通过经销商
Producer producerProxy = (Producer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
/**
* 对代理对象方法进行增强,并执行该方法
* @param proxy 被代理对象的引用
* @param method 被代理对象正在执行的方法
* @param args 被代理对象正在执行方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//被代理对象的方法的返回值
Object returnVal = null;
//获取参数
float money = (float) args[0];
//执行被代理对象的方法
returnVal = method.invoke(producer, money * 0.7f);
return returnVal;
}
});
producerProxy.sale(1000f);
}
}
基于子类的动态代理
关键类:Enhancer类,提供者:第三方
使用要求
- 导入cglib依赖
- 被代理类不能是最终类
- 获取代理对象,执行方法,增强的方式和基于接口类似。
Enhancer.create(producer.getClass(), new MethodInterceptor() {...}
编写pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cncs</groupId>
<artifactId>day03_02proxy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
</dependencies>
</project>
创建模拟代理类ProducerImpl
package com.cncs.cglib;
import com.cncs.proxy.Producer;
public class ProducerImpl implements Producer {
@Override
public void sale(float money) {
System.out.println("厂家卖出产品,得到钱:"+money);
}
}
创建模拟客户类Client
package com.cncs.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;
import java.lang.reflect.Method;
public class Client {
@Test
public void buyProduct() {
final ProducerImpl producer = new ProducerImpl();
//厂家直销
// producer.sale(5000f);
//通过经销商
ProducerImpl producerCglib = (ProducerImpl) Enhancer.create(producer.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//返回值
Object returnVal = null;
//获得参数
float money = (float) objects[0];
returnVal = method.invoke(producer,money*0.7f);
return returnVal;
}
});
producerCglib.sale(1000f);
}
}