当前位置:首页 > CN2资讯 > 正文内容

浅谈Java动态代理java 动态代理

2天前CN2资讯


动态代理其本质是设计模式中的代理模式,主要由抽象角色、代理角色和真实角色组成:

  • 抽象角色(Subject):声明真实对象和代理对象的共同接口,这样可在任何使用真实对象的地方都可以使用代理对象。
  • 代理角色(Proxy):代理对象内部含有真实对象的引用,从而可以在任何时候操作真实对象。代理对象提供一个与真实对象相同的接口,以便可以在任何时候替代真实对象。代理对象通常在客户端调用传递给真实对象之前或之后,执行某个操作,而不是单纯地将调用传递给真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
  • 真实角色(RealSubject):即为代理对象所代表的目标对象,代理角色所代表的真实对象,是我们最终要引用的对象。

其中,Subject角色负责定义RealSubject和Proxy角色应该实现的接口;RealSubject角色用来真正完成业务服务功能;Proxy角色负责将自身的request请求,调用RealSubject对应的request功能来实现业务功能,自己不真正做业务。

静态代理

以下是Java静态代理的实现代码。

//抽象角色
interface Subject{
public void doSomething();
}
//真实角色
class RealSubject implements Subject{
public void doSomething() {
System.out.println( "call doSomething()" );
}
}
//代理角色
class SubjectProxy implements Subject{
//代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
Subject subimpl = new RealSubject();
public void doSomething(){
System.out.println("before"); //调用目标对象之前可以做相关操作
subimpl.doSomething();
System.out.println("after");//调用目标对象之后可以做相关操作
}
}

public class Test{
public static void main(String[] args) throws Exception {
Subject sub = new

可以看到,SubjectProxy实现了Subject接口(和RealSubject实现相同接口),并持有的是Subject接口类型的引用。这样调用的依然是doSomething方法,只是实例化对象的过程改变了,结果来看,代理类SubjectProxy可以自动为我们加上了before和after等我们需要的动作。

但是静态代理有一个缺点,如果将来需要实现一个新的接口,就需要在代理类里再写该接口的实现方法,对导致代理类的代码变得臃肿;另一方面,当需要改变抽象角色接口时,无疑真实角色和代理角色也需要改变。而动态代理可以解决上述问题。

动态代理

interface Subject
public void doSomething();
}
class RealSubject implements Subject
public void doSomething() {
System.out.println( "call doSomething()" );
}
}
class ProxyHandler implements InvocationHandler{
private Object tar;
//绑定委托对象,并返回代理类
public Object bind(Object tar) {
this.tar = tar;
//绑定该类实现的所有接口,取得代理类
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy , Method method , Object[] args)throws Throwable//不依赖具体接口实现
{
Object result = null;//被代理的类型为Object基类
//这里就可以进行所谓的AOP编程了
//在调用具体函数方法前,执行功能处理
result = method.invoke(tar,args);
//在调用具体函数方法后,执行功能处理
return result;
}
}
public class Test{
public static void main(String args[]) {
ProxyHandler proxy = new ProxyHandler();
//绑定该类实现的所有接口
Subject sub = (Subject) proxy.bind(new

在调用过程中使用了通用的代理类包装了RealSubject实例,然后调用了Jdk的代理工厂方法实例化了一个具体的代理类。最后调用代理的doSomething方法,还有附加的before、after方法可以被任意复用(只要我们在调用代码处使用这个通用代理类去包装任意想要需要包装的被代理类即可)。当接口改变的时候,虽然被代理类需要改变,但是我们的代理类却不用改变了


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24808.html

    分享给朋友:

    “浅谈Java动态代理java 动态代理” 的相关文章

    NameSilo优惠码:轻松节省域名注册与续费费用

    NameSilo优惠码有哪些? NameSilo提供了多种优惠码,帮助用户在注册或续费域名时节省费用。比如,新用户可以使用“NEWUSER10”享受10%的折扣,而“SAVE20”则对所有用户开放,提供20%的折扣。如果你在注册或续费.com域名,可以尝试使用“FREEDOM”优惠码,只需支付99美...

    RackNerd IP 2024:优化你的VPS选择与网络性能

    RackNerd IP 2024概述 提到RackNerd,很多人可能已经对这家知名的VPS提供商有所耳闻。随着2024年的到来,RackNerd不仅继续以其性价比高、速度快和稳定性良好的服务受到用户的青睐,同时还有了一些新的改进和特色,让我感到很兴奋。这家公司在美国设有多个数据中心,为广大的用户提...

    选择DigitalVirt的KVM VPS服务,体验高性价比与稳定性

    DigitalVirt的成立是在2022年,这让我对他们的新起步感到兴奋。这家国人商家致力于提供高质量的KVM VPS服务,逐渐在市场上赢得了一席之地。就我个人的体验来看,DigitalVirt的使命似乎就是帮助用户实现在线业务的稳定与高效。特别是在快节奏的数字时代,能够找到一个可靠的服务提供商至关...

    AWS VPS Free: 如何利用AWS Free Tier免费服务轻松构建云计算项目

    当我第一次接触AWS (亚马逊网络服务) 的时候,最吸引我的就是他们提供的各种免费的VPS服务。AWS的VPS免费服务实际上是一种叫做AWS Free Tier的计划,它允许用户在一定条件下使用AWS的多种服务而无需支付费用。这项计划的意义在于,它为刚入门的开发者和小型企业提供了一个绝佳的机会,能够...

    联通AS4837线路全面解析:稳定性、覆盖范围与国际连接优势

    联通AS4837线路概述 什么是中国联通AS4837线路? 中国联通AS4837线路,往往被称为中国169骨干网,是一条重要的骨干网线路。这条线路自20世纪90年代始建以来,一直在中国的互联网基础设施中扮演着不可或缺的角色。它不仅在国内广泛布置,还连接着多个国际市场,包括香港、美国、日本和韩国等,形...

    黑五狂欢购物攻略:如何高效享受黑色星期五折扣

    黑五,全称“黑色星期五”(Black Friday),是每年感恩节后的第一天。随着这个节日的到来,许多商店和电商都会推出琳琅满目的促销活动,标志着圣诞购物季的开端。我第一次听到黑五,是在朋友们热火朝天地讨论即将到来的折扣和特卖,这种热情真是难以抗拒。 黑五起源于美国,为什么叫“黑色”呢?这个名字其实...