`

Java的动态代理

阅读更多
     代理有很多种表现形式,在Java中可以使用代理将代码分离,把与业务逻辑无关的,但又需要重复使用的代码独立出来,而后通过代理把它注入到业务中,就可以达到代码的重用性和灵活性。

下面举一个简单的日志例子:

1.建立一个接口:
 public interface WorkIf {
        public void doWork(String name);
 }

2.建立两个实现类:
public class WorkImpl implements WorkIf {
       public void doWork(String name) {
              System.out.println(name + " 正在工作w1");
       }
}

public class WorkImpl2 implements WorkIf {
       public void doWork(String name) {
              System.out.println(name + " 正在工作w2");
       }
}

3.建立一个日志类,其中写的就是需要注入的日志内容:
public class LogClass {
       public static void before(){
              System.out.println(" 开始写日志");
       }

       public static void after(){
              System.out.println(" 日志记录完成");
       }
}

4.下面就是最重要的代理类:
public class DPrxoy implements InvocationHandler{
       private Object delegate;
       //返回一个指定接口的代理类实例
        public Object bind(Object delegate){
               this.delegate = delegate;
               return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
        }
         //代理时自动调用的方法
        public Object invoke(Object proxy, Method method, Object[] args)
                       throws Throwable {
               Object result = null;
               LogClass.before();
               result = method.invoke(delegate, args[0]);
               LogClass.after();
               return result;
        }
}

5.下面是一个测试类:
public class Test {
       public static void main(String[] args) {
              DPrxoy proxy = new DPrxoy();
              WorkIf w1 = (WorkIf)proxy.bind(new WorkImpl());
              w1.doWork("admin");

              WorkIf w2 = (WorkIf)proxy.bind(new WorkImpl2());
               w2.doWork("administrator");
       }
}

      在整个流程中都由代理来控制,当我们调用代理的bind方法是,就会返回一个相应的代理类实例,而用这个实例就可以调用相应类的方法。这其中我们可以方便地切换类实例,也就是切换了不同的实现类。而由于在执行代理时会自动执行invoke方法,在invoke方法中又调用了日志类的方法,所以也就相当于在业务逻辑中调用了记录日志的方法。这个过程是由代理来完成的,代理自动把记录日志的功能注入到业务逻辑中,在业务逻辑中不需要关心日志部分的实现,所以无论有多少实现类都可以使用这一个代理。这些实现类都获得了记录日志的功能,但是它们并没有直接去调用日志类的方法,而是通过代理来替他们实现,这就是代码的分离、代码的重用,而且灵活性很好。

    在java中很多地方都可以使用代理,spring框架的ioc就是一个很好的例子。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics