代码改变世界

静态代理+动态代理

2012-06-14 23:59  翹首、啈福  阅读(1587)  评论(0)    收藏  举报

     初学java,遇到很多问题,其中在处理异常和一些权限的时候就在想是否可以像VS中那样在一个类中写,然后可以很好的控制呢?于是想到了度娘,查找了后找到java的几种代理,分别是静态,动态、AOP等。

  静态代理,其实现原理很简单,就是在每个方法运行前进行一种机制的判断,这样可以依据判断做出相应的处理。源码如下:

  编写一个接口UserManager.java:   

图 1:UserManager接口

  接口实现UserManagerImpl.java:

图 2:Usermanager接口实现

  编写静态代理类UserManagerImplProxy,实现UserManager接口:

图 3:静态代理类

  OK,写到这里,核心代码已写完,现在只需要写一个测试方法,调用即可。但是现在我们可以回头想想这种方法是不是很不灵活,我们的安全性检测需要在每个接口中添加安全性检测方法,这样修改起来很困难,不过,这也符合它的名称-静态代理,因此不宜改动。

  动态代理,其原理就是通过共同的一个方法可以很好的管理其他方法的安全性等,调用其他的方法可以通过它才能到具体的方法实现,其关注的就是在对象中具有相同的部分把她归纳进去,这就是AOP技术采用的核心,相关的术语可以自己去查看Spring的帮助文件或者度娘、谷歌等。

  使用上面的例子这里只需要更改图3为动态代理即可。动态代理需要实现InvocationHandler接口。

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 public class SecurityHandler implements InvocationHandler {
 6 
 7     private Object targetObject;
 8     
 9     /*
10      * 代理类声明
11      * */
12     public Object newProxy(Object targetObject) {
13         this.targetObject = targetObject;
14         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
15                                       targetObject.getClass().getInterfaces(), 
16                                       this);                    
17     }
18     /*
19      * 代理执行前会默认执行invoke方法
20      * */
21     public Object invoke(Object proxy, Method method, Object[] args)
22             throws Throwable {
23         checkSecurity();
24         Object ret = null;
25         try {
26             ret = method.invoke(this.targetObject, args);
27         }catch(Exception e) {
28             e.printStackTrace();
29             throw new java.lang.RuntimeException(e);
30         }
31         return ret;
32     }
33     /*
34      * 安全性检测
35      * */
36     private void checkSecurity() {
37         System.out.println("----------checkSecurity()---------------");
38     }    
39 }

 

前端调用方法测试:

 图 4:动态代理测试结果

 ------------------------------------------------------------------------------------------------------------------------------------------------

                                                          第一次写,欢迎点评……