动态代理 模式 理解

提到动态代理模式,首先要有两个三个基本的元素:

代理对象,被代理对象 ,代理对象和被代理对象  共同的接口。

java 反射包中提供了Proxy.newProxyInstance 来创建代理对象。下面做一个练习,代理一个对象的方法。

首先定义代理对象和被代理对象  共同的接口

package com.nzh.proxy;

public interface IActivityManager {

	int startActivity();
}

真实对象所在类

package com.nzh.proxy;

public class RealObj implements IActivityManager {

	int a = 1;

	@Override
	public int startActivity() {
		System.out.println("真实对象RealObj-->startActivity");
		return 88;
	}

	public void setA(int a) {
		this.a = a;
	}

	public void otherMethod() {
	}

}
创建代理对象:

package com.nzh.proxy;

import java.lang.reflect.Proxy;

public class DemoTest {

	public static void main(String[] args) throws Exception {

		// 首先利用反射包中提供的api创建代理对象
		ClassLoader loader = Thread.currentThread().getContextClassLoader();

		/**
		 * loader:这里传递当前线程的classloader interfaces : 表示代理对象 和 被代理对象 共同的接口 的
		 * Class,Class[] 类型 对象。 h : 回调处理接口
		 */
		Class clazzInterface = Class.forName("com.nzh.proxy.IActivityManager");
		Class[] interfaces = new Class[] { clazzInterface };

		IActivityManager realObj = new RealObj();
		// 生成代理对象
		Object proxy = Proxy.newProxyInstance(loader, interfaces,
				new MyInvocationHandler(realObj));
		// 调用代理对象方法
		IActivityManager proxyObj = (IActivityManager) proxy;
		proxyObj.startActivity();
	}

}

package com.nzh.proxy;

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

public class MyInvocationHandler implements InvocationHandler {
	// 真实对象
	IActivityManager realObj;

	public MyInvocationHandler(IActivityManager realObj) {
		this.realObj = realObj;
	}

	/**
	 * @param proxyObj
	 *            代理对象
	 * @param method
	 *            真实对象 的 方法反射对象
	 * @param arg2
	 *            真实对象 的 方法参数反射对象
	 */
	@Override
	public Object invoke(Object proxyObj, Method method, Object[] arg2)
			throws Throwable {

		String realObjName = method.getName();

		// 此方法会被代理,因为不是 代理对象和被代理对象 共同接口中的方法
		if ("startActivity".equals(realObjName)) {
			interceptMethod();
		}

		return method.invoke(realObj, arg2);
	}

	public void interceptMethod() {
		System.out.println("执行真实对象前,先拦截执行自定义方法。");
		System.out.println("(这里也可以修改真实对象的一些属性...)");
	}
}


测试代理 RealObj 对象的startActivity方法。

运行结果:

执行真实对象前,先拦截执行自定义方法。
(这里也可以修改真实对象的一些属性...)
真实对象RealObj-->startActivity


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值