代理设计模式是基于接口的设计,所以在官方给出的Proxy类创建代理对象时都需要传递该对象所有的接口信息。
Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
但是有一部分开发者认为不应该强迫性地基于接口实现代理设计,所以这些人就开发出了一个CGLIB的开发包,利用这个开发包就可以实现基于类的代理设计模式。
1、使用CGLIB实现类代理结构的例子:
package com.mydemo;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 真实主体对象
Message realObject = new Message();
// 负责代理操作的程序类
Enhancer enhancer = new Enhancer();
// 假定一个父类
enhancer.setSuperclass(realObject.getClass());
// 设置代理类
enhancer.setCallback(new MyProxy(realObject));
// 创建代理对象
Message proxyObject = (Message) enhancer.create();
proxyObject.send();
}
}
// 操作类
class Message {
public void send() {
System.out.println("【发送消息】");
}
}
// 代理类(方法拦截)
class MyProxy implements MethodInterceptor {
// 代理类(方法拦截)
private Object target;
/**
* 单参构造方法
*
* @param target
*/
public MyProxy(Object target) {
// 保存真实主题对象
this.target = target;
}
/**
* 代理方法
*
* @return
*/
public boolean connect() {
System.out.println("【消息代理】进行消息发送通道的连接");
return true;
}
/**
* 代理方法
*/
public void close() {
System.out.println("【消息代理】关闭消息通道");
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 真实业务处理结果
Object returnData = null;
// 通道是否连接
if (this.connect()) {
// 调用真实业务
returnData = method.invoke(this.target, objects);
this.close();
}
return returnData;
}
}
运行结果:
【消息代理】进行消息发送通道的连接
【发送消息】
【消息代理】关闭消息通道