动态代理Proxy

本文介绍如何使用Java反射API实现动态代理,通过具体示例展示如何为一个目标对象创建代理对象,并在调用其方法前后添加额外的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写生成代理对象的类:

1、定义对象的行为接口


package com.jsecode.esb.web.action;

//1、定义对象的行为接口
public interface Person {
	
	String sing(String name);
	
	String dance(String name);

}

2、定义目标业务对象类

package com.jsecode.esb.web.action;

//2、定义目标业务对象类
public class ZhangYaoYao implements Person {

	@Override
	public String sing(String name) {
		System.out.println("刘德华唱的"+name+"真好听!");
		return "歌唱完了,谢谢大家!";
	}

	@Override
	public String dance(String name) {
		System.out.println("刘德华跳的"+name+"舞真棒!");
		return "舞跳完了,多谢各位观众!";
	}

}

3、创建生成代理对象的代理类

package com.jsecode.esb.web.action;

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

//3、创建生成代理对象的代理类
public class ZhangYaoYaoProxy {

	//设计一个类变量记住代理类要代理的目标对象
	private Person zyy = new ZhangYaoYao();

	public Person getProxy() {
		return (Person) Proxy.newProxyInstance(ZhangYaoYaoProxy.class.getClassLoader(), zyy.getClass().getInterfaces(),
				new InvocationHandler() {
			       /**
		            * InvocationHandler接口只定义了一个invoke方法,因此对于这样的接口,我们不用单独去定义一个类来实现该接口,
			        * 而是直接使用一个匿名内部类来实现该接口,new InvocationHandler() {}就是针对InvocationHandler接口的匿名实现类
			        */
			
			       /**
			        * 在invoke方法编码指定返回的代理对象干的工作
			        * proxy : 把代理对象自己传递进来 
			        * method:把代理对象当前调用的方法传递进来 
			        * args:把方法参数传递进来
			        * 
			        * 当调用代理对象的person.sing("我们结婚吧");或者 person.dance("芭蕾");方法时,
			        * 实际上执行的都是invoke方法里面的代码,
			        * 因此我们可以在invoke方法中使用method.getName()就可以知道当前调用的是代理对象的哪个方法
			        */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// 如果调用的是代理对象的sing方法
						if (method.getName().equals("sing")) {
							System.out.println("我是她的经纪人,要找她唱歌得先找我!");
							// 已经给钱了,经纪人自己不会唱歌,就只能找刘德华去唱歌!
							return method.invoke(zyy, args); // 代理对象调用真实目标对象的sing方法去处理用户请求
						}
						if (method.getName().equals("dance")) {
							System.out.println("我是她的经纪人,要找她跳舞得先找我!");
							return method.invoke(zyy, args);
						}

						return null;
					}
					
				});
	}

}

测试代码:

package com.jsecode.esb.web.action;

public class ProxyTest {

	public static void main(String[] args) {

		ZhangYaoYaoProxy proxy = new ZhangYaoYaoProxy();
		// 获得代理对象
		Person p = proxy.getProxy();
		// 调用代理对象的sing方法
		String retValue = p.sing("我们结婚吧");
		System.out.println(retValue);
		// 调用代理对象的dance方法
		String value = p.dance("芭蕾");
		System.out.println(value);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值