zoukankan      html  css  js  c++  java
  • [置顶] 动态代理

    什么是动态代理:

    代理:代理模式是常用的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

     

    代理类
    public class LogHandler implements InvocationHandler {
    	
    	private Object targetObject;
    	
    	public Object newProxyInstance(Object targetObject) {
    		this.targetObject = targetObject;
    		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
    							   targetObject.getClass().getInterfaces(), this);
    	}
    	
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {
    		System.out.println("start-->>" + method.getName());
    		for (int i=0; i<args.length; i++) {
    			System.out.println(args[i]);
    		}
    		Object ret = null;
    		try {
    			//调用目标方法
    			ret = method.invoke(targetObject, args);
    			System.out.println("success-->>" + method.getName()); 
    		}catch(Exception e) {
    			e.printStackTrace();
    			System.out.println("error-->>" + method.getName());
    			throw e;
    		}
    		return ret;
    	}
    
    }
    
    接口类
    public interface UserManager {
    
    	public void addUser(String userId, String userName);
    }
    
    目标类
    package com.bjpowernode.pattern;
    
    public class UserManagerImpl implements UserManager {
    
    	public void addUser(String userId, String userName) {
    		//System.out.println("start-->>addUser() userId-->>" + userId);
    		try {
    			System.out.println("AddUser" );
    }
    	}
    }
    
    客户端
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		LogHandler logHandler = new LogHandler();
    		UserManager userManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());
    		String name = userManager.AddUser("0001",”张三”);	}
    
    }
    

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

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

       

    哪些地方需要动态代理:

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



  • 相关阅读:
    GIT初探
    IIS7添加虚拟目录映射另一台服务器的共享文件夹
    The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF
    asp.net编码解码的两篇文章
    生成网站时提示 已预编译此应用程序
    错误 1 无法将程序集“NBear.Data.dll”复制到文件“D: ewbpmpmSureBpmBinNBear.Data.dll”。无法将“D: ewbpmpmSureSoft.WebServiceBaseLibinDebugNBear.Data.dll”添加到网站。 无法添加文件“BinNBear.Data.dll”。 拒绝访问。 D:..
    从Script到Code Blocks、Code Behind到MVC、MVP、MVVM(转载)
    HTML form表单的默认提交方式
    webapp检测手机运动方向,可实现手机摇一摇功能的触发
    手机/P各种提示框整合,纯js实现,比前端大多数框架的提示消息更好用
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3292150.html
Copyright © 2011-2022 走看看