Java中的代理模式

这篇具有很好参考价值的文章主要介绍了Java中的代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 静态代理

接口

public interface ICeo {

    void meeting(String name) throws InterruptedException;
}

目标类

public class Ceo implements ICeo{

    public void meeting(String name) throws InterruptedException {
        Thread.sleep(2000);
        System.out.println("和"+name+"谈成了34亿的项目");
    }
}

代理类

public class CeoProxy implements ICeo{

    private Ceo ceo;

    public CeoProxy(Ceo ceo) {
        this.ceo = ceo;
    }

    @Override
    public void meeting(String name) throws InterruptedException {

        System.out.println("秘书登记来访: "+name);
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ceo.meeting(name);
        stopWatch.stop();
        double totalTimeMillis = stopWatch.getTotalTimeSeconds();
        System.out.println("耗时: "+totalTimeMillis);

    }
}

测试

public class CeoTest {

    public static void main(String[] args) throws InterruptedException {
        Ceo ceo = new Ceo();
        CeoProxy ceoProxy = new CeoProxy(ceo);
        ceoProxy.meeting("XXX");

    }
}

2. JDK动态代理

接口

public interface IDao {

    void select();
}

目标类

public class UserDao implements IDao{
    @Override
    public void select() {
        try {
            Thread.sleep(2000);
            System.out.println("select ----");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

动态代理类
Java中的代理模式,java,代理模式,开发语言

public class JdkProxy implements InvocationHandler {

    private Object target;

    public JdkProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        StopWatch stopWatch = new StopWatch();
        System.out.println("前置方法");
        stopWatch.start();
        Object obj = method.invoke(target, args);
        stopWatch.stop();
        System.out.println("后置方法");
        System.out.println("耗时: "+stopWatch.getTotalTimeSeconds());
        return obj;
    }
}

测试

public class DaoTest {

    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        IDao dao = (IDao) Proxy.newProxyInstance(UserDao.class.getClassLoader(), UserDao.class.getInterfaces(), new JdkProxy(new UserDao()));
        dao.select();
    }
}

总结:

  1. 动态生成代理类
  2. 通过实现接口生成代理类(目标接口必须实现接口)
  3. 代理类是实现接口的方式
  4. 调用目标类使用反射调用
  5. 目标类调用本类方法只会代理一次

3. CGLib动态代理

Java中的代理模式,java,代理模式,开发语言

目标类

public class ZlmDao {

    public void select(){
        try {
            Thread.sleep(2000);
            System.out.println("select ---");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

代理类

public class CglibProxy implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        System.out.println("前置增强");
        Object result = proxy.invokeSuper(obj, args);
        stopWatch.stop();
        System.out.println("后置增强");
        System.out.println("耗时: "+stopWatch.getTotalTimeSeconds());
        return result;
    }
}

测试

public class ZlmDaoTest {
    public static void main(String[] args) {
        //实例化增强器
        Enhancer enhancer = new Enhancer();
        //设置需要代理的目标类
        enhancer.setSuperclass(ZlmDao.class);
        //设置拦截对象回调的实现类
        enhancer.setCallback(new CglibProxy());
        //生成代理类
        ZlmDao zlmDao = (ZlmDao) enhancer.create();
        zlmDao.select();
    }
}

总结文章来源地址https://www.toymoban.com/news/detail-610691.html

  1. 通过ASM第三方框架动态代理
  2. 无需接口(final修饰的类和方法除外)
  3. 代理类通过继承目标类的方式实现代理
  4. 调用目标类,使用子类调用父类的方式直接调用
  5. invokeSuper目标类中调用本类方法会再次代理
  6. incoke目标类中调用本来方法只会调用一次

到了这里,关于Java中的代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java代理模式——静态代理与动态代理

    代理模式允许你为其他对象提供一个代理,以控制对这个对象的访问。代理模式在不改变实际对象的情况下,可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身,调用者可以通过这个替身去实现这个被代理对象的功能,这个替身也可以为被

    2024年02月13日
    浏览(36)
  • 【Java设计模式005】代理模式

    由于一些特定原因某些对象不适合或者不能直接引用目标对象,这时就可以使用代理模式。代理模式为目标对象提供一个代理以控制访问对象对目标对象的访问。客户端只能直接访问代理对象,不能直接访问目标对象,这么做确保了目标对象的安全。生活中一个常见的例子就

    2024年02月12日
    浏览(32)
  • Java设计模式(十三)代理模式

    一、概述 代理模式是一种结构型设计模式,它提供了一个代理对象,充当被代理对象的接口,以控制对被代理对象的访问。代理模式可以在不修改被代理对象的情况下,增加额外的功能或控制访问方式。 二、代码 以下是一个示例代码,说明代理模式的使用: 在上述代码中,

    2024年02月04日
    浏览(25)
  • Java设计模式---单例 工厂 代理模式

    单例模式是设计模式中的一种,属于创建型模式。在软件工程中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁实例化然后引用,且创建新实例的开销较大的类,例如数据库连接池、缓存管理等。 意图 :保证一个类仅有一个实例

    2024年01月24日
    浏览(39)
  • Java 与设计模式(13):代理模式

    代理模式是一种结构型设计模式,用于在访问对象时引入一个代理对象,以控制对实际对象的访问。代理对象充当了客户端和实际对象之间的中介,客户端通过代理对象间接地访问实际对象,从而可以在访问过程中添加额外的逻辑或控制。代理模式可以提供对实际对象的保护

    2024年02月09日
    浏览(28)
  • 基于Java的设计模式 - 代理模式

    代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。简单来讲就是在不修改目标对象的基础上,增强主业务逻辑的设计模式。 代理模式基本可分为三种 静态代理 JDK动态代理 CGLIB动态代理 上述简单分就是静态和动态代理,静

    2024年02月07日
    浏览(29)
  • 代理模式(Java实现)

    代理模式是常见的设计模式之一,顾名思义,代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。(为真实对象提供代理,然后供其他对象通过代理访问真实对象) 分为 静态代理 动态代理 jdk动态代理

    2024年02月12日
    浏览(29)
  • Java 代理模式详解

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real

    2024年02月06日
    浏览(19)
  • Java研学-代理模式

    1 分类   静态代理:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。(代理类及对象要自行创建)   动态代理:代理类是在程序运行期间由 JVM 通过反射等机制动态的生成的,不存在代理类的字节码文件,动态生成字节码对

    2024年01月25日
    浏览(31)
  • java代理模式

    比如现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。如何实现? 静态代理是在编译的时候就将实现类和代理类编程了字节码class文件,然后加载到JVM中。 程序员要手动为每一个目标类编写对应的代理类。如果当前系统已经有成百上千个类,工作量太大了。

    2024年02月13日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包