反射修改类行为
- 反射的功能: 我们前面的代码是查看类的功能,除了查看类的功能外,反射还可以修改类的行为
- 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(); } }