JDK动态代理模式这篇就够了

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理) 房屋中介代理:客户手里没有房源信息,找一个中介商品代购:这些代购者可以去哪到比较低成本的商品,拥有自己的渠道代理模式(Proxy Pattern):是 23 中设计模式中的一种,属于结构型的模式。指一个对象本身不做实际的操作,而是通过其他对象来得到自己想要得到的结果。**意义:**目标对象只需要关心自己的实现细节,通过代理对象来实现功能的增强,可以扩展目标对象的功能。体现了非常重要的编程思想:不能随便修改源码,通过修改代理的方式来实现功能的扩展。 阅读详情

JDK动态代理

第一章 代理的介绍

介绍:我们需要掌握的程度

动态代理(理解) 基于反射机制

掌握的程度:

1.什么是动态代理?

2.动态代理能够做什么?

1.1 什么是代理

  • 代理,在我们日常生活之中就有体现,代购,中介,换ip,商家等等.

  • 比如有一家美国的大学,可以对全世界招生.留学中介(代理 )

  • 留学中介(代理):帮助这家美国的学校招生,中介是学校的代理中介是代替学校完成招生功能

  • 代理特点

    1. 中介和代理他们要做的事情是一致的:招生
    2. 中介是学校代理,学校是目标
    3. 家长-------->中介(学校介绍,办理入学手续)---------->美国学校
    4. 中介是代理,不能白干活,需要收取费用
    5. 代理不让你访问到目标

1.2 为什么要找中介

为什么要找中介?
1.中介是专业的,方便.
2.家长现在不能自己去找学校。家长没有能力访问学校.或者美国学校不接收个人来访

买东西都是商家卖, 商家是某个商品的代理, 你个人买东西,肯定不会让你接触到厂家的.

1.3 代理在开发中的应用

1.你有a类,本来是调用c类的方法,完成某个功能。但是c不让a调用。

​ a——不能调用c的方法

​ 在a和c直接创建一个b代理,c让b访问

​ a——访问b——访问c

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5t7z5Hp-1648124617810)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324103732980.png)]

2.实际例子:登录,注册有验证码,验证码是手机短信

​ 中国移动、联通能发短信

​ 中国移动联通有子公司或者关联公司,他们面向社会提供短信的发送功能

3.张三项目发送短信——子公司或者关联公司——中国移动、联通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMAmvfki-1648124617811)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324103923767.png)]

第二章 静态代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2P1WTaWK-1648124617811)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324104224384.png)]

2.1 实现静态代理的方式

2.1.1 静态代理

1)代理类是自己手工实现的,自己创建一个java类,表示代理类

2)同时你所要代理的目标

  • 特点:1.实现简单

​ 2.容易理解

  • 案例一:模拟一个用户购买u盘的行为。

    用户:客户端类
    商家:代理,代理某个品牌的u盘。
    厂家:目标类。
    三者的关系:用户(客户端)-—-商家(代理)-—-厂家(目标)
    商家和厂家都是卖u盘的,他们完成的功能是一致的,都是卖u盘。

2.1.2 实现步骤

1.创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情
2.创建厂家类,实现1步骤的接口
3.创建商家,就是代理,也需要实现1步骤中的接口
4.创建客户端类,调用商家的方法买一个u盘

2.3 具体实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-omhUDZHI-1648124617812)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324111535407.png)]

1.创建一个接口,定义卖u盘的方法,表示厂家和商家做的事情

package com.gz.service;

public interface UsbSell {
    /**
     * 定义一个方法 参数 amount:表示一次购买的数量,暂时不用
     * 返回值表示一个u盘的价格
     * @param
     * @return
     */
    float sell(int amount);
}

2.创建厂家类,实现1的接口

package com.gz.factory;

import com.gz.service.UsbSell;

//目标类:金士顿厂家,不接受用户的单独购买
public class UsbKinFactory implements UsbSell {

    @Override
    public float sell(int count) {
        //一个128G的U盘是85元.
        //后期根据amount,可以实现不同的价格,例如10000个,单价是80,50000个75
        return 85.0f;
    }
}

