千锋20200415

在千锋“逆战”学习第53天

      每日一句:人呐,眼光放得长远一些,看到的东西也会多一些,生活也就会过得更有意义一点。
      今天学习了反射中的装饰者设计模式、动态代理;注解中的内置注解、自定义注解、元注解。
      明天继续努力。
知识点总结
思维导图

课堂代码

  • 装饰者设计模式
  //1,定义装饰类(增强类)实现和被装饰类(被增强类)相同的接口
  public class UserDaoWrapper implements UserDao {
  
  //    2,在装饰类中声明被装饰类的引用
      private UserDao userDao ;
  
      public UserDaoWrapper(){
      }
      public UserDaoWrapper(UserDao userDao) {
          this.userDao = userDao;
      }
  
      @Override
      public void addUser() {
          System.out.println("权限校验");
          userDao.addUser();
          System.out.println("日志记录");
      }
  
      @Override
      public void deleteUser() {
          userDao.deleteUser();
      }
  
      @Override
      public void updateUser() {
          userDao.updateUser();
      }
  
      @Override
      public void selectUser() {
        
         userDao.selectUser();
      }
  }


  • Proxy动态代理
    • 方式一:定义类实现InvocationHandler接口
  public static void main(String[] args) {
  
          UserDao userDao = new UserDaoImpl();//被代理类对象
          UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
                  userDao.getClass().getClassLoader(),
                  userDao.getClass().getInterfaces(),
                  new MyInvocationHandler(userDao));
          userDaoProxy.addUser();
          userDaoProxy.deleteUser();
          userDaoProxy.updateUser();
          userDaoProxy.selectUser();
  }
  
  /**
   * 增强代理类
   */
  class MyInvocationHandler implements InvocationHandler{
  
      //声明一个被代理类的引用
      private UserDao userDao;
  
      public MyInvocationHandler(UserDao userDao) {
          this.userDao = userDao;
      }
  
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  //        Method method : 被代理类的原方法
  //        Object[] args :被代理类的方法的实际参数
          //执行被代理类中的原方法
          String methodName = method.getName();
          Object returnValue = null;
          if ("addUser".equals(methodName)) {
              //只有addUser需要增强
              System.out.println("权限校验");
              returnValue = method.invoke(userDao, args);//执行被代理类中的原方法
              System.out.println("日志记录");
          } else {
              //其他的方法不增强
              method.invoke(userDao,args);//执行被代理类中的原方法
          }
  
          return returnValue;
      }
  }

  • 使用InvocationHandler接口的匿名内部类对象
public static void main(String[] args) {
          UserDao userDao = new UserDaoImpl();
          //使用匿名内部类对象
          UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
                  userDao.getClass().getClassLoader(),
                  userDao.getClass().getInterfaces(),
                  new InvocationHandler() {//处理增强
                      @Override
                      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                          String methodName = method.getName();
                          Object returnValue = null;
                          if ("deleteUser".equals(methodName)) {
                              System.out.println("权限校验");
                              returnValue = method.invoke(userDao, args);
                              System.out.println("日志记录");
                          } else {
                              returnValue = method.invoke(userDao, args);
                          }
                          return returnValue;
                      }
                  });
          userDaoProxy.deleteUser();
  
          userDaoProxy.addUser();
      }

发布了62 篇原创文章 · 获赞 0 · 访问量 1978

猜你喜欢

转载自blog.csdn.net/qq_41841482/article/details/105544755