Java反射机制剖析:简单谈谈动态代理

简介:

通过《Java反射机制剖析:定义和API》和《Java反射机制剖析:功能以及举例》的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制。

  1、代理模式

  代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途。

  它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

  2、分类

  代理类按照创建时期可以分为两种,静态代理类和动态代理类。

  静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

  动态代理类:在程序运行时,运用反射机制动态创建而成。

  3、静态代理和动态代理举例

  静态代理:

  业务接口类:

  1. package com.bjpowernode.pattern;  
  2. public interface UserManager {  
  3.     public void addUser(String userId, String userName);  
  4.       
  5.     public void delUser(String userId);  
  6.       
  7.     public void modifyUser(String userId, String userName);  
  8.       
  9.     public String findUser(String userId);  
  10. }

  业务接口实现类:

  1. package com.bjpowernode.pattern;  
  2. public class UserManagerImpl implements UserManager {  
  3.     public void addUser(String userId, String userName) {  
  4.         //System.out.println("start-->>addUser() userId-->>" + userId); 
  5.         try {  
  6.             System.out.println("UserManagerImpl.addUser() userId-->>" + userId);  
  7.               
  8.             //System.out.println("success-->>addUser()"); 
  9.         }catch(Exception e) {  
  10.             e.printStackTrace();  
  11.             //System.out.println("error-->>addUser()"); 
  12.             throw new RuntimeException();  
  13.         }     
  14.     }  
  15.     public void delUser(String userId) {  
  16.         System.out.println("UserManagerImpl.delUser() userId-->>" + userId);  
  17.     }  
  18.     public String findUser(String userId) {  
  19.         System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
  20.         return "张三";  
  21.     }  
  22.     public void modifyUser(String userId, String userName) {  
  23.         System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId);  
  24.     }  
  25. }



  业务代理类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. public class UserManagerImplProxy implements UserManager {  
  4.  
  5.     private UserManager userManager;  
  6.       
  7.     public UserManagerImplProxy(UserManager userManager) {  
  8.         this.userManager = userManager;  
  9.     }  
  10.       
  11.     public void addUser(String userId, String userName) {  
  12.         try {  
  13.             System.out.println("start-->>addUser() userId-->>" + userId);  
  14.             userManager.addUser(userId, userName);  
  15.             System.out.println("success-->>addUser()");  
  16.         }catch(Exception e) {  
  17.             e.printStackTrace();  
  18.             System.out.println("error-->>addUser()");  
  19.         }     
  20.     }  
  21.  
  22.     public void delUser(String userId) {  
  23.  
  24.     }  
  25.  
  26.     public String findUser(String userId) {  
  27.         return null;  
  28.     }  
  29.  
  30.     public void modifyUser(String userId, String userName) {  
  31.  
  32.     }  
  33. }

  客户端类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. public class Client {  
  4.  
  5.     /**  
  6.      * @param args  
  7.      */ 
  8.     public static void main(String[] args) {  
  9.         //UserManager userManager = new UserManagerImpl();  
  10.         UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());  
  11.         userManager.addUser("0001""张三");  
  12.     }  
  13.  
  14. }

  运行结果:

  1. start-->>addUser() userId-->>0001 
  2. UserManagerImpl.addUser() userId-->>0001 
  3. success-->>addUser()

  动态代理:

  业务接口类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. public interface UserManager {  
  4.  
  5.       
  6.     public String test(String userId);  
  7. }

  业务接口实现类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. public class UserManagerImpl implements UserManager {  
  4.  
  5.     public String test(String userId) {  
  6.         System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
  7.         return "张三";  
  8.     }  
  9.  
  10. }


BusinessHandler类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.  
  7. public class BusinessHandler implements InvocationHandler {  
  8.       
  9.     private Object targetObject;  
  10.       
  11.     public Object newProxyInstance(Object targetObject) {  
  12.           
  13.         this.targetObject = targetObject;  
  14.         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
  15.                                targetObject.getClass().getInterfaces(), this);  
  16.     }  
  17.       
  18.     public Object invoke(Object proxy, Method method, Object[] args)  
  19.             throws Throwable {  
  20.         System.out.println("start-->>" + method.getName());  
  21.         for (int i=0; i<args.length; i++) {  
  22.             System.out.println(args[i]);  
  23.         }  
  24.         Object ret = null;  
  25.         try {  
  26.             //调用目标方法  
  27.             ret = method.invoke(targetObject, args);  
  28.             System.out.println("success-->>" + method.getName());   
  29.         }catch(Exception e) {  
  30.             e.printStackTrace();  
  31.             System.out.println("error-->>" + method.getName());  
  32.             throw e;  
  33.         }  
  34.         return ret;  
  35.     }  
  36.  
  37. }

  客户端类:

  1. package com.bjpowernode.pattern;  
  2.  
  3. import java.lang.reflect.Field;  
  4.  
  5.  
  6. public class Client {  
  7.  
  8.     /**  
  9.      * @param args  
  10.      */ 
  11.     public static void main(String[] args) {  
  12.           
  13.         BusinessHandler businessHandler = new BusinessHandler();  
  14.         UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl());  
  15.           
  16.           
  17.           
  18.         //userManager.addUser("0001", "张三");  
  19.         //userManager.delUser("0001");  
  20.        // System.out.println(userManager.getClass().getName());  
  21.           
  22.         String name = userManager.test("0001");  
  23.     //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001");  
  24.         System.out.println("Client.main() --- " + name);  
  25.     }  
  26.  
  27. }

  运行结果:

  1. start-->>test  
  2. 0001 
  3. UserManagerImpl.findUser() userId-->>0001 
  4. success-->>test  
  5. Client.main() --- 张三


本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/
目录
相关文章
|
12天前
|
Java API 数据安全/隐私保护
探索Java动态代理的奥秘:JDK vs CGLIB
动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。
43 0
探索Java动态代理的奥秘:JDK vs CGLIB
|
2月前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
2月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
98 20
|
2月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
149 1
|
2月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
74 2
|
2月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
3月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
167 6
|
2月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
88 4
|
2月前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
59 3
|
3月前
|
Java API 数据库
Java 反射机制:动态编程的 “魔法钥匙”
Java反射机制是允许程序在运行时访问类、方法和字段信息的强大工具,被誉为动态编程的“魔法钥匙”。通过反射,开发者可以创建更加灵活、可扩展的应用程序。
81 2