Java动态代理Proxy

本文介绍如何使用Java实现动态代理,包括定义接口、创建接口的具体实现类、编写InvocationHandler的实现类,以及通过Proxy类创建代理对象并调用方法。


接口

package org.leo.proxy;
/**
 * @author Leo.Chen
 */
public interface XiangQin {
	String xiangQin(String guNiang);
}

针对接口的某种具体实现

package org.leo.proxy;
/**
 * realSubject
 */
public class LeoXiangQin implements XiangQin {
	@Override
	public String xiangQin(String guNiang) {
		System.out.println("Leo 和 " + guNiang + " 去相亲了。");
		return "successed! ";
	}
}

实现JDK定义的处理动态代理整个过程的接口

/**
 * 
 */
package org.leo.proxy;

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

/**
 * @author Leo.Chen
 *
 */
public class XiangQinInvocationHandler implements InvocationHandler {
private XiangQin xiangQin;
	public XiangQinInvocationHandler(final XiangQin xiangQin) {
		super();
		this.xiangQin = xiangQin;
	}
	/**
	 * proxy : com.sun.proxy.$Proxy0 代理类
	 * method: 接口中定义的方法对象
	 * args: 接口方法入参
	 * Object: 方法调用返回结果
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		doBefore();
		/*proxy 是代理对象$Proxy0 extends Proxy implements XiangQin的类,
		 * 如果proxy cast为XiangQin,
		 * 然后执行接口method,将会出现死循环
		 */
		/**
		 * 为什么出现死循环?
		 * 动态代理类$Proxy0调用execute方法时会调用$Proxy0它自己的xiangQin方法
		 * 而它自己的execute方法里面调用的是super.h.invoke(this,method,args),
		 * 也就是父类Proxy的h(InvocationHandler)的invoke方法,
		 * 即XiangQinInvocationHandler的invoke方法,方法中不断的重复调用自己
		 */
		/*((XiangQin)proxy).execute("美女");*/
		System.out.println("proxy:"+proxy.getClass().getCanonicalName());
		System.out.println("method:"+method.getName()+",returnType:"+method.getReturnType().getCanonicalName());
		/*result为方法调用返回结果*/
		Object result = method.invoke(xiangQin, args);
		System.out.println("result's type :"+result.getClass().getCanonicalName());
		doAfter();
		return result;
	}
	protected void doBefore(){
		System.out.println("before:相亲之前打扮自己。");
	}
	protected void doAfter(){
		System.out.println("after:相亲成功了。");
	}
}


代理工具类

package org.leo.proxy;

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

public class ProxyXiangQin {

	public static void main(String[] args) {
	     /** 
         * 在java种怎样实现动态代理呢 
         * 第一步,我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象, 
         * 所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。 
         * 第二步,我们要自己写一个在要代理类的方法执行的前后可以做额外工作的类,而这个类必须继承InvocationHandler接口, 
         * 为什么要继承它呢?因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法, 
         * 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。 
         * 第三步,在要用代理类的实例去调用实现类的方法的时候,写出下面两段代码。 
         */ 
		XiangQin qin = new LeoXiangQin();
		InvocationHandler handler = new XiangQinInvocationHandler(qin);
		XiangQin proxy = (XiangQin) Proxy.newProxyInstance(qin.getClass().getClassLoader(), qin.getClass().getInterfaces(), handler);
		String result = proxy.execute("美女");
		System.out.println("result:"+result);
	}


参考文章:
http://www.iteye.com/topic/683613

MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值