反射修改类行为



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

 

原文地址:https://www.cnblogs.com/yuanshuai1026/p/11580625.html