A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sixth 中级黑马   /  2012-11-6 15:52  /  1263 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


我先说下我对动态代理的理解把,大家有不同意见和认识的贴出来,交流一下

首先,需要注意的一点便是:使用JDK的动态代理,必须实现相应的接口。下面以程序为例说明:
1.接口类:
public interface UserManager {
public void save(String username,String password);

public void addUser(String username,String password);

public String getUserName(int id);
}
2.实现类:
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
   // TODO Auto-generated method stub
   System.out.println("-----------------addUser()-------------------");
}
public String getUserName(int id) {
   System.out.println("-----------------getUserName()-------------------");
   return null;
}
public void save(String username, String password) {
   System.out.println("-----------------save()-------------------");
}
}
3.动态代理类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
//生成并返回相应的代理类
public Object newProxy(Object targetObject){
  
   this.targetObject = targetObject;
   return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
           targetObject.getClass().getInterfaces(),
           this);
}
//调用代理类上的方法,但在调用之前要调用InvocationHandler接口的invoke()方法,所以我们
//可以在invoke()方法中调用相应的安全检查方法checkSecurity(),进行相应的安全性检查。
public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
   //调用checkSecurity()进行相应的安全性检查
   checkSecurity();
   Object result = null;
   try{
    result = method.invoke(this.targetObject, args);
   }catch(Exception e){
    e.printStackTrace();
   }
   return result;
}
//安全性检查方法
private void checkSecurity(){
   //进行相应的安全性检查操作
   System.out.println("------------------checkSecurity()-------------------");
}
}
4.调用类:
public class Client {
public static void main(String[] args) {
  
   SecurityHandler sh = new SecurityHandler();
   UserManager us = (UserManager)sh.newProxy(new UserManagerImpl());
  
   us.addUser("lizi", "123456");
}
}
这样就实现了JDK的动态代理,并进行了相应的安全性检查。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马