您的位置:首页 > 编程语言 > Java开发

Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)

2015-07-07 16:18 597 查看
静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理可以对任何实现某一接口的类进行功能性增强。
在java中动态代理由InvocationHander来实现。

HelloInterface接口

[java] view
plaincopy

package proxy;



public interface HelloInterface {

public void sayHello();

}

实现HelloInterface接口的类HelloInterfaceImpl



[java]
view
plaincopy

package proxy;



public class HelloInterfaceImpl implements HelloInterface {



@Override

public void sayHello() {

System.out.println("Hello xianjj");

}



}

proTest类实现了InvocationHandler类

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 实现InvocationHandler接口
public class proTest implements InvocationHandler {

	Object anyObject;
	
	// 申明bind方法
	public Object bind (Object anyObject){
		this.anyObject = anyObject;
		return Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
	}
	// 重写invoke方法
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] args)
			throws Throwable {
		Object returnObject = null;
		System.out.println("动态代理开始");
		returnObject = arg1.invoke(anyObject, args);
		System.out.println("动态代理结束");
		return returnObject;
	}

	public static void main(String[] args) {
		proTest proTest = new proTest();
		HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());
		helloInterfaceReturn.sayHello();
	}
}
在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定,动态代理主要由以下代码来实现

Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
将输入的anyObject对象与接口进行动态关联,这样就可以避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口,软件的灵活性大大的提高。

当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包含代理类proTest的InvocationHandler的invoke方法中执行相应的代码,动态代理的过程结束。

public class proTest implements InvocationHandler类不在服务于某一个接口,静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。Spring认为那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,而且与Spring的其他模块进行整合开发时会更有集中性。

结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: