什么是动态代理

标签:动态代理构造器动态接口

摘要:
我首先想到的是静态代理。动态IP代理动态IP代理意味着代理服务器的IP地址在每次提供代理服务时都会不断变化。目前最典型的动态IP代理是动态转发代理,即旋转代理。动态转发代理将更改分配给用户连接的IP地址,并根据某些标准重新生成端口,以便在每次请求后更改IP。此外,动态转发代理可以自动更改IP地址,以避免繁琐的手动操作。
要说动态代理,必须先聊聊静态代理。

静态代理

假设现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。

你如何在不修改已有代码的前提下,完成这个需求?

我首先想到的是静态代理。具体做法是:

1.为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口(假设都有)

2.在创建代理对象时,通过构造器塞入一个目标对象,然后在代理对象的方法内部调用目标对象同名方法,并在调用前后打印日志。也就是说,代理对象 = 增强代码 + 目标对象(原对象)。有了代理对象后,就不用原对象了

静态代理的缺陷

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

复习对象的创建

很多初学Java的朋友眼中创建对象的过程

实际上可以换个角度,也说得通

所谓的Class对象,是Class类的实例,而Class类是描述所有类的,比如Person类,Student类

可以看出,要创建一个实例,最关键的就是得到对应的Class对象。只不过对于初学者来说,new这个关键字配合构造方法,实在太好用了,底层隐藏了太多细节,一句 Person p = new Person();直接把对象返回给你了。我自己刚开始学Java时,也没意识到Class对象的存在。

分析到这里,貌似有了思路:

能否不写代理类,而直接得到代理Class对象,然后根据它创建代理实例(反射)。

Class对象包含了一个类的所有信息,比如构造器、方法、字段等。如果我们不写代理类,这些信息从哪获取呢?苦思冥想,突然灵光一现:代理类和目标类理应实现同一组接口。之所以实现相同接口,是为了尽可能保证代理对象的内部结构和目标对象一致,这样我们对代理对象的操作最终都可以转移到目标对象身上,代理对象只需专注于增强代码的编写。还是上面这幅图:

所以,可以这样说:接口拥有代理对象和目标对象共同的类信息。所以,我们可以从接口那得到理应由代理类提供的信息。但是别忘了,接口是无法创建对象的,怎么办?

动态代理

JDK提供了java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类,这两个类相互配合,入口是Proxy,所以我们先聊它。

Proxy有个静态方法:getProxyClass(ClassLoader, interfaces),只要你给它传入类加载器和一组接口,它就给你返回代理Class对象。

用通俗的话说,getProxyClass()这个方法,会从你传入的接口Class中,“拷贝”类结构信息到一个新的Class对象中,但新的Class对象带有构造器,是可以创建对象的。打个比方,一个大内太监(接口Class),空有一身武艺(类信息),但是无法传给后人。现在江湖上有个妙手神医(Proxy类),发明了克隆大法(getProxyClass),不仅能克隆太监的一身武艺,还保留了小DD(构造器)...(这到底是道德の沦丧,还是人性的扭曲,欢迎走进动态代理)

所以,一旦我们明确接口,完全可以通过接口的Class对象,创建一个代理Class,通过代理Class即可创建代理对象。

大体思路

静态代理

动态代理
所以,按我理解,Proxy.getProxyClass()这个方法的本质就是:以Class造Class。

有了Class对象,就很好办了,具体看代码:

完美。

根据代理Class的构造器创建对象时,需要传入InvocationHandler。每次调用代理对象的方法,最终都会调用InvocationHandler的invoke()方法:

怎么做到的呢?

上面不是说了吗,根据代理Class的构造器创建对象时,需要传入InvocationHandler。通过构造器传入一个引用,那么必然有个成员变量去接收。没错,代理对象的内部确实有个成员变量invocationHandler,而且代理对象的每个方法内部都会调用handler.invoke()!InvocationHandler对象成了代理对象和目标对象的桥梁,不像静态代理这么直接。

大家仔细看上图右侧的动态代理,我在invocationHandler的invoke()方法中并没有写目标对象。因为一开始invocationHandler的invoke()里确实没有目标对象,需要我们手动new

其他答案

