

————— 第二天 —————








————————————











public interface IStudentService { void insertStudent (); void deleteStudent ();} public class StudentService implements IStudentService { public void insertStudent (){ //添加学生 } public void deleteStudent (){ //删除学生 }}


public class StudentService implements IStudentService { public void insertStudent (){ System.out.println( "准备添加学生" ); //添加学生 System.out.println( "添加学生成功" ); } public void deleteStudent (){ System.out.println( "准备删除学生" ); //删除学生 System.out.println( "删除学生成功" ); }}








public class StudentServiceProxy implements IStudentService { IStudentService studentService; public StudentServiceProxy (IStudentService studentService){ this .studentService = studentService; } @Override public void insertStudent () { System.out.println( "准备添加学生" ); studentService.insertStudent(); System.out.println( "添加学生成功" ); } @Override public void deleteStudent () { System.out.println( "准备删除学生" ); studentService.deleteStudent(); System.out.println( "删除学生成功" ); }}
在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。
在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。
这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:
public class Client { public static void main (String[] args) { IStudentService studentServiceProxy = new StudentServiceProxy( new StudentService()); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); }}





以Java语言为例,Java为我们提供了十分方便的创建动态代理的工具包。当我们生成动态代理的时候,我们需要使用到InvocationHandler接口和Proxy类。
具体的实现过程如下:
1.实现InvocationHandler接口,定义调用方法前后所做的事情:
public class MyInvocationHandler implements InvocationHandler { private Object object; public MyInvocationHandler( Object object){ this .object = object; } @Override public Object invoke( Object proxy, Method method, Object [] args) throws Throwable { System.out.println(method.getName() + "方法调用前" ); method.invoke(object, args); System.out.println(method.getName() + "方法调用后" ); return null ; }}
2.通过Proxy类的newProxyInstance方法,动态生成代理对象:
public class Client { public static void main( String [] args) { IStudentService studentService = new StudentService(); InvocationHandler studentInvocationHandler = new MyInvocationHandler(studentService); IStudentService studentServiceProxy = (IStudentService) Proxy .newProxyInstance(studentInvocationHandler.getClass().getClassLoader(), studentService.getClass().getInterfaces(), studentInvocationHandler); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); }}






喜欢本文的朋友,欢迎关注公众号 程序员小灰 ,收看更多精彩内容