Jdk动态代理 1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。 原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦 使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。 代码来说明 首先创建一个类来实现InvocationHandel package cn.csdn.service; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //动态代理实现 public class LogInterceptor implements InvocationHandler { // 被代理对象 private Object target; public Object getTarget() { return target; } // 通过往里面设置值来确定被代理的对象 public void setTarget(Object target) { this.target = target; } public void beforeMethod() { System.out.println("拦截的功能"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeMethod(); // 调用被代理的对象 target是传过来的那个接口 args是接口所对应的类 method.invoke(target, args); return null; } } 然后再创建代理类对象 @Test public void test() { //被代理对象 把这个接口对应的方法加上逻辑 是它要进行代理 UserDao userDao = new UserDaoImpl(); //实现了InvocationHander的接口的类 LogInterceptor logInterceptor = new LogInterceptor(); logInterceptor.setTarget(userDao); //三个参数 (classLoader, 被代理对象都实现类哪些接口,进行代理的类) UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),new Class[]{UserDao.class}, logInterceptor); userDaoProxy.addUser(); userDaoProxy.delete(); } 注:new Class[]{UserDao.class} 和 UserDao.getClass().getInterfaces()是一样的,前者是数组,肯定定义多个接口,后者是定义一个接口 UserDao和UsreDaoImpl中就是放了两个方法,分别为addUser(),delete() UserDao接口 public interface UserDao { public void addUser(); public void delete(); } UserDaoImpl类 public class UserDaoImpl implements UserDao { @Override public void addUser() { // TODO Auto-generated method stub System.out.println("添加啦======="); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("删除操作=="); } } Junit测试的结果为: 拦截的功能 添加啦======= 拦截的功能 删除操作==
我们可以看到 我们在每一个调用的方法钱都加上了想要添加的方法