黑马程序员技术交流社区

标题: JDK的动态代理讨论 [打印本页]

作者: sixth    时间: 2012-11-6 15:52
标题: JDK的动态代理讨论

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

首先,需要注意的一点便是:使用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的动态代理,并进行了相应的安全性检查。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2