zoukankan      html  css  js  c++  java
  • 反射修改类行为



    • 反射的功能: 我们前面的代码是查看类的功能,除了查看类的功能外,反射还可以修改类的行为
    • BookDao
    public interface BookDao {
      public void insert();
      public void update();
      public void del();
    }
    • BookDaoImpl
    //这么做存在代码重复
    public class BookDaoImpl implements BookDao {
    @Override
    public void insert() {
    try {
    System.out.println("开启会话");
    ////
    System.out.println("插入书籍");
    ///
    System.out.println("事务提交");
    } catch (Exception e) {
    System.out.println("事务回滚");
    e.printStackTrace();
    } finally {
    System.out.println("关闭会话");
    }
    }
    @Override
    public void update() {
    try {
    System.out.println("开启会话");
    ////
    System.out.println("修改书籍");
    ///
    System.out.println("事务提交");
    } catch (Exception e) {
    System.out.println("事务回滚");
    e.printStackTrace();
    } finally {
    System.out.println("关闭会话");
    }
    }
    @Override
    public void del() {
    try {
    System.out.println("开启会话");
    ////
    System.out.println("删除书籍");
    ///
    System.out.println("事务提交");
    } catch (Exception e) {
    System.out.println("事务回滚");
    e.printStackTrace();
    } finally {
    System.out.println("关闭会话");
    }
    }
    }

     在上面代码中存在重复:

    try {
    System.out.println("开启会话");
    ////不同部分
    ///
    System.out.println("事务提交");
    } catch (Exception e) {
    System.out.println("事务回滚");
    e.printStackTrace();
    } finally {
    System.out.println("关闭会话");
    }

    代理

    • 目标类提走重复代码
    public class BookDaoImpl2 implements BookDao {
      @Override
      public void insert() {
        System.out.println("插入书籍");
      }
      @Override
      public void update() {
        System.out.println("修改书籍");
      }
      @Override
      public void del() {
      ////
        System.out.println("删除书籍");
      }
    }
    • 创建代理类
    public class Test02 {
      public static void main(String[] args) {
      //租房子的人
        BookDao target=new BookDaoImpl2();
      //中介
        BookDao bookDao=(BookDao) 
        Proxy.newProxyInstance(Test02.class.getClassLoader(),new Class[]{BookDao.class} , new
        InvocationHandler() {
        @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws
      Throwable {
      //这里放置重复代码
      Object ret=null;
      try {
        System.out.println("============================");
        System.out.println("开启会话");
      ////
        ret= method.invoke(target, args);//让不同代码执行,不同代码再方法中
      ///
        System.out.println("事务提交");
      } catch (Exception e) {
        System.out.println("事务回滚");
        e.printStackTrace();
      } finally {
        System.out.println("关闭会话");
      }
        return ret;
      }
      });
        bookDao.del();
        bookDao.update();
        bookDao.insert();
    }
    }

     

  • 相关阅读:
    redis是什么?
    mysql用户权限设置
    大白话说Java反射:入门、使用、原理 (转)
    iptables只允许指定ip访问本机的指定端口
    CSS系列——前端进阶之路:初涉Less
    MySQL分页查询优化
    linux 面试题
    CSS中定义CLASS时,中间有空格和没空格的区别是什么?
    MySQL Explain详解
    EBS 系统当前完成请求时间监测
  • 原文地址:https://www.cnblogs.com/yuanshuai1026/p/11580625.html
Copyright © 2011-2022 走看看