首页 > 其他分享 >AOP详解

AOP详解

时间:2023-08-04 20:23:48浏览次数:36  
标签:字节 args 代理 详解 Intent AOP 动态

1:AOP:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

它提倡的是针对同一类问题的统一处理,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2:AOP主要应用场景

日志记录,性能统计,安全控制,事务处理,异常处理等等。

3:各个时期的AOP:

 

 4:AOP分为静态AOP和动态AOP

1)静态AOP:APT和AspectJ

AspectJ 意思就是Java的Aspect,Java的AOP。AspectJ属于静态AOP,它是在编译时进行增强,会在编译时期将AOP逻辑织入到代码中。

由于是在编译器织入,所以它的优点是不影响运行时性能,缺点是不够灵活。

AspectJ框架用法:

 

 

基于AspectJ的框架Hugo:

 

 

动态AOP:

1)JDK动态代理(反射机制),使用InvocationHandler接口:

缺点:反射,影响性能。

Class<?> iActivityManagerClass = Class.forName("android.app.IActivityManager");
            Object mInstanceProxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    new Class[]{iActivityManagerClass}, new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


                            if ("startActivity".equals(method.getName())) {
                                int index = 0;
                                for (int i = 0; i < args.length; i++) {
                                    if (args[i] instanceof Intent) {
                                        index = i;
                                        break;
                                    }
                                }
                                Intent intent = (Intent) args[index];

                                //启动代理的Intent
                                Intent intentProxy = new Intent();
                                //宿主定义的用于欺骗AMS的Activity类
                                intentProxy.setClassName("packagename", "className");

                                //将插件的intent信息保存起来,供后续重新拿出来使用
                                intentProxy.putExtra(ORIGINAL_INTENT_INFO, index);

                                args[index] = intentProxy;
                            }
                            //第一个参数,系统的IActivity对象
                            return method.invoke(mInstance, args);
                        }
                    });


            //用代理对象替换掉系统的IActivityManager
            mInstanceField.set(singleton, mInstanceProxy);

 2)动态字节码生成

在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中,没有接口也可以织入,但扩展类的实例方法为final时,则无法进行织入。比如Cglib

CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

3)自定义类加载器

在运行期,目标加载前,将切面逻辑加到目标字节码里。如:Javassist

Javassist是可以动态编辑Java字节码的类库。它可以在Java程序运行时定义一个新的类,并加载到JVM中;还可以在JVM加载时修改一个类文件。

4)ASM

ASM可以在编译期直接修改编译出的字节码文件,也可以像Javassit一样,在运行期,类文件加载前,去修改字节码。

标签:字节,args,代理,详解,Intent,AOP,动态
From: https://www.cnblogs.com/wnpp/p/17606973.html

相关文章

  • Go语言Http调用之Get、Post请求详解
    HTTP 调用需要通过 http 包里的 Client 结构体里的 Do 方法去实现,因此需要先声明一个 Client 结构体变量,该结构体可以设置超时时间等配置。对于一个请求里的 URL,查询参数,请求 method 等参数,需要 http 包里的 Request 结构体去封装。我们可以通过 NewRequestWith......
  • Apache Superset 1.2.0教程 (三)—— 图表功能详解
    通过之前章节的学习,我们已经成功地安装了superset,并且连接mysql数据库,可视化了王者英雄的数据。使用的是最简单Table类型的图表,但是superset还支持非常多的图表类型。本文我们将对各种图表类型进行逐一的演示,文章较长,建议收藏后阅读。图表分类Superset提供了大量的图表来帮助我们进......
  • 看一家头部实干派互娱公司如何玩转DataOps?
    DataOps的概念自首次被提出至今已有8年,并在2018年被Gartner纳入数据管理技术成熟度曲线。从实施上看,当下DataOps仍处在发展初期,鲜少企业或团队能据此真正沉淀一套方法论或技术产品的体系。不过,随着越来越多的企业开启DataOps实践,相信令人“雾里看花”的DataOps方法体系也会逐渐明朗......
  • AQS详解
    1、AQS介绍AQS的全称是AbstractQueuedSynchronizer,抽象队列同步器。这个类在java.util.concurrent.locks包下面。AQS就是一个抽象类,主要用来构建锁和同步器。publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizerimplementsjava.io.Serializab......
  • Linux抓包工具tcpdump详解
    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要......
  • 亚德客-DPS系列电子式数显压力传感器-说明书详解
     一、说明书     二、模式详解 简易模式:只要气压大于设定值则为ON(接通),小于设定值则为OFF(断开)迟滞模式:H:高限位值L:低限位值气压在大于高限位H时为ON(接通),小于低限位L时为OFF(断开)窗型模式:H:高限位值L:低限位值气压在大于高限位H或者低于低限位L时为......
  • Android Dex文件详解
    前言==相信大家都熟悉dex文件,把一个apk给解压缩,就会得到一堆dex文件,但是这些dex文件是怎么来的,又有什么用,为什么这样设计,有进行思考过吗俗话说知其然,知其所以然,本篇文章开始探究一下这些底层实现细节。正文==不同的虚拟机JVMJVM是JavaVirtualMachine的简称,即Java虚拟机,它本质是......
  • Windows运行命令之netstat命令详解
    一、简介netstat命令显示处于活动状态的TCP连接、计算机正在侦听的端口、以太网统计信息、IP路由表、用于IP、ICMP、TCP和UDP协议的IPv4统计信息和IPv6统计信息(IPv6、ICMPv6、TCPoverIPv6和UDPoverIPv6协议)。使用没有参数的情况下,此命令显示活动TCP连接。 二、命令示例1、nets......
  • awk命令详解
    awk变量1、主要作用用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组2、格式2.1awk[选项]'匹配规则和处理规则'[处理文本路径][root@localhost~]#awk-F:'{print$1}'/etc/passwd匹配规则主要是:正则表达式处理规则主要是:设置变量......
  • Xcode Snippets 功能详解
    http://nshipster.com/xcode-snippets/iOSdevelopmentallbutrequirestheuseofXcode.Toitscredit,Xcodehasimprovedprettyconsistentlyoverthelastcoupleofyears.Sure, itstillhasits…quirks,buthey—thingscouldbe much,muchworse.Workingi......