3.创建商家(代理),也需要实现1接口

package com.gz.shangjia;

import com.gz.factory.UsbKinFactory;
import com.gz.service.UsbSell;
//淘宝是一个商家,代理金士顿U盘的销售
public class TaoBaoKin implements UsbSell {
    //      声明 商家代理的厂家具体是谁
    private UsbKinFactory factory = new UsbKinFactory();
    //    实现销售U盘功能
    @Override
    public float sell(int amount) {
        //    向厂家发送订单,告诉厂家,我买了U盘,厂家发货
        //    发送给工厂,我需要的订单,返回报价
        float money = factory.sell(amount);
        //        商家需要加价也就是代理要增加价格
        money = money + 20;
        //在目标类的方法调用后,你做的其他功能,都是增强的意思
        System.out.println("给用户一个返现红包");
        //功能增强,商家加价卖出,或者给用户返现红包
        return money;
    }
}

4.创建客户类,调用商家的方法买U盘

package com.gz;

import com.gz.shangjia.TaoBaoKin;
import com.gz.shangjia.WeiShang;

public class Main {

    public static void main(String[] args) {
   // write your code here
        //             创建代理的商家淘宝对象
        TaoBaoKin taoBaoKin = new TaoBaoKin();
        //        我只向淘宝买一件产品,得到报价
        float money = taoBaoKin.sell(1);
        System.out.println("淘宝买一个金士顿U盘价格:"+money);

        WeiShang weiShang = new WeiShang();
        float sell = weiShang.sell(1);
        System.out.println("微商买一个金士顿U盘价格:"+sell);

    }
}

2.4 使用代理的作用

  1. 功能增强:在你原有的功能上,增加了额外的功能.新增加的功能,叫做功能增强
  2. 控制访问:代理类不让你访问目标,例如商家不让用户访问厂家

2.5静态代理的优缺点

  • 优点:

    1. 实现简单
    2. 容易简单
  • 缺点:当你的项目中,目标类的代理类很多的时候,有一下的缺点

    1. 当目标类增加了,代理类可能也需要成倍的增加

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BUP9M6lk-1648124617813)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324112348643.png)]

    2. 当你的接口中功能在增加了,或者修改了,会影响众多的实现类,厂家类,代理都需要修改,影响比较多.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2Zpdibs-1648124617814)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324112253369.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vO8F9rVw-1648124617816)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324112423290.png)]

第三章 动态代理

2.1 静态和动态模式的对比

在静态代理中目标很多的时候,可以使用动态代理,避免静态代理的缺点

在静态代理中目标类很多时候,可以使用动态代理,避免静态代理的缺点。

  • 动态代理的特点:

    1. 动态代理中目标类即使很多,代理类数量可以很少
    2. 当你修改了接口中的方法时,不会影响代理类。
  • 动态代理的作用:

在程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类。换句话说:动态代理是一种创建java象的能力,让你不用创建 TaoBao类就能创建代理类对象,除去了中间商,在java中,要想创建对象就必须:

  1. 创建类文件,java 文件编译为class
  2. 使用构造方法,创建类的对象

2.2 动态代理的介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKQcbMDD-1648124617817)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324184245436.png)]

  1. 动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。
  2. 动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。
  3. 动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

动态代理的实现:

  1. jdk动态代理(理解):使用java反射包中的类和接口实现动态代理的功能,反射包java.lang.reflect,里面有三个类:InvocationHandler,Method,Proxy
  2. cglib动态代理(了解): cglib是第三方的工具库,创建代理对象
    1. cglib的原理是继承,cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改。
    2. 因为cglib是继承,重写方法,所以要求目标类不能是fina1的,方法也不能是final的。cglib的要求目标类比较宽松,只要能继承就可以了。cglib在很多的框架中使用,比如mybatis,spring框架中都有使用。

2.3 JDK动态代理

jdk动态代理:
1.反射, Method类,表示方法。类中的方法。通过Method可以执行某个方法

2.jdk动态代理的实现
反射包java.lang. reflect,里面有三个类:InvocationHandler,Method,Proxy

