动态代理
2020-11-26 本文已影响0人
i小雨
- 动态代理分为两类:
1、基于接口的动态代理; (JDK动态代理 )
2、基于类的动态代理;(cglib动态代理)
3、Java字节码实现。(javassist)
JDK动态代理:
需要了解两个类:Proxy(代理)、InvocationHandler(调用处理程序)
接口:
public interface UserService {
void addUser();
void deleteUser();
void updateUser();
void selectUser();
}
实现类:
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("增加了一个User");
}
@Override
public void deleteUser() {
System.out.println("删除了一个User");
}
@Override
public void updateUser() {
System.out.println("修改了一个User");
}
@Override
public void selectUser() {
System.out.println("查询了一个User");
}
}
创建处理程序类:
//用这个类自动生成动态代理类!
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口(直接写object可以使该类变为通用的)
private Object target;
public void setTarget(Object target){
this.target = target;
}
//得到生成的代理类
public Object getProxy(){
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
log(method.getName());//方法增强(记录日志)
return result;
}
//增强方法
public void log(String msg){
System.out.println("执行了"+msg+"方法");
}
}
测试类:
public class TestProxy {
public static void main(String[] args) {
//真实角色
UserService userService = new UserServiceImpl();
//代理角色,不存在
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService);//设置要代理的对象
//动态生成代理类
UserService proxy = (UserService) pih.getProxy();
proxy.addUser();
proxy.deleteUser();
proxy.updateUser();
proxy.selectUser();
}
}
结果:
增加了一个User
执行了addUser方法
删除了一个User
执行了deleteUser方法
修改了一个User
执行了updateUser方法
查询了一个User
执行了selectUser方法