深入浅出 java动态代理

转载 2013年12月02日 13:31:24

什么是动态代理:

代理:代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

动态代理的具体实现:


相关类与借口:

java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。 
	// 方法:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
	static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。 
	调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行
	Object invoke(Object proxy, Method method, Object[] args)

Demo


[java] view plaincopy
  1. 代理类  
  2. public class LogHandler implements InvocationHandler {  
  3.       
  4.     private Object targetObject;  
  5.       
  6.     public Object newProxyInstance(Object targetObject) {  
  7.         this.targetObject = targetObject;  
  8.         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
  9.                                targetObject.getClass().getInterfaces(), this);  
  10.     }  
  11.       
  12.     public Object invoke(Object proxy, Method method, Object[] args)  
  13.             throws Throwable {  
  14.         System.out.println("start-->>" + method.getName());  
  15.         for (int i=0; i<args.length; i++) {  
  16.             System.out.println(args[i]);  
  17.         }  
  18.         Object ret = null;  
  19.         try {  
  20.             //调用目标方法  
  21.             ret = method.invoke(targetObject, args);  
  22.             System.out.println("success-->>" + method.getName());   
  23.         }catch(Exception e) {  
  24.             e.printStackTrace();  
  25.             System.out.println("error-->>" + method.getName());  
  26.             throw e;  
  27.         }  
  28.         return ret;  
  29.     }  
  30.   
  31. }  
[java] view plaincopy
  1. 接口类  
  2. public interface UserManager {  
  3.   
  4.     public void addUser(String userId, String userName);  
  5. }  
[java] view plaincopy
  1. 目标类  
  2. package com.bjpowernode.pattern;  
  3.   
  4. public class UserManagerImpl implements UserManager {  
  5.   
  6.     public void addUser(String userId, String userName) {  
  7.         //System.out.println("start-->>addUser() userId-->>" + userId);  
  8.         try {  
  9.             System.out.println("AddUser" );  
  10. }  
  11.     }  
  12. }  
[java] view plaincopy
  1. 客户端  
  2. public class Client {  
  3.   
  4.     /** 
  5.      * @param args 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         LogHandler logHandler = new LogHandler();  
  9.         UserManager userManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());  
  10.         String name = userManager.AddUser("0001",”张三”); }  
  11.   
  12. }  

动态代理与静态代理的区别:

    由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。

   

哪些地方需要动态代理:

    不允许直接访问某些类;对访问要做特殊处理等。或者,要对原方法进行统一的扩展,例如加入日志记录。

转载至:http://blog.csdn.net/cjl5678/article/details/10586645

深入浅出 java动态代理

什么是动态代理: 代理:代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 动态代理的具...
  • CJL5678
  • CJL5678
  • 2013年08月30日 11:44
  • 11829

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理:   代理模式,是常用的设计模式。特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类。以及事后处理消息。   代理类和委托类,...
  • zc474235918
  • zc474235918
  • 2015年07月25日 22:05
  • 1828

热修复——深入浅出原理与实现

一、简述热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就...
  • CSDN_LQR
  • CSDN_LQR
  • 2017年11月14日 19:28
  • 2616

深入浅出 java动态代理

什么是动态代理: 代理:代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 动态代理的具...
  • CJL5678
  • CJL5678
  • 2013年08月30日 11:44
  • 11829

Java深入浅出系列(三)——深入剖析动态代理--性能比较

动态代理是指在运行时,动态生成代理类。代理类的字节码将在运行时生成并载入当前的ClassLoader.          生成动态代理类的方法很多,如JDK自带的动态代理、CGLIB、Javas...
  • wanglha
  • wanglha
  • 2015年06月29日 09:34
  • 345

Java动态代理(JDK和cglib)

  • 2017年07月04日 21:10
  • 246KB
  • 下载

JAVA反射机制和动态代理PDF

  • 2012年12月13日 14:55
  • 263KB
  • 下载

java动态代理

  • 2012年04月30日 21:04
  • 2KB
  • 下载

java 动态代理 简单实例

  • 2011年12月24日 13:52
  • 6KB
  • 下载

java动态代理

  • 2012年10月06日 10:37
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入浅出 java动态代理
举报原因:
原因补充:

(最多只允许输入30个字)