2.3.1 Interface InvocationHandler
public interface InvocationHandler

InvocationHandler是由代理实例的调用处理程序实现的接口 。
每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。

1)InvocationHandler接口(调用处理器):就一个方法 invoke()
​ invoke():表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。

  • 代理类完成的功能
    1. 调用目标方法,执行目标方法的功能
    2. 功能增强,在目标方法调用时,增加功能

方法原型:

参数:object proxy:jdk创建的代理对象,无需赋值。
                Method method:目标类中的方法,jdk提供method对象的
                object[]args:目标类中方法的参数,jdk提供的。
Object invoke(Object proxy,方法 method,Object[] args)throws 
    
    Throwable处理代理实例上的方法调用并返回结果。
2.3.2 Method类

2)Method类:表示方法的,确切的说就是目标类中的方法。
作用:通过 Method可以执行某个目标类的方法, method. invoke(目标对象,方法的参数);

object ret= method. invoke(service22,"李四")

说明:method.invoke()就是为了用来执行目标方法的,等同于静态代理中的

   //        向厂家发送订单,告诉厂家,我买了U盘,厂家发货
    //        发送给工厂,我需要的订单,返回报价
            float price = factory.sell(amount);
2.3.3 Proxy类

3)proxy类:核心的对象,创建代理对象。之前创建对象都是new类的构造方法()
现在我们是使用proxy类的方法,代替new的使用。
方法:静态方法 newProxyInstance();
作用:创建代理对象,等同于静态代理中的TaoBao taoBao=new TaoBao()

我们来观察方法原型

    public static Object newProxyInstance( ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)   throws IllegalArgumentException

参数含义:

  1. ClassLoader loader 类加载器,负责向内存中加载对象的,使用反射机制获取对象的ClassLoader,如何获取? 类 a, a.getCalss().getClassLoader(),目标对象的类加载器。

    这里我们细分:每一个类都继承Object类,在Object中有一个getClass方法,表示 类对象的运行时类的Class对象。 而Class类里面有一个public ClassLoader getClassLoader()方法

  2. Class<?>[] interfaces: 接口,目标对象实现的接口,也是反射获取的

  3. InvocationHandler h : 我们自己写的,代理类要完成的功能

返回值:也就是代理对象

第四章 实现动态代理步骤

  1. 创建接口,定义目标类要完成的功能
  2. 创建目标类实现接口
  3. 创建InvocationHandler接口的实现类,在invoke()方法中完成代理类的功能
    1. 调用目标方法
    2. 增强功能
  4. 使用Proxy类的静态方法,创建代理对象,并把返回值转换成接口类型

第一步:创建接口,定义目标所需功能

public interface UsbSell {
    float sell(int amount);
}

第二步:创建目标类实现接口

public class UsbKingFactory implements UsbSell {
    @Override
    public float sell(int amount) {
        System.out.println("目标类中,执行了sell目标方法");
        return 85.02f;
        
    }
}

我们写了接口类,定义了功能,写了代理类,实现了接口功能,按照以前的操作,现在就需要写一个真正的代理类,创建对象.

第三步:创建Invocationhandler实现类

1.调用目标的方法

2.增强功能

public class MyHandle implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return null;
    }
}

我们就在以前代理类的实现方法上进行修改

//之前的代理类
  public class TaoBao implements usbSell {
    //      声明 商家代理的厂家具体是谁
        private UsbKingFactory factory =new UsbKingFactory();

        @Override
    //    实现销售U盘功能
        public float sell(int amount) {
    //        向厂家发送订单,告诉厂家,我买了U盘,厂家发货
    //        发送给工厂,我需要的订单,返回报价
            float price = factory.sell(amount);
    //        商家需要加价也就是代理要增加价格
            price = price + 25;
    //在目标类的方法调用后,你做的其他功能,都是增强的意思
            System.out.println("淘宝再给你返回一个优惠券,或者红包");
    //        增加的价格
            return price;
        }
    }

调用目标的方法

//传入是谁的对象,就给谁创建代理
    public MyHandle(Object target) {
        this.target = target;
    }
