Java动态代理的应用

来源:互联网 发布:星野娜美 知乎 编辑:程序博客网 时间:2024/06/05 05:26

先看一下代理模式,类图(如果要深究java代理是模式,设计的原理比较复杂,建议参考相关书籍和文章,这里不展开阐述)

代理模式类图

  代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调用实际对象的操作

 Java动态代理其实内部也是通过Java反射机制来实现的,即已知的一个对象,然后在运行时动态调用其方法,这样在调用前后作一些相应的处理,这样说的比较笼统,举个简单的例子

   比如我们在应用中有这样一个需求,在对某个类的一个方法的调用前和调用后都要做一下日志操作,

一个普通的接口

  1. public interface AppService {  
  2.       public boolean createApp(String name);  
  3. }  
 

该接口的默认实现类

  1. public class AppServiceImpl implements AppService {  
  2.     public boolean createApp(String name) {  
  3.         System.out.println("App["+name+"] has been created.");  
  4.         return true;  
  5.     }  
  6. }  
 

日志处理器

  1. public class LoggerInterceptor implements InvocationHandler {//注意实现这个Handler接口  
  2.     private Object target;//目标对象的引用,这里设计成Object类型,更具通用性  
  3.     public LoggerInterceptor(Object target){  
  4.         this.target = target;  
  5.     }  
  6.     public Object invoke(Object proxy, Method method, Object[] arg)  
  7.             throws Throwable {  
  8.         System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}");  
  9.         Object result = method.invoke(target, arg);//调用目标对象的方法  
  10.         System.out.println("Before return:"+result);  
  11.         return result;  
  12.     }  
  13. }  

外部调用

  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         AppService target = new AppServiceImpl();//生成目标对象  
  4.         //接下来创建代理对象  
  5.         AppService proxy = (AppService) Proxy.newProxyInstance(  
  6.                 target.getClass().getClassLoader(),  
  7.                 target.getClass().getInterfaces(), new LoggerInterceptor(target));  
  8.         proxy.createApp("Kevin Test");  
  9.     }  
  10. }  

0 0