码迷,mamicode.com
首页 > 编程语言 > 详细

Java 动态代理(proxy、invocationHandler)

时间:2015-03-07 17:18:02      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:动态代理   proxy   invocationhandler   java   

首先要明白其中的概念:

**Handler: 处理者。处理业务逻辑等事情。

**Proxy:代理者。交给我来代理,我帮你管理事情,我出面去做本该你做的事情!我是抛头露面的侍者。

 

/*原接口,即将被委托给代理者*/

public interface MyInterface {
	public void execute();
}

/*原接口实现*/
public class MyInterfaceImpl implements MyInterface {
	@Override
	public void execute() {
		System.out.println("execute() be called");
	}
}

创建代理:

 (MyInterface) Proxy.newProxyInstance(
myInterfaceImpl.getClass().getClassLoader(), 

                                myInterfaceImpl.getClass().getInterfaces(),

                                 handler);

Proxy.newProxyInstance(para1,para2,para3)

1.para1 被代理类(原接口实现)的类加载器 classLoader(里面放了一些静态资源.class等等,不详述)

2.para2  被代理类 实现的所有接口

3.para3 (传入了被代理类的 )处理者


这段代码运行后,代理产生,所有对代理的调用将被转发给handler,也就是转发给InvocationHandler接口的实现类。

 (---All method calls to the dynamic proxy are forwarded to thisInvocationHandler implementation)

import java.lang.reflect.Proxy;

public class Client {
	public static void main(String[] args) {
		// 我的接口实现  被代理对象
		MyInterface myInterfaceImpl = new MyInterfaceImpl();
		// 处理者 业务代理类
		BusinessHandler handler = new BusinessHandler(myInterfaceImpl);
		// 代理者  获得代理类($Proxy0 extends Proxy implements MyInterface)的实例.
		MyInterface MyInterfaceProxy = (MyInterface) Proxy.newProxyInstance(
				myInterfaceImpl.getClass().getClassLoader(), myInterfaceImpl.getClass()
						.getInterfaces(), handler);
		MyInterfaceProxy.modify();
	}
}


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/*InvocationHandler 处理者类*/
public class BusinessHandler implements InvocationHandler {
	private Object object = null;

	public BusinessHandler(Object object) {
		this.object = object;
	}

	/**
	 * 
	 * @param proxy  就是代理者, 一般没什么用
	 * @param method  代理者调用的方法,使用了反射机制,可以动态获取该方法的所有信息。
	 * @param args  被调用方法需要的参数(不需要则无所谓)
	 * **/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("do something before method");

		Object ret = method.invoke(this.object, args);

		System.out.println("do something after method");
		return ret;
	}
}


参考链接:

http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html     (反射)

http://hi.baidu.com/malecu/item/9e0edc115cb597a1feded5a0


Java 动态代理(proxy、invocationHandler)

标签:动态代理   proxy   invocationhandler   java   

原文地址:http://blog.csdn.net/lemon89/article/details/44116119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!