首页 > 编程知识 正文

动态ip代理和静态ip代理的区别,动态代理底层实现原理

时间:2023-05-03 06:03:15 阅读:131360 作者:4500

静态代理、装饰者模式和动态代理为什么要使用代理?

有些类不能更改。 出于业务需要,需要扩展这个班级的功能。 使用代理模式,可以在保持被代理类不变的情况下控制和扩展被代理类的行为。

##静态代理

定义接口

//接口,规定方法的publicinterfacecar { publicabstractvoiddrive (; }定义被代理类

导入域. car; /**被代理类,实现接口* */publicclassbenchiimplementscar { @ overridepublicvoiddrive (} system.out.println (启动速度快' ); }定义代理类

/**代理类* */publicclassbenchiproxyimplementscar { privatecarbenchi; //在无参数构造函数中,使用代理对象public BenchiProxy () { this.benchi=new Benchi ); } @Override public void drive (() { System.out.println ) )百公里加速5s ); benchi.drive (; }调用

publicclassbenchitest { publicstaticvoidmain (字符串[ ] args ) benchiproxybenchiproxy=newbenchiproxy ); benchiProxy.drive (; }结果

百公里加速5s起步速度快!##装饰者模式

定义接口

//接口,规定方法的publicinterfacecar { publicabstractvoiddrive (; }定义装饰类

/* *被装饰系统,实现接口* */publicclassbenchiimplementscar { @ overridepublicvoiddrive (} system.out.println ) (启动速度快! ' ); }定义装饰类

/**装饰类* */publicclassbenchiproxyimplementscar { privatecarbenchi; //在参与式生成器中,代理对象publicbenchiproxy(carbenchi ) { this.benchi=benchi; } @Override public void drive (() { System.out.println ) )百公里加速5s ); benchi.drive (; }调用

publicclassbenchitest { publicstaticvoidmain (字符串[ ] args ) { Benchi benchi=new Benchi ) ); benchiproxybenchiproxy=newbenchiproxy (benchi ); benchiProxy.drive (; }} 静态代理类和装饰者模式之间的共同点

1 .均实现与目标类相同的业务接口

2 .两个类中的生命目标对象(被代理和装饰对象)。

3 .都不修改目标类而使用方法静态代理类和装饰者模式之间的不同点

1 .目的差异:静态代理(装饰者为了增强目标对象)重点保护和隐藏目标对象

2 .获取目标对象的方法不同

装饰者中目标对象的获取在通过参与结构器传递的静态代理中,是在没有参数的构造函数之间创建的,指定不能直接更改。

3 .增强权能的实现就是这一区别。

装饰装修模型中存在装饰装修基类,它不是强化的,而是由具体的装饰装修人员强化的,所有的装饰装修链条都存在;

在静态代理中,一般不存在父子类关系,具体扩展由代理类实现,其子类不需要完成,因此不存在链的概念。

##动态代理

重点还是与动态代理的应用和理解,java提供Proxy类帮助动态代理实现,实现也很简单。 不需要创建代理类,只需要已知的被代理类和被代理类的实现接口。

存在为对象提供代理对象并控制对原始对象的引用的代理对象; 被当成代理人的对象很难直接得到,或者不想暴露在客户面前。

不需要在编译时重写代理类,而是在运行时动态创建被代理类的代理对象package com.atguigu.java; import Java.lang.reflect.invocation handler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //接口接口human { string get belief (; 语音(string food; //被代理类classsupermanimplementshuman { @ overridepublicstringgetbelief (} { return ' ibelieveicanfzdsmt!' ; } @ overridepublicvoideat (string food ) { System.out.println )我喜欢吃) food。 }}class ProxyFactory{ //使用此方法可以生成代理类对象publicstaticobjectgetproxyinstance (objectobj )//返回代理对象myinvocationhandlermyinvocationhance myinvocationhandler.bind (obj ) return proxy.newproxyinstance (obj.ggind ) obj.getclass ).getInterfaces ), my invocation } classmyinvocationhandlerimplementsinvocationhandler {//当我们通过代理类的对象调用方法a时,将自动调用以下方法invoke 为代理类执行的方法a的功能为invoke ) )命名。公共语音绑定(objectobj ) { this.obj=obj; } @ overridepublicobjectinvoke (对象代理,方法方法,对象[ ] args ) throwsthrowable )/method:由代理对象调用} publicclassproxytest { publicstaticvoidmain (string [ ] args ) superman=newsuperman ); //代理类对象humanproxyinstance=(human ) proxy factory.getproxy instance (superman ); //调用代理类方法时,调用被代理类方法proxyInstance.getBelief (; 代理实例. eat ('麻辣烫); }其中

Proxy.newProxyInstance创建ITeacher对象,其参数解释如下:

类加载器加载器,类加载器。 被代理类的类加载器。

Class? [ ]接口,由代理类实现的接口,该接口可以有多个。

InvocationHandler

h,绑定代理类的方法。 每当代理类调用其中一个方法时,都会相应地调用h(invocationhandler ) invoke方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。