静态代理设计模式
代理设计模式与真实业务模式两种
传统代理设计模式的弊端
必须基于接口设计,首先定义出核心接口的组成
传统代理设计模式:消息发送的模拟发送代理设计模式
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项目属性安装第三方程序开发包(下载不到,没钱,啥也没有,就不写了)