动态代理在Android中的运用

Android 网络框架之Retrofit源码解析 如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。欢迎大家一起交流讨论啊~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!ofit巧妙的使用了动态代理在调用接口的方法之前,统一的去解析处理Header和URL等操作;这样就不用每次在新增一个请求的方法,就去写一遍这个解析的逻辑;那么接下来我们来看看Retrofit的怎么解析这些接口的;6.2、Retrofit是怎么使用动态代理的? 阅读详情

在这里插入图片描述

动态代理是一种在编程中非常有用的设计模式,它允许你在运行时创建一个代理对象来代替原始对象,以便在方法调用前后执行额外的逻辑。在Android开发中,动态代理可以用于各种用例,如性能监控、AOP(面向切面编程)和事件处理。本文将深入探讨Android动态代理的原理、用途和实际示例。

什么是动态代理?

动态代理是一种通过创建代理对象来代替原始对象的技术,以便在方法调用前后执行额外的操作。代理对象通常实现与原始对象相同的接口,但可以添加自定义行为。动态代理是在运行时生成的,因此它不需要在编译时知道原始对象的类型。

动态代理的原理

动态代理的原理涉及两个关键部分:

  1. InvocationHandler(调用处理器):这是一个接口,通常由开发人员实现。它包含一个方法 invoke,在代理对象上的方法被调用时会被调用。在 invoke 方法内,你可以定义在方法调用前后执行的逻辑。
  2. Proxy(代理类):这是Java提供的类,用于创建代理对象。你需要传递一个 ClassLoader、一组接口以及一个 InvocationHandler 给 Proxy.newProxyInstance 方法,然后它会生成代理对象。

下面是一个示例代码,演示了如何创建一个简单的动态代理:

import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy

// 接口
interface MyInterface {
    fun doSomething()
}

// 实现类
class MyImplementation : MyInterface {
    override fun doSomething() {
        println("Original method is called.")
    }
}

// 调用处理器
class MyInvocationHandler(private val realObject: MyInterface) : InvocationHandler {
    override fun invoke(proxy: Any, method: Method, args: Array<Any?>?): Any? {
        println("Before method is called.")
        val result = method.invoke(realObject, *(args ?: emptyArray()))
        println("After method is called.")
        return result
    }
}

fun main() {
    val realObject = MyImplementation()
    val proxyObject = Proxy.newProxyInstance(
        MyInterface::class.java.classLoader,
        arrayOf(MyInterface::class.java),
        MyInvocationHandler(realObject)
    ) as MyInterface

    proxyObject.doSomething()
}

运行上述代码会输出:

Before method is called.
Original method is called.
After method is called.

这里,MyInvocationHandler 拦截了 doSomething 方法的调用,在方法前后添加了额外的逻辑。

Android中的动态代理

在Android中,动态代理通常使用Java的java.lang.reflect.Proxy类来实现。该类允许你创建一个代理对象,该对象实现了指定接口,并且可以拦截接口方法的调用以执行额外的逻辑。在Android开发中,常见的用途包括性能监控、权限检查、日志记录和事件处理。

动态代理的用途

性能监控

你可以使用动态代理来监控方法的执行时间,以便分析应用程序的性能。例如,你可以创建一个性能监控代理,在每次方法调用前记录当前时间,然后在方法调用后计算执行时间。

import android.util.Log

class PerformanceMonitorProxy(private val target: Any) : InvocationHandler {
    override fun invoke(proxy: Any, method: Method, args: Array<Any?>?): Any? {
        val startTime = System.currentTimeMillis()
        val result = method.invoke(target, *(args ?: emptyArray()))
        val endTime = System.currentTimeMillis()
        val duration = endTime - startTime
        Log.d("Performance", "${method.name} took $duration ms to execute.")
        return result
    }
}
AOP(面向切面编程)

动态代理也是AOP的核心概念之一。AOP允许你将横切关注点(如日志记录、事务管理和安全性检查)从业务逻辑中分离出来,以便更好地维护和扩展代码。通过创建适当的代理,你可以将这些关注点应用到多个类和方法中。

事件处理

Android中常常需要处理用户界面上的各种事件,例如点击事件、滑动事件等。你可以使用动态代理来简化事件处理代码,将事件处理逻辑从Activity或Fragment中分离出来,使代码更加模块化和可维护。

