反射与代理设计模式

静态代理设计模式

代理设计模式与真实业务模式两种

传统代理设计模式的弊端

必须基于接口设计,首先定义出核心接口的组成

传统代理设计模式:消息发送的模拟发送代理设计模式
main的接口与具体的子类产生耦合,客户端需要知道各个子类。
实例开发中最好再引入工厂设计模式

之前的静态代理设计:一个代理类只为一个接口服务。

需要解决的问题:如何让一个代理类满足所有的业务接口操作要求?

动态代理设计模式

重要问题:
代理类需要接收真实业务实现子类对象
动态代理类不与具体接口进行捆绑,应该可以动态接收类的接口信息。(Object类可以实现)

public interface InvocationHandler {
	/**
	 * 代理方法调用
	 * @param proxy	代理对象
	 * @param method	要执行的接口方法的名称
	 * @param args	传递的参数
	 * @return	某方法的返回值
	 * @throws Throwable 方法调用时出现的错误
	 */
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

动态代理设计的底层是由JVM完成的,依靠java.lang.reflect.Proxy类,此类中核心方法:
代理对象:

public static Object newProxyInstance​(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h);
ClassLoader loader:获取当前真是主题类的ClassLoader
Class<?>[] interfaces:代理是围绕接口进行的,获取真是主题类的接口信息
InvocationHandler h:代理处理的方法

范例:实现动态代理机制

package wzr.study10.reflex.proxy;

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

public class MultiTest {

	public static void main(String[] args) {
		IMessage msg= (IMessage) new StudyProxy().bend(new MessageImpl());
		msg.send();
	}

}
class StudyProxy implements InvocationHandler{
	private Object target;
	public Object bend(Object target) {
		this.target=target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	public boolean connect() {
		System.out.println("【代理】connect");
		return true;
	}
	public void close() {
		System.out.println("【代理】close");
	}
	
	public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
		System.out.println("【执行方法】:"+method);
		Object obj=null;
		if(this.connect()) {
			obj = method.invoke(this.target,args);
			this.close();
		}
		return obj;
	}

}
interface IMessage{
	public void send();
}
class MessageImpl implements IMessage{
	@Override
	public void send() {
		System.out.println("send");
	}
}

系统提供的Proxy.newProxyInstance()方法调用大量的底层机制进行代理对象的动态创建。代理类是符合所有功能需求的操作功能类,操作的时候必须结合类加载器和接口实现代理对象的伪造。

CGLIB实现代理设计模式

之前动态代理设计模式是要传入所有的接口getInterfaces()基于接口的代理设计模式
CGLIB为基于类的代理设计模式,它是第三方的程序包,需要单独配置。

于是,需要打开eclipse项目属性安装第三方程序开发包(下载不到,没钱,啥也没有,就不写了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值