基于接口的动态代理
动态代理:
特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
1.ProducerDao接口:
public interface ProducerDao {
//销售
public void saleProduce(float money);
//售后
public void afterService(float money);
}
2.Producer实现类
//生产者
public class Producer implements ProducerDao {
//销售
public void saleProduce(float money){
System.out.println("销售商品,并拿到钱"+money);
}
//售后
public void afterService(float money){
System.out.println("提供售后服务,并拿到钱"+money);
}
}
3.调用处理程序:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//获取方法执行的参数
Float money = (Float)args[0];
//判断当前方法是不是销售
if("saleProduce".equals(method.getName())){
result = method.invoke(target, money*0.8f);
}
return result;
}
}
4.测试类
public class Client {
public static void main(String[] args) {
//被代理对象
//被代理对象要是接口类型的
ProducerDao producer = new Producer();
//获取代理对象
//返回类型要是接口类型
ProducerDao proxy =(ProducerDao) Proxy.newProxyInstance(
producer.getClass().getClassLoader(),
producer.getClass().getInterfaces(),
new MyInvocationHandler(producer));
//使用代理对象调用被代理对象中的方法
proxy.saleProduce(10000f);
}
}
基于子类的动态代理(Cglib)
基于子类的动态代理:
涉及的类:Enhancer
提供者:第三方库cglib库
如何创建代理对象:使用Enhancer类中的create方法
创建代理对象的要求:代理类不是最终类
1.导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.7</version>
</dependency>
</dependencies>
2.Producer类
//生产者
public class Producer{
//销售
public void saleProduce(float money){
System.out.println("销售商品,并拿到钱"+money);
}
//售后
public void afterService(float money){
System.out.println("提供售后服务,并拿到钱"+money);
}
}
3.调用处理程序类MyMethodInterceptor
public class MyMethodInterceptor implements MethodInterceptor {
private Object target;
public MyMethodInterceptor(Object target) {
this.target = target;
}
public Object intercept(Object o, Method method,
Object[] args, MethodProxy methodProxy) throws Throwable {
Object result = null;
//获取方法执行的参数
Float money = (Float)args[0];
//判断当前方法是不是销售
if("saleProduce".equals(method.getName())){
result = method.invoke(target, money*0.8f);
}
return result;
}
}
4.测试类Client
public class Client {
public static void main(String[] args) {
//被代理对象
Producer producer = new Producer();
//获取代理对象
Producer proxy =(Producer) Enhancer.create(
producer.getClass(),
new MyMethodInterceptor(producer));
//使用代理对象调用被代理对象中的方法
proxy.saleProduce(10000f);
}
}