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();
    }
    }

     

  • 相关阅读:
    vmware导出为ovf
    华三接入交换机推荐
    mysql root情况
    ospf精确宣告地址
    kubernetes k8s yum localinstall
    js判断邮箱、用户名、手机号码和电话号码是否输入正确?
    如何修改Oracle中表的字段长度?
    mybatis与hibernate区别
    SSM框架的优势?
    SSH框架的优势?
  • 原文地址:https://www.cnblogs.com/yuanshuai1026/p/11580625.html
Copyright © 2011-2022 走看看