invoke里面的设置
                Object res =null;
            //        向厂家发送订单,告诉厂家,我买了U盘,厂家发货
            //        发送给工厂,我需要的订单,返回报价
//            float price = factory.sell(amount);
            res = method.invoke(target,args);       //待执行目标方法,执行后返回值

第四步:创建代理对象,并把返回值转换成接口类型

public class MainShop {
    public static void main(String[] args){ 
//            1.创建对象,使用Proxy
//            2.创建目标对象
        UsbSell factory = new UsbKingFactory();
//        3.创建Invocationhandler对象
        InvocationHandler myHandle = new MyHandle(factory);

//        4.创建代理对象
        UsbSell proxy = (UsbSell) Proxy.newProxyInstance(factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(),
                myHandle);
//        通过代理执行方法
        float price = proxy.sell(1);
        System.out.println("通过动态代理对象,调用方法:" +price);
    }
}

执行成功.和之前动态代理模式一样

第五章 动态代理的执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaxR9YCD-1648124617818)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324192011783.png)]

5.1 执行流程

  1. 当执行poxy.sell(1)时候调用的是哪里呢?是执行我们的proxy在创建时,指定的这个handler他里面的invoke()方法。(handler里面的invoke()方法的形参)此时sell()会赋给method,参数1会赋给args

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HfCKxBt-1648124617819)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324193917141.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9BqH7C3-1648124617819)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324201643212.png)]

  2. 然后就到了invoke()方法里面,之后到了method.invoke(target,args),这里所执行的是目标类的方法,谁把target传给了invoke就执行谁的方法。这里我们传的是目标类,因此他会去调用目标类中的方法,目标类方法执行完成之后会有一个返回值,返回给调用目标类的方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mWR7mUHx-1648124617820)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324201421415.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9RzUga5-1648124617821)(C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20220324201852500.png)]

  3. 然后hadler里面的invoke方法结束之后,会返回一个值给客户端的proxy.sell()方法

5.2 动态代理模板

  1. 创建目标对象 接口类 目标类对象 =new 目标类();
  2. 创建InvocationHandler对象InvocationHandler handler = new MySellHandler(接口类对象);
  3. 创建代理对象接口类 proxy = (接口类) Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(),handler);
  4. 通过代理执行方法proxy.方法();

第六章 项目中的应用

我们需要知道代理能做什么?

在不改变原来目标方法功能的前提下,可以在代理中增强自己的功能代码,程序开发中的意思,

比如:你所在的项目,有一个功能是其他人(公司其他部门,其他小组的人)写好的,你可以使用

//比如,同事开发一个GoNong类
GoNong.class ,
GoNong gn=new GoNong()
    //我们需要增加一个print方法

我们发现这个功能现在还存在缺点,不能完全满足我项目的需要,我需要在print()执行过后,需要自己再增加代理,使用什么方法那,肯定是代理,因为别人不会让我们看源文件

执行步骤:

1.我们先建立一个接口功能,很简单的一个功能

public interface HelloService {
    /**
     * 打印报表,报表
     * @param name
     * @return
     */
    int print (String name);
}

2.我们再加个接口实现类

public class GoNeng implements HelloService {
    @Override
    public int print(String name) {
        System.out.println("其他人写好的这个方法!");
        return 2;
    }
}

3.我们如果相对上述功能进行修改,我们不可能直接去在原方法上进行修改

我们设置一个类来使用这个接口

public class MyApp {
    public static void main(String[] args){
        GoNeng gn = new GoNeng();
        int i = gn.print("nihao1");
        System.out.println("num" +i);

    }
}

问题是如果我们想修改这个功能改怎么办?在不修改源代码的基础上,我们可以创建一个代理类,来增强这个类方法,

3.设置一个代理类实现功能的增强和代理

public class MyInvocationHandler implements InvocationHandler {
    private Object target=null;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        调用目标方法,执行print()得到2
     Object res  =  method.invoke(target,args);  //返回为2的结果
        //我们可以把结果再乘以2
        if (res!=null)
        {
            Integer num  = (Integer) res;
            res = num*2; 
        }

