动态代理
动态代理
概念
1、动态代理和静态代理角色一样(真实角色、代理角色)
2、动态代理的代理类是动态生成的,不是和静态代理一样定义好代理类
3、动态代理分为两大类,基于接口的动态代理,、基于类的动态代理
基于接口--->JDK动态代理
基于类----->cglib
java字节码实现-->javasist
动态代理的好处
- 可以使真实角色操作更加纯粹,不用关注一些公共的业务
- 公共部分全部交由代理处理,实现业务分工
- 公共业务发生扩展时,方便集中管理
- 一个动态代理类代理的是一个接口,一般对应一类业务
- 一个动态代理可以代理多个类,只要实现的是同一个接口就行(相当于第四点)
基于JDK实现动态代理
需要了解的类
Proxy:代理
InvocationHandler:调用处理程序
代码实操简单例子
以下为动态代理操作真实对象之前之后添加日志的简单案例
动态代理实现类
package com.lwp.study.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 自定义动态代理类,实现JDK的InvocationHandler处理器
*/
public class MyProxyHandler implements InvocationHandler {
/**
* 代理的目标
*/
private Object target;
public MyProxyHandler(Object target){
this.target = target;
}
/**
* 生成得到代理类
* @return
*/
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
/**
* 代理处理方法
* @param proxy 调用该方法的代理实例
* @param method 代理的真实对象处理的方法
* @param args 包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。
* 原始类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是通过反射实现
beforeLog(method.getName()); //操作真实对象方法之前添加日志
Object invoke = method.invoke(target, args);
afterLog(); //操作真实对象之后添加日志
return invoke;
}
/**
* 真实对象操作之前添加日志
* @param methodName
*/
public void beforeLog(String methodName){
System.out.println("用户xxx操作了"+methodName+"方法!");
}
/**
* 真实对象操作之后添加日志
*/
public void afterLog(){
System.out.println("用户xxx本次操作完成!");
}
}
接口类
package com.lwp.study.proxy;
public interface TestStudentInterface {
public void addStudent();
public void delStudent();
public void updateStudent();
public void queryStudent();
}
实现类
package com.lwp.study.proxy;
public class TestStudent implements TestStudentInterface{
public void addStudent(){
System.out.println("新增了学生");
}
public void delStudent(){
System.out.println("新增了学生");
}
public void updateStudent(){
System.out.println("新增了学生");
}
public void queryStudent(){
System.out.println("新增了学生");
}
}
测试类
package com.lwp.study.proxy;
public class Test {
public static void main(String[] args) {
TestStudent stu = new TestStudent();
//实例化动态代理类,注入代理对象
MyProxyHandler mph = new MyProxyHandler(stu);
//生成代理对象
TestStudentInterface proxyStu =(TestStudentInterface)mph.getProxy();
proxyStu.addStudent();
}
}

浙公网安备 33010602011771号