java代理模式

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

为什么需要代理模式

比如现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。如何实现?

静态代理


 interface SmsService {
    void send(String message);
}
 class SmsServiceImpl implements SmsService {
    public void send(String message) {
        System.out.println("send message:" + message);
    }
}

class SmsServiceProxy  { 
     private  SmsService smsService;

    public SmsServiceProxy(SmsService smsService) {
        this.smsService = smsService;
    }

    public void send(String message) {
        // beforeDo
        smsService.send("发送短信......");
        //afterDo
    }
}

静态代理是在编译的时候就将实现类和代理类编程了字节码class文件,然后加载到JVM中。

程序员要手动为每一个目标类编写对应的代理类。如果当前系统已经有成百上千个类,工作量太大了。所以,现在我们的努力方向是:如何少写或者不写代理类,却能完成代理功能

AOP就是动态代理的典型应用。

动态代理

关键是要创建代理类的对象,但是又不能直接去定义代理类,似乎和反射有关系,那么怎么拿到代理对象呢?

java代理模式,java,java,代理模式,开发语言

换个角度看对象的创建过程,上图中Class对象就是Class类的实例,它描述类的信息,反射中就可以通过它获得类的属性、方法等。所以能不嫩通过获得Class对象进而获得对应的代理实例呢?

关键使用java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类


 public class Person {

     public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

       Class  proxyClass =  Proxy.getProxyClass(SmsServiceImpl.class.getClassLoader(),SmsService.class);
       //获得构造函数
       Constructor constructor =  proxyClass.getConstructor(InvocationHandler.class);
         //获得代理对象
       SmsService smsService= (SmsService)constructor.newInstance(new InvocationHandler() {
           @Override
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               System.out.println("before");
                Object result = method.invoke(new SmsServiceImpl(),args);
               System.out.println("after");
                return result;
           }
       });
       //调用对应的方法
         smsService.send("你好");
     }
 }

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

public class Person {
    public static void main(String[] args) throws Throwable {
        SmsServiceImpl target = new SmsServiceImpl();
        SmsService smsService = (SmsService) getProxy(target);
        smsService.send("send");

    }

    private static Object getProxy(final Object target) throws Exception {
        Object proxy = Proxy.newProxyInstance(
                target.getClass().getClassLoader(),/*类加载器*/
                target.getClass().getInterfaces(),/*让代理对象和目标对象实现相同接口*/
                new InvocationHandler(){/*代理对象的方法最终都会被JVM导向它的invoke方法*/
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method.getName() + "方法开始执行...");
                        Object result = method.invoke(target, args);
                        System.out.println(result);
                        System.out.println(method.getName() + "方法执行结束...");
                        return result;
                    }
                }
        );
        return proxy;
    }
}

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

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

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

相关文章

  • Java 与设计模式(13):代理模式

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

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

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

    2024年02月07日
    浏览(29)
  • Java中的代理模式(二)JDK动态代理

    大家好👋,我是极客涛😎,上一篇中我们对代理模式有两大类,静态代理和动态代理,对于静态代理相信大家都信手拈来。对于动态代理还有两种实现,一种是java原生的Jdk代理,一种是Cglib方式。因为涉及到源码解读,所以我也将分两期完成,本期主要讲讲JDK动态代理的实

    2024年01月22日
    浏览(31)
  • Java设计模式中的代理模式

    Java设计模式中的代理模式 代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。 代码举例演示 静态代理: 动态代理 区别: 静态代理: 代理类在编译时就已经确定,并且需要为每个被代理的

    2024年01月25日
    浏览(32)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(35)
  • 代理模式(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)
  • Java的代理模式

    java有三种代理模式 静态代理 jdk动态代理 cglib实现动态代理 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。  java的三种代理模式

    2024年02月15日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包