当前位置:首页 > CN2资讯 > 正文内容

androidstudio 代理服务器 安卓代理服务

11小时前CN2资讯


android 代理模式 动态代理

代理模式:
代理模式为另一个对象提供一个代理以控制对这个对象的访问,它分动态代理、静态代理。

代理优点:
1、隐藏被代理类的实现;
2、实现与被代理类的解耦,在不修改被代理类代码的情况下能够做一些额外的处理

静态代理:
代理类中的方法,都指定地调用被代理类中对应的方法,代理类所做的事情就是调用触发被代理类中对应的方法
通常情况下,静态代理中的代理类和被代理类会实现同一接口或是派生自相同的父类(静态代理的局限在于运行前必须编写好代理类)
示例:

public interface Sell { void sell(); } public class Vendor implements Sell { public void sell() { System.out.println("sell"); } } public class VendorAgent implements Sell { private Vendor mVendor; //静态代理可以通过聚合来实现,让代理类持有一个被代理类的引用 public VendorAgent(Vendor vendor) { mVendor = vendor; } public void sell() { if(isCollegeStudent()) { mVendor.sell(); } } }

动态代理
代理类在程序运行时创建的代理方式,代理类并不是在Java代码中定义的,而是在运行时根据在Java代码中的“指示”动态生成的。
相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。
它将自己方法功能的实现交给InvocationHandler角色,外界对Proxy角色中每一个方法的调用,Proxy角色都会交给InvocationHandler来处理,
而InvocationHandler则调用被代理类的方法

动态代理的原理:
1、首先通过Proxy的newProxyInstance方法获取代理类实例,
2、而后通过这个代理类实例调用代理类的方法,对代理类的方法的调用实际上都会调用中介类
(调用处理器–实现了InvocationHandler接口的类)的invoke方法,
3、在invoke方法中我们调用被代理类的相应方法,并且可以添加自己的处理逻辑

动态代理模式中代理类的生成步骤:
1、获取被代理类上的所有接口列表;
2、确定要生成的代理类的类名,系统默认生成的名字为:
com.sun.proxy.$ProxyXXXX;
3、根据需要实现的接口信息,在代码中动态创建该代理类的字节码;
4、将对应的字节码转换为对应的Class对象;
5、创建InvocationHandler的实例对象h(用来处理Proxy角色的所有方法调用);
6、以创建的h对象为参数,实例化一个Proxy角色对象

动态代理涉及到:
InvocationHandler接口
Proxy类

InvocationHandler接口:
在使用动态代理时,需要定义一个位于代理类与被代理类之间的中介类,这个中介类要求实现InvocationHandler接口:
public interface InvocationHandler {
Object invoke(Object proxy, Method method, Object[] args); //当调用代理对象上的一个方法,该方法的调用将被编码并转发到它所关联的调用处理程序的方法
}
实现这个接口的中介类用做“调用处理器”,当调用代理类对象的方法时,这个“调用”会转送到invoke方法中,
proxy: 代理类对象
method:标识了具体调用的是代理类的哪个方法,
args:为method方法的参数。
这样一来,对代理类中的所有方法的调用都会变为对invoke的调用,
这样我们可以在invoke方法中添加统一的处理逻辑(也可以根据method参数对不同的代理类方法做不同的处理)

Proxy类newProxyInstance方法来获取一个代理类实例:

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

loader:定义了代理类的ClassLoder;
interfaces:代理类实现的接口列表
h:调用处理器,实现了InvocationHandler接口的代理类实例
函数原型:

public static Object newProxyInstance(ClassLoader loader, Class<?>[]interfaces,InvocationHandler h) throws IllegalArgumentException { if(h == null) { throw new NullPointerException(); } Class cl = getProxyClass(loader, interfaces); //获得与指定类装载器和一组接口相关的代理类类型对象 try{ Constructor cons = cl.getConstructor(constructorParams); //通过反射获取构造函数对象并生成代理类实例 return (Object) cons.newInstance(new Object[] { h }); }catch (NoSuchMethodException e) { throw new InternalError(e.toString()); }catch (IllegalAccessException e) { throw new InternalError(e.toString()); }catch (InstantiationException e) { throw new InternalError(e.toString()); }catch (InvocationTargetException e) { throw new InternalError(e.toString()); } }

Proxy类的getProxyClass()方法调用了ProxyGenerator的generatorProxyClass()方法去生成动态类:

public static void generateClassFile(Class clazz, String proxyName) { byte[] classFile = ProxyGenerator.generateProxyClass(proxyName, clazz.getInterfaces()); //根据类信息和提供的代理类名称,生成字节码 ... }

示例:

public interface Sell { void sell(); } public class Vendor implements Sell { public void sell() { System.out.println("sell"); } } public class VendorAgent implements InvocationHandler { private Vendor mVendor; public VendorAgent(Vendor vendor) { mVendor = vendor; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //do something before return method.invoke(subject, args); } } public class Test { public static void main(String[] args) { Sell sell = new Vendor(); VendorAgent proxy = new VendorAgent(sell); Sell sub = (Sell) Proxy.newProxyInstance(sell.getClass().getClassLoader(), sell.getClass().getInterfaces(), proxy); sub.sell(); } }


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24743.html

    分享给朋友:

    “androidstudio 代理服务器 安卓代理服务” 的相关文章

    中国电信CN2网络接入不了的原因解析及解决方案

    在数字化时代,网络连接已成为我们生活中不可或缺的一部分。对于企业用户来说,中国电信CN2网络作为一张高可靠、低时延的网络,为广大用户提供了优质的网络服务。一些用户近期反映中国电信CN2网络接入不了的问题,这不仅影响了用户体验,也可能对企业正常运营造成干扰。中国电信CN2网络接入不了的原因到底是什么呢...

    探索香港节点的地理与经济优势及其全球数据传输作用

    香港节点的地理与经济优势 谈到香港的地理和经济优势,我总是想起它的独特地理位置。香港位于亚洲的心脏地带,紧密相连着中国大陆、东南亚、日本和韩国等区域。这些距离使得这里成为了数据流量的重要连接点。无论是企业还是个人,想要快速和高效地进行国际沟通时,香港总是首选的地方之一。作为一个全球重要的金融中心,香...

    甲骨文与云技术的创新研究探索

    甲骨文的概述 我一直对甲骨文充满兴趣,它不仅是中国古代文字的起源之一,也在历史发展中扮演了重要角色。甲骨文的起源可以追溯到公元前14世纪的商朝晚期,当时的一些卜辞记录在龟甲和兽骨上,这成为了我们了解古代社会、文化和宗教信仰的重要窗口。通过这些文字,我感受到那种历史的厚重感,仿佛能够穿越时间与古人对话...

    甲骨文云免费套餐与ARM CPU优势解析

    甲骨文云(Oracle Cloud)是一个强大的云服务平台,近年来受到了越来越多用户的关注。我自己也曾经探索过这个平台,在这里我想和大家聊聊甲骨文云的免费套餐,这对中小企业以及开发者来说真的是一个不错的选择。免费的套餐不仅简化了入门程序,也为新用户提供了足够的资源来尝试不同的云服务。 甲骨文云的免费...

    原生IP的重要性及其在外贸中的应用价值

    原生IP的定义与特点 谈到原生IP,这个概念在网络世界中显得极为重要。简单来说,原生IP是指那些与虚拟专用服务器(VPS)所在国家一致的IP地址。这意味着,它们的注册信息和其实际位置是相符的,根本没有经过修改或伪造。这一点在外贸业务中尤为重要,很多情况下,企业需要保证他们的服务器IP地址真的是注册所...

    如何将800G硬盘进行有效分区

    在我们深入探讨硬盘分区之前,理解硬盘分区的概念非常重要。硬盘分区是将一个物理硬盘划分为多个独立部分的过程。每个分区就像独立的小仓库,可以用来存储不同类型的数据,比如系统文件、应用程序、甚至个人文件。当我第一次接触硬盘的时候,就被这个划分方法吸引住了。不仅能帮助我更好地管理和查找文件,还能提高系统的运...