JDK动态代理简单小程序

  1. Jdk动态代理
  2. 1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。
  3.   原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦
  4. 使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。
  5. 代码来说明
  6.   首先创建一个类来实现InvocationHandel
  7. package cn.csdn.service;
  8. import java.lang.reflect.InvocationHandler;
  9. import java.lang.reflect.Method;
  10. //动态代理实现
  11. public class LogInterceptor implements InvocationHandler {
  12.     // 被代理对象
  13.     private Object target;
  14.     public Object getTarget() {
  15.         return target;
  16.     }
  17.   // 通过往里面设置值来确定被代理的对象
  18.     public void setTarget(Object target) {
  19.         this.target = target;
  20.     }
  21.     public void beforeMethod() {
  22.         System.out.println(“拦截的功能”);
  23.     }
  24.     @Override
  25.     public Object invoke(Object proxy, Method method, Object[] args)
  26.             throws Throwable {
  27.         beforeMethod();
  28.     // 调用被代理的对象    target是传过来的那个接口     args是接口所对应的类
  29.         method.invoke(target, args);
  30.         return null;
  31.     }
  32. }
  33. 然后再创建代理类对象
  34.     @Test
  35.     public void test() {
  36.         //被代理对象     把这个接口对应的方法加上逻辑   是它要进行代理
  37.         UserDao userDao = new UserDaoImpl();
  38.         //实现了InvocationHander的接口的类
  39.         LogInterceptor logInterceptor = new LogInterceptor();
  40.         logInterceptor.setTarget(userDao);
  41.         //三个参数 (classLoader, 被代理对象都实现类哪些接口,进行代理的类)
  42.     UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),new Class[]{UserDao.class}, logInterceptor);
  43.         userDaoProxy.addUser();
  44.         userDaoProxy.delete();
  45.     }
  46. 注:new Class[]{UserDao.class}  和 UserDao.getClass().getInterfaces()是一样的,前者是数组,肯定定义多个接口,后者是定义一个接口
  47. UserDao和UsreDaoImpl中就是放了两个方法,分别为addUser(),delete()
  48. UserDao接口
  49. public interface UserDao {
  50.     public void addUser();
  51.     public void delete();
  52. }
  53. UserDaoImpl类
  54. public class UserDaoImpl implements UserDao {
  55.     @Override
  56.     public void addUser() {
  57.         // TODO Auto-generated method stub
  58.         System.out.println(“添加啦=======”);
  59.     }
  60.     @Override
  61.     public void delete() {
  62.         // TODO Auto-generated method stub
  63.         System.out.println(“删除操作==”);
  64.     }
  65. }
  66. Junit测试的结果为:
  67. 拦截的功能
  68. 添加啦=======
  69. 拦截的功能
  70. 删除操作==
    1. 我们可以看到  我们在每一个调用的方法钱都加上了想要添加的方法

标签