            return null;
    }
}

5.我们仍回到主方法里面进行测试

public class MyApp {
    public static void main(String[] args){
//        GoNeng gn = new GoNeng();
//        int i = gn.print("nihao1");
//        System.out.println("num" +i);
        GoNeng goNeng = new GoNeng();
        InvocationHandler handler = new MyInvocationHandler(goNeng);
        HelloService proxy = (HelloService) Proxy.newProxyInstance(goNeng.getClass().getClassLoader(), goNeng.getClass().getInterfaces(),
                handler);
        int num = proxy.print("市场");
        System.out.println("我们期望得到的 num =="+num);
    }
}

测试System.out.println("动态代理类参数接口"+goNeng.getClass().getInterfaces()[0].getName());

动态代理类参数接口com.rango.service.HelloService
其他人写好的这个方法!
我们期望得到的 num ==4

完结

动态代理,必须要有接口出现,如果没有,我们可以使用cglib实现

GAN网络(论文阅读):Generative Adversarial Nets 当判别器效果比较好时,D(G(z))值为0,则log(1-D(G(z)))值为0,当判别器效果不好,会输出一个大于0 的数,则log(1-D(G(z)))值就为一个负数,在极端情况下,会得到负无穷大,此时判别失误。在价值函数的第二项中存在问题,在早期G比较弱的时,生成的数据和真实数据相差很大,D就容易训练的比较好,很容易区分,就会导致log(1-D(G(z)))变成0 ,这样很难求梯度来优化G,所以更新G时,将优化函数改为log(D(G(z)))。最终使G赢,即G生成的数据D判别不出来。 阅读详情

相关推荐

如何在高版本的ubuntu系统里安装gcc4.1.2

1、下载安装包,一共五个http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-4.1/,根据计算机系统位数   进行下载,64位下载amd64结尾的。开头分别是cpp-4.1_4.1.2、g++-4.1_4.1.2、gcc-4.1-base_4.1.2、gcc-     4.1_4.1.2、libstdc++6-4.1 2、使用sudo d

lsr_fighting的博客 1931

Java代理(带你搞懂JDK代理模式)

什么是代理? 定义:给目标对象提供一个代理对象,并用代理对象控制对目标对象的引用 使用代理目的: ①:功能增强:通过代理业务对原有业务进行增强 ②:控制访问:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性 实现代理的两种方式 一、静态代理 1.静态代理特点 ①:代理类是自己手动实现的,需要自己去创建一个类 ②:代理类所代理的目标类是固定的 2.利用接口实现静态代理 关于接口的方式,我们在实现接口的时候,目标类和代理类都必须实现目标接口当中所实

m0_52012606的博客 2358

SpringBoot+Maven打包实战:把项目变成SDK供其他团队调用

本文详细介绍了如何将SpringBoot项目改造并打包成可被其他项目依赖的SDK。通过调整Maven配置,剥离SpringBoot父依赖与启动类,并定制打包插件,最终生成标准的JAR依赖库,实现从“可执行应用”到“组件化SDK”的优雅转变,便于团队间功能复用。

assembly8low的博客 826

JDK 动态代理模式

动态代理:相比于静态代理来说,动态代理更加灵活。我们不需要针对每个目标类都单独创建一个代理类,并且也不需要我们必须实现接口,我们可以直接代理实现类(CGLIB 动态代理机制)。:用代理对象来代替对真实对象的访问,使得可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能,比如在目标对象的某个方法执行前后增加一些自定义的操作。静态代理:对目标对象的每个方法的增强都是手动完成的,不灵活且麻烦,如果接口一旦新增加方法,目标对象和代理对象都要进行修改,而且需要对每个目标类都单独写一个代理类。

AI 全栈工程师修炼中 413

几何修复_ANSYS流体分析:几何前处理

