深入浅出 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静态代理和动态代理

首先介绍一下,什么是代理:   代理模式,是常用的设计模式。特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类。以及事后处理消息。   代理类和委托类,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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