动态代理

来源:互联网 发布:淘宝上的知名甜品店 编辑:程序博客网 时间:2024/06/16 14:09

*只能针对接口做代理

1.概念

自己不想干的事委托别人来干

2. 场景

在业务接口实现类中做权限校验和日志记录

3. 代码实现

业务接口

public interface UserService {void add();void delete();}
实现类

public class UserServiceImpl implements UserService{@Overridepublic void add() {System.out.println("增");}@Overridepublic void delete() {System.out.println("删");}}
如果在实现类的每个方法里面都去添加权限校验和日志记录操作的话太过于麻烦,现在针对业务接口做代理使用Proxy类

代码优化

1.代理类实现InvocationHandler接口

public class MyInvocationHandler implements InvocationHandler {// 传入被代理对象private Object target;public MyInvocationHandler(Object target){this.target = target;}@Override// 参数分别为代理对象,通过反射获取的方法,方法的参数列表public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("权限校验");method.invoke(target, args); // 执行被代理对象的方法 System.out.println("日志记录");return null;}}

2.生成代理对象

private static void dynamicProxy() {// 被代理类UserServiceImpl serviceImpl = new UserServiceImpl();MyInvocationHandler m = new MyInvocationHandler(serviceImpl);// 生成代理对象UserService newProxyInstance = (UserService) Proxy.newProxyInstance(serviceImpl.getClass().getClassLoader(), serviceImpl.getClass().getInterfaces(), m);newProxyInstance.add();newProxyInstance.delete();}

3.结果

权限校验增日志记录权限校验删日志记录




原创粉丝点击