建模及几何处理工具非常多,选择起来让人眼花缭乱。对于仿真而言,高效的对几何进行清理及生成符合仿真要求的几何至关重要。ANSYS SpaceClaim Direct Modeler是基于直接建模思想的新一代3D高效率建模和几何编辑修补软件。SCDM提供了当今最快速、最富有创意的直接建模解决方案。由于它的直接建模能力即使对于导入的其它3D模型(如catia、proe、solid works创建的几何)...

weixin_35778830的博客 2416

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

从简入繁详解代理模式(手写JDK动态代理)

1简单概要 代理模式:指为其他对象提供一种代理来控制对这个对象的访问。 代理模式主要有两个目的: ①保护目标对象; ②增强目标对象。 它的类图如下: 2分类与详解 2.1 静态代理 举个栗子:儿子正在找对象,而父母希望儿女早点找到另一半,于是在儿子找对象的同时帮他物色: interface Person{ void findLove(); } public class Son implements Person { public void findLo...

dms2017的博客 1083

热力学仿真软件:Fluent_(13).燃烧与化学反应仿真

燃烧模型在热力学仿真软件中扮演着至关重要的角色。Fluent 提供了多种燃烧模型,包括层流预混燃烧模型、湍流预混燃烧模型、非预混燃烧模型、部分预混燃烧模型等。这些模型可以帮助用户模拟不同的燃烧过程,从而更好地理解燃烧现象和优化燃烧系统设计。

kkchenjj的博客 1252

探究Java spring中jdk代理和cglib代理!

JDK 动态代理是基于接口的代理方式。它通过创建一个实现了目标接口的代理类,并在代理类中实现代理逻辑。代理类在运行时动态生成,并在其中调用原始对象的方法JDK 动态代理通过类和接口来实现。代理对象是在运行时动态生成的。无法代理非公有类:JDK 动态代理不能代理那些声明为 final 的类,因为 final 类不能被继承。另外,由于代理类是在运行时动态生成的,因此也无法代理那些没有默认构造函数的类。方法拦截:代理对象在调用方法时,会将方法调用转发给。

lz17267861157的博客 1751

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1081

Python白色飘雪(完整代码)

Python绘制白色飘雪动画的完整代码。

AIGC 3万+

Java——JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

m0_73671382的博客 7677

Qlib:微软开源的AI量化投资平台 极简入门快速上手教程:使用 Qlib 进行中芯国际股价回测和预测

Qlib是由微软开源的面向AI量化投资的工具包。它提供了构建量化投资模型所需的基础设施,旨在帮助研究者和从业人员更高效地进行量化研究和策略开发。

AI天才研究院 5410

Java两种动态代理JDK动态代理和CGLIB动态代理

目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP...

主要作为个人的笔记用,Not For Everyone。 14万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Spring篇】JDK动态代理

代理类的作用居然是拦截作用,你敢相信?进来看不一样的jdk动态代理,让你从根本上理解动态代理

m0_64231944的博客 3348

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6385

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JDK动态代理模式详解

常用的代理模式有,jdk动态代理s和CGLIB动态代理模式,JDK动态代理是java.lang.reflect.*包提供的方式,它必须提供一个接口才能产生代理对象。 下面讲解jdk动态代理,如下图: 假设有这样一个场景,你的公司是一个软件公司,你是一位软件工程师,客户带着需求过来,显然不会先去直接找你,而是去找一个叫商务对象的人,此时商务就是代理你的人,同时也是与客户交谈的人。 ...

Dream_it_possible!的博客 1533

代理设计模式之JDK动态代理&CGLIB动态代理原理与源码剖析

代理设计模式简介,JDK动态代理简介,原理,CGlib动态代理简单原理与源码剖析

ningkangming的博客 1666

JDK动态代理

代理模式【proxy】是对象的结构模式,代理模式给某一个对象提供一个代理对象,并由代理对象控制对象的引用。代理就是⼀个⼈或者⼀个机构代表另⼀个⼈或者另⼀个机构采取⾏动。在⼀些情况 下,⼀个客户不想或者不能够直接引⽤⼀个对象,⽽代理对象可以在客户端和⽬标对象之间 起到中介作⽤。代理模式的主要⽬标是:保护(隔离)和增强⽬标对象。

qq_59308271的博客 998

深入理解JDK动态代理

深入理解JDK动态代理

abcafdsgr123456789的博客 1835

【动态代理】—— JDK和cglib的动态代理

概述 设计模式中有一个代理模式,它为其他对象提供一种代理以控制对这个对象的访问。 关于代理模式可以参考:【每天一个java设计模式(七)】 - 代理模式:https://blog.youkuaiyun.com/weixin_43598687/article/details/122072282 代理模式是指的静态代理。使用静态代理很容易就完成了对一个类的代理操作。但是静态代理的缺点也暴露了出来:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐。 而动态代理可以在程序运行期间,在不修改源

1+1=王的博客 4463

代理模式:静态代理和动态代理(JDK动态代理原理)

在以上的案例中,明星就是一个被代理类,而代理公司是一个代理类,明星的一些行为只能由公司来调用,而公司可以对明星的行为进行增强。动态代理即运行时动态的生成代理对象,和静态代理在编译时就确定代理对象不同,其灵活度更高,并且耦合度更低,动态代理又分为JDK动态代理和CGLIB动态代理。CGLIB动态代理是基于CGLIB工具类实现的,可以在运行时继承代理类根据代理类的类信息方法等生成代理类,因此被代理类不能被final修饰。我们在测试时是通过生成的代理类也就是上图的类来调用方法的,因此我们需要搞懂这个生成代理类。

m0_71338251的博客 1272

JDK动态代理理解

代理模式说是一种“结构性设计模式” ,其核心思想是通过一个代理对象(proxy)间接访问目标对象(target),从而在不修改对象的前提下,实现对目标对象的控制或者功能增强。抽象角色: 定义目标对象和代理对象的共同接口(如java的接口)真实角色:实现抽象接口的具体业务逻辑类代理对象:持有真实角色的引用,并在其基础上拓展功能(如日志,事务等)举个例子:假设需要租房的时候,租客并不志杰联系房东,而是联系中介。

m0_60963435的博客 1834

Java动态代理之JDK动态代理

在介绍动态代理前,我们需要先搞清楚什么是代理模式。代理模式是一种很常见的设计模式,简而言之就是通过创建一个代理对象,让调用方来访问代理对象,从而实现对真实对象的保护或增强。Spring AOP、Mockito测试框架生成的mock或spy对象都是代理模式的例子。其实,代理并不是一个编程中才有的概念,生活中委托中介帮忙租房子,或者找律师打官司,都可以看作代理模式的应用。这样我们就完成了代理模式的编写,下面可以写个测试类看看效果输出结果为。

weixin_47372115的博客 868

代理模式及Java两种动态代理JDK动态代理和CGLIB动态代理

代理模式 什么是代理模式 代理模式是设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。他在对象B的基础上提供了一层访问控制,当你需要访问对象B时,你需要经过对象B的代理对象A来实现访问。因此代理模式也被称为委托模式,他能够提供非常好的访问控制。 对象A并不提供真正的执行逻辑,而是通过组合B去调用B的目标方法来实现目标逻辑。而A的作用则是在调用B方法的前后提供一些准备和善后的工作。即A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使

XHY的博客 1749

JDK动态代理与CGLIB动态代理

设计模式之代理模式 下面假设一个常见的场景,假如你有一个法国的朋友叫Aice,有一天你想要购买一瓶法国香奈儿的香水,这种香水只在法国销售。你找到你的朋友Alice,请求她帮忙购买一瓶香奈儿的香水,你的朋友Alice于是乎就找到香奈儿的销售店购买了一瓶法国香奈儿的香水,并将香水交给了你。 在上面这个例子当中,你想要购买法国香水,但是无法直接向香奈儿供应商购买,只能通过中间人(Alice)购买,这就是我们生活中比较常见的代理模式。我们假设有一天,你突然想要一瓶法国红酒,但是由于Alice本身并不具备购买红

weixin_43529092的博客 3323
上一篇: Mysql这篇就够了
下一篇: 使用Mybatis这篇就够了
Mixzi
博客等级 码龄7年 17粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值