实际示例

下面是一个简单的示例,演示了如何在Android中使用动态代理来处理点击事件:

import android.util.Log
import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy
import android.view.View

class ClickHandlerProxy(private val target: View.OnClickListener) : InvocationHandler {
    override fun invoke(proxy: Any, method: Method, args: Array<Any?>?): Any? {
        if (method.name == "onClick") {
            Log.d("ClickHandler", "Click event intercepted.")
            // 在事件处理前可以执行自定义逻辑
        }
        return method.invoke(target, *args.orEmpty())
    }
}

// 使用示例
val originalClickListener = View.OnClickListener {
    // 原始的点击事件处理逻辑
}

val proxyClickListener = Proxy.newProxyInstance(
    originalClickListener::class.java.classLoader,
    originalClickListener::class.java.interfaces,
    ClickHandlerProxy(originalClickListener)
) as View.OnClickListener

button.setOnClickListener(proxyClickListener)

通过这种方式,你可以在原始的点击事件处理逻辑前后执行自定义逻辑,而无需修改原始的OnClickListener实现。

结论

动态代理是Android开发中强大的工具之一,它允许你在不修改原始对象的情况下添加额外的行为。在性能监控、AOP和事件处理等方面,动态代理都有广泛的应用。通过深入理解动态代理的原理和用途,你可以更好地设计和维护Android应用程序。

最后大家分享一份全套的Android学习资料,给那些想学习 Android 的小伙伴们一点帮助!

适用于:

  • 任何想学习Android开发但不知道从哪里开始的人
  • 也适用于已经开始进行Android开发但想要变得更好的任何人

一、Android所有方向的学习路线

为了成为更好的 Android 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。如果下面这个学习路线能帮助大家成为一个更好的 Android 开发者,那么我的使命也就完成了:

包括:Android应用开发、系统开发、音视频开发、Flutter开发、小程序开发、UI界面、车载系统开发等等

在这里插入图片描述

二、学习软件

工欲善其事必先利其器。学习Android常用的Android Studio视频教程和Android Studio最新的安装包都在这里了,给大家节省了很多时间。


三、进阶学习视频

我们在学习的时候,往往书籍源码难以理解,阅读困难,这时候视频教程教程是就很适合了,生动形象加上案例实战,科学有趣才能更方便的学习下去。

在这里插入图片描述

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

五、经典书籍阅读

阅读Android经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习Android开发的读者来说,阅读Android经典书籍是非常有必要的。

在这里插入图片描述

六、面试资料

我们学习Android必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

图片

请添加图片描述

这份完整版的Android全套学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】
Android签名校验攻防战:从NDK到动态代理的全面防御策略 本文深入探讨了Android签名校验的攻防策略,从Java层的动态代理检测到Native层的ELF节校验技术,全面解析了如何防御PMS动态代理攻击和IO重定向攻击。通过NDK和动态代理技术的结合,开发者可以构建更可靠的签名校验体系,有效防止应用被二次打包和恶意篡改。 阅读详情

相关推荐

Android源码设计模式探索与实战【代理模式】

理解: 代理模式是结构性设计模式的一种。在软件开发中我们常常会遇到这样的情况,有些对象,我们不想客户端可以直接访问,或者我们不想客户端可以访问到这个对象的一些操作方法,所以需要一个“中介”的角色。举个例子,卖房子的人为了减少频繁的电话&看房等麻烦,会把自己的房子托给中介,中介替他去找合适的买家,针对于买房的人来说,买这套房子,只能通过中介去了解,而不能直接打电话给房主。定义: 为一个对象提供一个替身,以控制对这个对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中

itbird的专栏 1094

Android如何利用InvocationHandler动态代理调用aidl接口