动态IP
动态IP与静态IP相对,它并不是一个真实的IP地址,而是经由服务器自动分配给用户的一个地址。每次用户连接网络时,服务器都会随机为用户分配一个IP地址。
由于IP地址资源十分宝贵,静态IP多用于企业等大型客户,所以大部分用户目前使用的都是动态IP。不过动态IP也有其局限性,例如有可能会出现IP冲突的情况,导致用户无法正常上网。
动态IP代理
动态IP代理指代理服务器每次在提供代理服务的过程中IP地址不断变化,目前最典型的动态IP代理就是动态转发代理,也就是旋转代理。
动态转发代理会改变分配给用户连接的IP地址,并根据一些标准来重新生成端口,从而实现IP在每个请求后的改变。并且动态转发代理可以自动改变IP,避免用户进行繁琐的手动操作。

怎样通过拨号ADSL获得动态IP

你可以使用宽带拨号上网,它占用的资源很少。您还可以记录在线时间,随时显示您的IP,并自动拨打Internet下载地址:http://www.netwiser.cn/

什么是动态IP,什么是静态IP? 家里用笔记本上网自己买一个无线路由器就可以用笔记本的无线上网了吗?

笔记本电脑可以通过无线网卡将无线路由器连接到互联网。首先,无线路由器可以确保外部连接。然后,在路由器中设置无线连接。请记住设置密码权限,否则将被窃取。然后,单击笔记本电脑网络连接中的无线连接以查找路由器的连接。身份验证后,您可以联机。通常,有一本手册,可以根据需要进行培养。。

关于动态IP和外网IP的问题 高手来!

PPPOE拨号的动态IP用户在外部网络中。您在IP138上看到的IP是外部网络的IP。这两个问题的其他答案都是外部的

游戏里全是用的九州动态IP,这个到底怎么样呀?

1.该号码既不是计算机,也不是IP地址。想想如何密封它。谁敢大老远跑到你家来做事。

怎样让ADSL拨号动态IP变为固定的

你似乎不能,因为你必须在拨号时申请地址,但你不能保证你上次使用的地址此时没有使用。其他答案没有多大意义。我只能说你无法实现它们。

拨号VPS有什么优势

拨号vp是动态IP。每次拨号时,IP都会随机更改。这是他的优点和缺点。有些组需要随机IP替换,但有些客户需要固定IP访问,因此这取决于您的要求,然后决定是选择固定IP还是动态IP vp。其他答案软件名称:Rabbit!

什么是动态域名解析?动态域名解析是什么意思

动态域名解析意味着什么?IP地址分配有两种类型:静态和动态。通常,用作服务器的计算机的IP地址是静态的(固定的),因为它为用户提供服务。为什么?动态DNS服务是一种可以实时对应(解析)固定Internet域名和动态(非固定)IP地址的服务。

如何用在自媒体运营中使用动态拨号VPS或代理IP

如果你愿意经营好自己的新媒体,你不仅要保证内容的质量,还要保证粉丝的数量和他们的阅读量。如果你继续这样做,你将获得相关的收入和福利。而且在很多情况下,因为标题可能是内容的一个小问题,帐户可能会被屏蔽,当前的网络IP可能会被网站禁止。此时,迫切需要动态VPS或IP代理资源。

公司网络不稳定,上门维修人说,电脑IP地址动态不稳定要改为静态

该公司的网络一直不稳定。上门维修的网络人员表示,他将把公司的所有地址都改为静态IP地址。动态不稳定。真的是这样吗?中小企业客户网络的不稳定有几个原因。首先,未经许可连接无线路由器的失败是该公司整个大型网络不稳定的重要原因。将所有员工IP地址更改为自动IP地址。如果公司有网络打印机...

如何通过动态拨号vps服务器解决爬虫反爬和IP被封问题

一种常见的基于ADSL的拨号解决方案。通常,如果在提取过程中禁止访问,您可以重新拨打ADSL以获取新的IP地址,以便继续爬网。另一种可能的解决方案也是基于ADSL拨号。区别在于需要两个能够进行ADSL拨号的动态拨号VPS。这两个服务器在提取过程中用作代理。假设有两个服务器A和B可...

如何搭建动态拨号vps

vps设置好后,我们将使用拨号宽带。例如,我们的World Data Dynamic Dialing VPS服务器在VPS的基础上添加了IP变量功能,因此我们可以操作很多事情。客户可以获得不同的IP,不再受IP的限制。动态拨号VPS服务器具有很高的可塑性。有许多方面可以开发和广泛...

动态IP变固定IP,国内IP变海外IP,助力企业数据传输提高工作效率

现在让我们解决这些问题,这样您就可以将动态IP转换为固定IP,将国内IP转换为海外IP使用。因此,我们向客户提供上图所示的解决方案。我们通过客户端的动态IP和我们数据中心之间的隧道获得我们提供的固定IP,并将其用于后面的防火墙中,从而成功解决与香港的内部数据传输。