动态代理 Proxy InvocationHandler学习

来源:互联网 发布:网络教育几月份报名 编辑:程序博客网 时间:2024/04/30 02:37

该实例是模拟安全性检查

 

被代理对象接口定义

Java代码  收藏代码
  1. public interface UserManager {  
  2.     public void aadUser(User user);  
  3.     public void deleteById(int id);  
  4.     public void updateUser(User user);  
  5.     public User findById(int id);  
  6. }  

 

被代理对象接口实现

Java代码  收藏代码
  1. public class UserManagerImp implements UserManager {  
  2.     @Override  
  3.     public void aadUser(User user) {  
  4.         System.out.println("----------addUser------------");  
  5.     }  
  6.     @Override  
  7.     public void deleteById(int id) {  
  8.         System.out.println("----------deleteById------------");  
  9.     }  
  10.     @Override  
  11.     public User findById(int id) {  
  12.         System.out.println("----------findById------------");  
  13.         return null;  
  14.     }  
  15.     @Override  
  16.     public void updateUser(User user) {  
  17.         System.out.println("----------updateUser------------");  
  18.     }  
  19. }  

 

 定义一个user对象

Java代码  收藏代码
  1. public class User {  
  2.     private int id;  
  3.     private String name;  
  4.     private int age;  
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.     public void setName(String name) {  
  9.         this.name = name;  
  10.     }  
  11.     public int getAge() {  
  12.         return age;  
  13.     }  
  14.     public void setAge(int age) {  
  15.         this.age = age;  
  16.     }  
  17.     public int getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23. }  

 

 继承InvocationHandler接口

Java代码  收藏代码
  1. package hb.proxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. /* 
  8.  * 1、动态代理类一定要实现InvocationHandler接口,就要实现invoke()方法 
  9.  */  
  10. public class SecurityHandler implements InvocationHandler {  
  11.     private Object targetObject;  
  12.     /* 
  13.      * 下面方法是得到代理对象,如果得不到代理对象,这个效果也是没有作用的 
  14.      * 最后一个参数是InvocationHandler接口,这也是为什么动态代理对象一定要实现这个接口的原因 
  15.      * 得到的代理对象会执行invoke()方法 
  16.      */  
  17.     public Object newProxy(Object targetObject){  
  18.         this.targetObject = targetObject;  
  19.         //得到代理对象的方法,这个是反射机制里面的对象方法  
  20.         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
  21.                                       targetObject.getClass().getInterfaces(),  
  22.                                       this);  
  23.     }  
  24.     /* 
  25.      * 在代理对象之前做业务处理,然后再做对象定义的方法,因此最后要返回代理的对象 
  26.      */  
  27.     @Override  
  28.     public Object invoke(Object proxcy, Method method, Object[] args)  
  29.             throws Throwable {  
  30.         if("aadUser".equals(method.getName())){  
  31.             System.out.println("method is aadUser");  
  32.             checkSecurity();  
  33.         }else{  
  34.             System.out.println("method is nod aadUser");  
  35.         }  
  36.         return method.invoke(this.targetObject, args);  
  37.     }  
  38.       
  39.     public void checkSecurity(){  
  40.         System.out.println("-----------checkSecurity()----------");  
  41.     }  
  42. }  

 

 

 测试代码

主函数代码  收藏代码
  1. public class TestMain{  
  2.     public static void main(String[] args) {  
  3.         //产生一个安全代理的对象方法  
  4.         SecurityHandler handler = new SecurityHandler();  
  5.         //得到一个已经被代理的对象  
  6.         UserManager userManager = (UserManager)handler.newProxy(new UserManagerImp());  
  7.           
  8.         User user = new User();  
  9.         user.setAge(23);  
  10.         user.setId(1);  
  11.         user.setName("huangbiao");  
  12.         //被代理对象做数据业务之前会先调用invoke()方法  
  13.         userManager.aadUser(user);  
  14.     }  
  15. }  

转载自:http://hbiao68.iteye.com/blog/1335809



0 0
原创粉丝点击