Java静态代理、动态代理实例
采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
一、静态代理类实例:
1、Serivce.java
Java代码
1. package 2. 3. /** 4. * 定义一个服务接口 5. * @author IBM 6. */ 7. public interface 8. 9. /** 10. * 查询日期 11. */ 12. public 13. /** 14. * 计算两个整数之差 15. */ 16. public int sub(int a, int 17. }
2、ServiceImpl.java
Java代码
1. package 2. 3. import 4. 5. /** 6. * 委托类需要实现服务接口(必须) 7. * @author IBM 8. */ 9. public class CountImpl implements 10. 11. @Override 12. public 13. return new 14. } 15. 16. @Override 17. public int sub(int a, int 18. return 19. } 20. 21. public void 22. "It's my own method"); 23. } 24. }
3、ServiceProxy.java
Java代码
1. package 2. 3. import 4. import 5. 6. /** 7. * @author IBM 8. * 静态代理类 9. */ 10. public class SerivceProxy implements 11. private 12. 13. public 14. this.countImpl = countImpl; 15. } 16. 17. @Override 18. public 19. return 20. } 21. 22. @Override 23. public int sub(int a, int 24. return 25. } 26. 27. public void 28. "It's my own method"); 29. } 30. }
4、ServiceTest.java(测试类)
Java代码
1. package 2. 3. import 4. import 5. 6. public class 7. 8. /** 9. * @param args 10. */ 11. public static void 12. //创建委托类实例,即被代理的类对象 13. new 14. //创建静态代理类 15. new 16. String date = proxy.queryDate(); 17. System.out.println(date); 18. int result = proxy.sub(10, 20); 19. "10-20 = "+result); 20. proxy.ownMethod(); 21. } 22. }
静态代理类的特点: 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。
动态代理实例:
3、ServiceProxy.java
Java代码
1. package 2. 3. import 4. import 5. import 6. 7. public class ServiceProxy implements 8. 9. private 10. 11. public 12. this.target = target; 13. } 14. 15. @Override 16. public 17. throws 18. null; 19. result = method.invoke(target, args); 20. return 21. } 22. 23. /** 24. * @param target 25. * @return 返回委托类接口的实例对象 26. */ 27. public 28. return 29. this); 30. } 31. }
4、ServiceTest.java(测试类)
Java代码
1. package 2. 3. import 4. import 5. import 6. 7. public class 8. 9. /** 10. * @param args 11. */ 12. public static void 13. //创建委托类实例,即被代理的类对象 14. new 15. //创建动态代理类 16. new 17. Service service = (Service) proxy.getProxyInstance(); 18. String date = service.queryDate(); 19. System.out.println(date); 20. int result = service.sub(10, 20); 21. "10-20 = "+result); 22. } 23. }
动态代理: 代理类需要实现InvocationHandler接口。
使用场合举例: 如果需要委托类处理某一业务,那么我们就可以先在代理类中,对客户的权限、各类信息先做判断,如果不满足某一特定条件,则将其拦截下来,不让其代理。
修改两个方法,做测试:
ServiceImpl.java
Java代码
1. public 2. "It's my own method"); 3. return "user"; 4. }
ServiceProxy.java
Java代码
1. @Override 2. public 3. throws 4. null; 5. if(!(target instanceof 6. "不能代理该对象"); 7. return 8. else if(!((ServiceImpl)target).ownMethod().equals("admin")){ 9. "权限不够"); 10. return 11. } 12. result = method.invoke(target, args); 13. return 14. }