众所周知,Java的InvocationHandler可以作为动态代理去调用接口方法。但是如何去调用android里面的aidl接口定义的方法呢? 经过查阅相关资料和自己实践最终得出解决方案: 1 首先利用反射获取aidl接口的实例 Class<?> reflectCallback = null; try { reflectCallback = Class.forName("com.xxx.xxx.IAidlClass"); //aidl类 } catch (C

HellDevil的专栏 979

Android设计模式之代理模式(Proxy Pattern)

Android设计模式之代理模式(Proxy Pattern)

Android中如何正确的使用动态代理

首先,定义一个接口,这是动态代理所必须的。动态代理在 Android 开发中具有重要意义,可以帮助开发者实现更灵活的代码设计,支持 AOP 和权限管理等功能。在使用动态代理时,需注意性能开销和线程安全问题。通过合理设计和使用动态代理,可以大大提高代码的可维护性和复用性。

彬_小彬的博客 1025

从隐私保护到生命守护:CPD技术中的传感器选择与权衡

本文探讨了智能座舱中儿童存在检测(CPD)技术的传感器选择与隐私保护平衡策略。通过分析毫米波雷达、UWB等先进技术的性能与隐私风险,揭示了如何在确保儿童安全的同时保护用户隐私。文章还展望了CPD技术与座舱生态系统的未来融合趋势,为汽车安全领域提供了重要参考。

weixin_29159441的博客 301

【QGIS、OSM】利用python开源工具实现指定区域的交通分配

如果从osmgnms和grid2demand得到的node.csv,我们要修改path4gnms代码中的utils.py的四处设置。利用QGIS实现可视化,得到的link_performance.csv,参数有volume和VOC。改完这四处代码,就可以运行path4gnms中的tutorial.ipynb了。

weixin_40594084的博客 1277

Android中的动态代理详解

在说动态代理之前,先来简单看下代理模式。代理是最基本的设计模式之一。它能够插入一个用来替代“实际”对象的“代理”对象,来提供额外的或不同的操作。这些操作通常涉及与“实际”对象的通信,因此“代理”对象通常充当着中间人的角色。

金戈鐡馬 1055

AI 生成测试报告:从 2 小时到 10 分钟

本文分享了AI在汽车电子测试报告生成中的应用案例。作者以某车企ECU测试项目为例,对比传统报告方式(每天2小时)与AI辅助方式(每天20分钟),效率提升83%。文章详细介绍了测试报告的核心要素(测试概况、结果、问题分析、发布建议)和不同类型报告(日报、周报、总结报告)的特点,并提供了从CANoe导出测试数据的Python解析脚本示例。通过AI自动化处理,大幅减少了测试工程师在报告整理上的时间投入,为汽车电子测试工作提供了实用效率提升方案。

小明的博客 445

Android自定义注解、反射、动态代理 知识梳理与运用

目标:通过学习自定义注解、反射和动态代理实现通过注解实现按钮点击实现 一、知识准备 1.自定义注解 1.1 注解的定义 Java文件叫做Annotation,用@interface表示 1.2 元注解 @interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。 1.3 注解的保留策略: @Retention(RetentionPolicy.SOURCE) 注解仅存在于源码中,在class字节码文件中不包含,一般用于生成额外的辅助类

MonkeyPanda的博客 422

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

(功能安全六)硬件FMEDA计算

FMEDA(故障模式、影响与诊断分析)是功能安全验证的核心方法,通过量化分析硬件故障模式及其影响,计算SPFM、LFM、PMHF等关键指标。分析过程包含六大步骤:计算元器件失效率、识别故障模式、评估安全机制诊断覆盖率、分类计算各类失效率、量化指标计算及设计优化。输入需要系统架构图、硬件故障模式清单等资料,输出安全指标达标情况及改进建议,确保设计满足ASIL等级要求。该方法通过系统化的故障分类和量化评估,为硬件安全设计提供科学依据。

Dayongger的博客 1453

Android MVP-编程思想4(AOP思想-动态代理运用,反射创建M层实例对象)

上一节讲解了如何处理内存泄露,如何做基类封装。这一节学习如何使用动态代理处理重复逻辑。 在第二小节中我们已经提到了下面的问题:网络请求是耗时操作,我们 Presenter 层持有了 View 层的引用,也就是 Activity 的引用,在网络请求过程中,Activity被用户或者系统关闭,这时 View 相当于被摧毁了,如果不进行判断 View 引用是否为空,当数据返回时,就会造成空指针异常,所以...

程序员 465

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

Code_流苏:在代码中寻诗意,在实践中觅真知 933

Java的动态代理1——使用教程

java的动态代理用法特别简单,但是用途特别广: 安卓的Retrofit框架 Java的Spring的切面编程 用好了非常有用,可以写出高大上的框架来 使用方法 编写需要代理的类(普通类、抽象类、接口) public interface RealUser{ void function(int param) } 编写处理方法调用的handler类必须继承Invocat...

liujian8654562的博客 349

CentOS7安装OpenSSL1.1.1s

CentOS7安装OpenSSL1.1.1s

Bertram的博客 733

Google Earth Engine(GEE)—— 显示如何使用迁移的训练样本进行多年分类的脚本(sentinel-2影像为例)光谱差异()

HydroSHEDS 是一种地图产品,它以一致的格式为区域和全球范围的应用程序提供水文信息。它提供了一套不同比例的地理参考数据集(矢量和栅格),包括河流网络、流域边界、排水方向和流量累积。请注意,对于北纬 60 度以上的地区,HydroSHEDS 数据的质量明显较低,因为没有可用的基础 SRTM 高程数据,因此分辨率较低的 DEM(USGS 提供的 HYDRO1k)。该数据集基于 15 角秒(赤道约 500 米)分辨率栅格数据提供嵌套的分层分水岭多边形。光谱信息和之前不同的点:训练结果。

此星光明博客 967

JAVA 动态代理通俗解析

引入本篇文章主要介绍一下动态代理在 Java 和 Android 中的应用。了解动态代理之前,你需要知道什么是代理以及什么是静态代理。由于篇幅所限,本文就不介绍这些了。你可以点击这里查看或者知乎上的讨论,你也可以自行 Google 一下。另外文中的两个实例 Demo 你可以在这里取到。一. 概念介绍动态代理是 Java 一大特性。它的显著优势就是无侵入式的扩展代码。通俗来讲就是可以用来做方法的增强...

xiexiangyu92的博客 840

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android中的代理模式

Android中的代理模式 1. 什么是代理 比如我们生活中的找出租屋,需要去找中介进行寻找挑选. 而这里的中介就是代理. 列子中看出代理特点如下 1. 租客跟中介要做成的最终目的是一致的就是租到房子(目标一致). 2. 中介资源多,有权利跟房东进行价格协商(功能强大). 3. 中介是不会让我们直接跟房东进行协商(无法直接访问到目标). 我们在开发中也是有相似的情况出现 你有个a类,本来是调用c类方法,完成某个功能.但是c类不让a直接调用. a-->不能直接调用c的方法

qq_26888691的博客 1894

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

反射注解与动态代理综合使用

睡觉之前,为了更好地入眠,让我们来学习下反射+注解+动态代理的综合使用姿势。在上篇文章中我们简单的聊了下动态代理,今天我们结合反射和注解来一起看下。首先会先简单看下反射和注解,动态代理请参考上篇博客:www.jianshu.com/p/b00ef12d5…然后会综合通过一个Android的小栗子进行实战。 ###1.反射先储备下理论知识,具体的应用可以看后面的栗子。利用Java的反射可以在运行状态...

weixin_33858336的博客 216

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

反射、注解和动态代理

反射是指计算机程序在运行时访问、检测和修改它本身状态或行为的一种能力,是一种元编程语言特性,有很多语言都提供了对反射机制的支持,它使程序能够编写程序。Java的反射机制使得Java能够动态的获取类的信息和调用对象的方法。 一、Java反射机制及基本用法 在Java中,Class(类类型)是反射编程的起点,代表运行时类型信息(RTTI,Run-Time Ty...

cpongo5 264

2021年Android面试题---设计模式

1.能简单说说代理模式吗?动态代理和静态代理有什么区别?

xingfuyisheng的专栏 539

Android AOP简介及AspectJ的应用

分享一份NDK基础开发资料分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;

2401_84149381的博客 495

Android Compose 新闻App(一)网络框架搭建

build()这里的代码就很简单了,通过网络地址构建一个Retrofit,然后根据传入的Service去访问接口,这里还有一个内联函数。下面我们来构建这个服务接口,在此之前先在com.llw.goodnews包下新建一个utils包,包下新建一个Constant的类,里面的代码如下:/***//***//***/这里就是一个常量类,我们在请求API接口时会用到的一些不变的值就放这里。然后我们在network包下新建一个ApiService接口,代码如下:/***/

2301_81749759的博客 965
上一篇: 字节都跳不动了,互联网的降本增效何时能停?我一个Android程序员能怎么做
下一篇: Android Glide使用姿势与原理分析
Agent学习路线
博客等级 码龄6年 1万+粉丝 1904原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值