上一篇:静态代理设计模式 | 带你学《Java语言高级特性》之九十五
【本节目标】
本节介绍了利用第三方包--CGLIB开发包来实现代理设计模式。
CGLIB实现代理设计模式
从Java的官方来讲,已经明确的要求了如果想要实现代理设计模式,那么一定是基于接口的应用,所以在官方给出的Proxy类创建代理对象时,都需要传递该对象所有的接口信息:
Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
但是这个时候有一部分开发者就认为不应该强迫性的基于接口实现代理设计,所以一部分开发者就开发出了一个CGLIB开发包,利用这个开发包就可以实现基于类的代理设计模式。
1、CGLIB是一个第三方的程序包,需要单独在Eclipse中进行配置,程序包的路径为:D:jar-libcglib-nodep-3.2.6.jar,那么需要打开Eclipse项目属性安装第三方开发包;
2、编写程序类,该类不实现任何接口。
class Message {
public void send() {
System.out.println("【发送消息】www.mldn.cn");
}
}
3、利用CGLIB编写代理类,但是这个代理类需要做一个明确,此时相当于使用了类的形式实现了代理设计的处理,所以该代理设计需要通过CGLIB来生成代理对象,定义一个代理类:
class MLDNProxy implements MethodInterceptor{ //拦截器配置
private Object target; //保存真实主题对象
public MLDNProxy(Object target){
this.target = target;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object returnData = null;
if(this.connect()){
returnData = method.invoke(this.target,args);
this.close();
}
return returnData ;
}
public boolean connect(){
System.out.println("【消息代理】进行消息发送通道的连接。");
return true;
}
public void close(){
System.out.println("【消息代理】关闭消息通道。");
}
}
4、此时如果想创建代理类对象,则就必须进行一系列的CGLIB处理。
public class JavaAPIDemo {
public static void main(String[] args)throws Exception{
Message realObject = new Message(); //真实主体对象
Enhancer enhancer=new Enhancer(); //负责代理操作的程序类
enhancer.setSuperclass(realObject.getClass()); //假定一个父类
enhancer.setCallback(new MLDNProxy(realObject)); //设置代理类
Message proxyObject= (Message) enhancer.create(); //创建代理对象
proxyObject.send();
}
}
在进行代理设计模式定义的时候,除了使用可以接口之外,还可以不受接口限制而实现基于类的代理设计,但从正常的设计角度来讲,强烈建议还是基于接口的设计会比较合理。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学
下一篇:反射取得Annotation信息 | 带你学《Java语言高级特性》之九十七
更多Java面向对象编程文章查看此处