
正文
java代理模式代码实现 java中代理模式
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java 代理模式
这种不太像真正的代理模式吧?
倒像是模拟的.
net为代理类Proxy的对象,调用net.browse时首先调用net的check方法进行一些检测之类的工作然后才调用委托对象的browse方法进行真正的业务处理,实际上最后总要执行委托对象指定的方法的.
代理类主要为委托类预处理消息,过滤消息,然后把消息转给委托类以及事后处理等.Proxy类并不真正实现服务的
Java提供的Proxy类和InvocationHandler接口提供生成动态代理类
具体你可以看看java.lang.reflect下的那些类,接口,其实主要还是用到java的反射机制,很简单的.
Real类实现了Network接口,虽然Proxy构造方法参数类型为Network,java中实现了某接口的类都是可以直接转换为接口类型的.
Network real=new Real();
所以可以直接传递一个Real类的实例化对象.
this.network.browse() ; 实际上就是调用Real类的实例化对象的browse方法.
相关问答
Q1: java怎么用代理模式实现多窗口运行
本文实例形式详述了java实现一个程序运行时的启动窗口效果,如常用的microsoft word、 borland jbuilder 等,这样的窗口称为信息窗口。使用信息窗口的好处是可以使用户在等待软件主界面出现前的一段时间中得知软件运行状态。本例将演示如何来实现信息窗口,当打开程序时,信息窗口先显示,并在窗口上倒计时,直到“waiting 0”时,关闭该窗口,显示程序的主窗口。
该功能的主要实现方法如下:
一般来说,大多数的信息窗口是没有标题栏的,因此信息窗口不能由继承jframe 类来实现,一种简单的做法是通过继承jwindow 来实现(当然继承window 类也可以,但一个原则是尽量使用swing 中的界面
类)。另外,本例用到java.awt 包中的mediatracker 类。使用该类的好处是可以更好地管理程序中要使用的图片,同时还可以保证图片和界面同时显示,避免了窗口显示后很久才显示图片的缺点。
具体操作步骤如下:
1.新建一个project,取名为jspleshwindowdemo,其他设置按默认值。
2.新建一个application ,取名为jspleshwindowdemo,主窗口取名为mainframe,主窗口标题取名为jspleshwindowdemo。
3.先来编写信息窗口的代码。新建一个新类spleshwindow.java,继承java.swing.jwindow类。在spleshwindow 类中,定义新的属性,代码如下:
private string statusstr=null; //信息窗口中要显示的信息
private image logoimg=null; //信息窗口中的显示图片
4.向构造方法中添加代码,加载图片并初始化窗体,实现代码如下:
public spleshwindow(jframe owner) { //以jframe 对象为参数,可以是信息窗口和主窗口交互
super( owner );
// 加载图片
logoimg=gettoolkit().getimage( classloader.getsystemresource("images/splesh.jpg") );
// 等待图片加载完成
java.awt.mediatracker tracker=new java.awt.mediatracker( this ); //创建一个mediatracker 对象
tracker.addimage( logoimg , 0 ); //将图片放入mediatracker 对象中,序号为0
try{ //等待直到图片加载完成
tracker.waitforall();
}catch ( interruptedexception e ) {
e.printstacktrace();
}
// 设置信息窗体在屏幕上的显示位置
setlocation( gettoolkit().getscreensize().width/2 - logoimg.getwidth(this)/2 , gettoolkit().getscreensize().height/2 -
logoimg.getheight(this)/2 );
setsize( logoimg.getwidth(this) , logoimg.getheight(this) ); // 设置窗口大小
}
5.编写设置显示信息的方法,代码如下:
public void setstatus( string status ){
statusstr=status;
paint( getgraphics() ); // 重画窗口来更新信息窗口中的显示信息
}
6.重置paint()方法来绘制图片和显示信息的方法,代码如下:
public void paint(graphics g) {
/**@todo override this java.awt.component method*/
super.paint(g);
//绘制图片
if ( logoimg!=null )
Q2: Java程序性能优化-代理模式(5)
代理模式( )
在以上代码中 使用CtField make()方法和CtNewMehod make()方法在运行时生成了代理类的字段和方法 这些逻辑由Javassist的CtClass对象处理 将Java代码转换为对应的字节码 并生成动态代理类的实例
注意 与静态代理相比 动态代理可以很大幅度地减少代码行数 并提升系统的灵活性
在Java中 动态代理类的生成主要涉及对ClassLoader的使用 这里以CGLIB为例 简要阐述动态类的加载过程 使用CGLIB生成动态代理 首先需要生成Enhancer类实例 并指定用于处理代理业务的回调类 在Enhancer create()方法中 会使用DefaultGeneratorStrategy Generate()方法生成动态代理类的字节码 并保存在byte数组中 接着使用ReflectUtils defineClass()方法 通过反射 调用ClassLoader defineClass()方法 将字节码装载到ClassLoader中 完成类的加载 最后使用ReflectUtils newInstance()方法 通过反射 生成动态类的实例 并返回该实例 无论使用何种方法生成动态代理 虽然实现细节不同 但主要逻辑都如图 所示
图 实现动态代理的基本步骤
前文介绍的几种动态代理的生成方法 性能有一定差异 为了能更好地测试它们的性能 去掉DBQuery类中的sleep()代码 并使用以下方法测试
public static final int CIRCLE= ;
public static void main(String[] args) throws Exception {
IDBQuery d=null;
long begin=System currentTimeMillis()
d=createJdkProxy() //测试JDK动态代理
System out println( createJdkProxy: +(System currentTimeMillis() beg in))
System out println( JdkProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJdkProxy: +(System currentTimeMillis() begin ))
begin=System currentTimeMillis()
d=createCglibProxy() //测试CGLIB动态代理
System out println( createCglibProxy: +(System currentTimeMillis() b egin))
System out println( CglibProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callCglibProxy: +(System currentTimeMillis() beg in))
begin=System currentTimeMillis()
d=createJavassistDynProxy() //测试Javaassist动态代理
System out println( createJavassistDynProxy: +(System currentTimeMil lis() begin))
System out println( JavassistDynProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistDynProxy: +(System currentTimeMilli s() begin))
begin=System currentTimeMillis()
d=createJavassistBytecodeDynamicProxy() //测试Javassist动态代理
System out println( createJavassistBytecodeDynamicProxy: +(System cu rrentTimeMillis() begin))
System out println( JavassistBytecodeDynamicProxy class: +d getClass()
getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistBytecodeDynamicProxy: +(System curr entTimeMillis() begin))
}
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj/201311/27830
Q3: Java代理的作用和实现?
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
java代理模式代码实现的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中代理模式、java代理模式代码实现的信息别忘了在本站进行查找喔。







