2.3.1 类型 正如前面章节介绍的,ASM的API展示Java类型,像编译后的class中一样,即使用内部名、类型描述符。 使用源码中的展示方式,可以使代码更加易读。...但是ASM提供了一个Type类,方便在需要的时候进行手动转换。 一个Type对象代表一种Java类型,可以由类型描述符或者Class对象创建。 Type类中也包含了一些表示基本数据类型的静态变量。...CheckClassAdapter ClassWriter不会检查方法调用的顺序是否合适,以及参数是否合法。 因此生成被Java虚拟机验证器所拒绝的非法class是可行的。...ASMifier可以直接在命令行中使用,例如: java -classpath asm.jar:asm-util.jar \ org.objectweb.asm.util.ASMifier \ java.lang.Runnable...生成的代码,使用缩进后,如下: package asm.java.lang; import org.objectweb.asm.*; public class RunnableDump implements
1.获取节点 获取一个类节点的代码如下所示: ClassNode classNode = new ClassNode(); // 1 ClassReader classReader.../awt/image/ImageObserver;)I ```java **当我们操控完指定的类节点之后,就可以使用 ASM 的 ClassWriter 类来输出字节码**,代码如下所示: ```java...因此 ASM 提供了一个 类访问者 ClassVisitor,以通过它来访问当前类的各个组件,当解析器 ClassReader 依次遇到上述的各个组件时,ClassVisitor 上对应的 visitor...栈映射帧 StackMap Frame 它是 Java 6 以后引入的一种验证机制,用于 检验 Java 字节码的正确性。...2)、注意本地变量表和操作数栈的数据交换以及 try catch blcok 的处理,关于异常处理可以使用 ASM 提供的 CheckClassAdapter,可以在修改完成后验证一下字节码是否正常。
ASM的TreeApi 对于Method的转换、生成也提供了一系列的组件和接口。 MethodNode中大多数属性和方法都和ClassNode类似,其中最主要的属性就是InsnList了。...Java代码 package asm.tree.method; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes...; import org.objectweb.asm.tree.*; import java.io.File; import java.io.FileOutputStream; import...= "java/lang/Object"; classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE, "espresso",...ClassWriter cw = new ClassWriter(Opcodes.ASM5); classNode.accept(cw); File
之前在做ThreadPoolHook的时候了解到滴滴的Booster内的asm用的都是ClassNode,这里我先简单的说下ClassNode好了。...ClassNode简介 如果你仔细读了关于字节码的文章后,你应该会知道Java中当一个方法被调用时会产生一个栈帧(Stack Frame),可以理解为那个方法被包含在了这个栈帧里,栈帧包括3个部分,局部变量区...一般一句简单的java代码,被翻译成字节码的情况下复杂度都会翻好几倍,其中特别是Java字节码的栈帧。...这部分如果大家有兴趣详细了解的话可以看下这篇文章啊,Java字节码(Bytecode)与ASM简单说明....上面基本上就是我所有的插桩的代码了,其实基本上都是字符串匹配之类的,只是因为bytecode上的和java的不一样,而且bytecode的可读性比较差了点,之前也安利过大家asm bytecode viewer
以下是一些常见的 Java 字节码类库: ASM (Bytecode Manipulation Framework): 简介:ASM 是一个轻量级的字节码操作框架,提供了生成和转换字节码的功能。...它是一个强大的字节码工具,被广泛用于许多 Java 字节码操作的场景。 官方网站:ASM Byte Buddy: 简介:Byte Buddy 是一个用于创建和操作字节码的库。...ASM API 从组成结构上可以分成两部分,一部分为 Core API,另一部分为 Tree API: ASM Core API 包括 asm.jar、asm-util.jar 和 asm-commons.jar...asm-tree.jar 主要类按“包含”组织关系: ClassNode:(类) VisitMethod(): 用于访问类中的方法。 VisitField(): 用于访问类中的字段。...ClassNode classNode = new ClassNode(Opcodes.ASM9); classReader.accept(classNode, ClassReader.SKIP_DEBUG
添加和删除类成员 添加和删除类就是在ClassNode对象的fields或methods列表中添加或删除元素 public class ClassTransformer { protected...事实上,这一区别对于几乎所有基于树的转换都是有效的。 和生成类的情景一样,使用树 API 转换类时,所花费的时间和占用的内存也要多于使用核 心 API 的时候。...类的生成和转化 上面只是如何创建和转换 ClassNode 对象,但还没有看到如何由一个类的字节数组表示来构造一个 ClassNode,或者反过来,由 ClassNode 构造这个字节数组。...要由字节数组构建 ClassNode,可以将它与 ClassReader 合在一起,使 ClassReader 生成的事件可供 ClassNode 组件使用,从而初始化其字段 ClassNode cn...= new ClassNode(ASM4); ClassReader cr = new ClassReader(...); cr.accept(cn, 0); ... // 可以在这里根据需要转换
0.写在前面 本篇是本系列的第二篇,主要介绍什么是ASM,以及如何使用ASM。 如果没有阅读之前的,还请阅读一下字节码也能做有趣的事,因为需要上一章的部分知识。...而这里我要介绍的就是操作字节码的一把利器-ASM,ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。...如果下载完毕,还记得我们上一节的那个例子吗?...在ClassVisitor定义了很多方法,例如:类上的注解,类的构造方法,类的字段,类的方法,静态代码块访问。用于我们去重写,以便做一些类上的逻辑扩展。...classNode = new ClassNode(org.objectweb.asm.Opcodes.ASM5); classReader.accept(classNode, ClassReader.SKIP_DEBUG
项目地址 AndroidLint 正文 之前介绍过UastScanner是针对于java,kt语法树的,所以我们能在他们编译成产物的过程的时候校验他们的语法是否合理,如果不合理就能用Lint进行阻断,之前的文章也有介绍...问题严重程度(忽略、警告、错误) Implementation( //实现,包括处理实例和作用域 PrivacyClassDetector::class.java..., Scope.CLASS_FILE_SCOPE ) ) } } 这部分其实和我写的隐私权限替换的asm很相似,因为已经编译成字节码了...: ClassNode) } 我们先从这个抽象接口看起,我在函数上面做了简单的方法描述。...当然理解文章内容的前提是你要有一定的虚拟机机器码的认知,对于asm相关的理解就会融汇贯通,无论是transform还是ClassScanner就都是一样的。
大家好,又见面了,我是你们的朋友全栈君。 ASM是一个久经考验的框架,包括Spring在内的多个框架都使用ASM作为字节码工具。...7.1 更新如下 用于Java 13的新常量Opcodes.V13 asm.Type中的小优化 检查CheckMethodAdapter.visitLocalVariable中的签名 重构单元测试使用Arrange-Act-Assert...asm-deprecated.jar 删除asm.util.Printer buf和appendString(之前已弃用) bug修复 317863:对于方法本地Java类,InnerClasses属性的重新映射逻辑是错误的...317866:扩展帧导致七个以上维度的基本数组的类型不正确 317868:带有括号的类名称Frame.getAbstractTypeFromDescriptor上的IllegalArgumentException...317869:CheckClassAdapter需要非null的ClassVisitor,它返回非null的MethodVisitor 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
基于当时的场景以及对Rxjava的分析,只能说解决了一小部分问题。但是实际上只要我们滥用了线程,特别是华为设备,还是有可能发生对应的问题的。...这个是在Throwables里面获取到的。从这里我们其实可以看出来,堆栈信息是保存在线程上的。 这么说起来线程被作为gcroot就可以理解了。因为虚拟机持有了所有存活的线程实例和堆栈。...这次也还是使用asm吧,之前我们在使用asm的时候大部分场景都是采取新增一个函数调用的方式。这次我们将采取类替换的规则。...: ByteArray { val classNode = ClassNode(Opcodes.ASM5) val classReader = ClassReader(srcClass...这部分就是所有基于asm扫描插入的代码了。
新的Extension AGP版本升级之后,应该是为了区分新旧版的Extension,所以在AppExtension的基础上,新增了一个AndroidComponentsExtension出来。...这就是新的asm api 的设计思路了,也是我们这边大佬的字节码框架大佬的设计。另外bytex内的设计思路也是如此。...tips ClassNode 因为是先生成的语法树,所以和一般的ClassVisitor有点小区别,需要在visitEnd方法内调用accept(next) 实际代码分析 接下来我们上实战咯。...class PrivacyClassNode(private val nextVisitor: ClassVisitor) : ClassNode(Opcodes.ASM5) { override...second } 这部分比较简单,把逻辑抽象定义在类ClassNode内,然后在visitEnd方法的时候调用我之前说的accept(nextVisitor)方法。
api 'org.ow2.asm:asm:9.2' api 'org.ow2.asm:asm-tree:9.2' 第二次asm操作的时候我们会进行文件copy操作以及类替换等等,第二次的时候我们会在第一次收集到的类数据的...这部分可以参考下我自己写的路由的Transform或者DRouter,我之前分析过,因为我的路由表的注册类是class,而不是jar。所以我是通过asm读取当前类进行上一次的路由表回溯的。...之后我就会将本次的增删改操作作用在这个注册类上就行了。...自动化曝光 我之前的文章介绍过关于View的有效曝光监控(上)。我最近对这个也进行了一个小小的改良和尝试,打算还是尝试下配合ASM对其进行调整。...class RecyclerViewHolderImp(classNode: ClassNode) { init { if (isRecyclerViewHolder(classNode.superName
在以下章节中你可以学习到如下知识; Java Agent 非硬编码式代理类,这也就是常说的探针技术 ASM 字节码编程简单使用 工程打包额外加载其他 jar 方法 最后是一个破解演示,仅适合个人学习使用...之后通过我们的 java agent 编程模拟授权被破解。 1....Java Agent 介绍 在 JDK1.5 以后,JVM 提供了 agent 技术构建一个独立于应用程序的代理程序(即为Agent),用来协助监测、运行甚至替换其他JVM上的程序。...ASM 介绍 ASM 是一个 JAVA 字节码分析、创建和修改的开源应用框架。在 ASM 中提供了诸多的API用于对类的内容进行字节码操作的方法。...与传统的 BCEL 和 SERL 不同,在 ASM 中提供了更为优雅和灵活的操作字节码的方式。目前 ASM 已被广泛的开源应用架构所使用,例如:Spring、Hibernate 等。 3.
ASM 当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节码规范的前提下进行字节码改造。...那个时候包含 java.lang.reflect.Proxy 包的 JDK 1.3 还没发布,ASM 被作为代码生成器,用来生成动态代理的代理类。...经过多年的发展,ASM 在诸多框架中已经遍地开花,成为字节码操作领域事实上的标准。...更新速度快,支持最新的 Java 版本 速度非常快,在动态代理 class 的生成和 class 的转换时,尽可能确保运行中的应用不会被 ASM 拖慢 非常可靠、久经考验,已经有很多著名的开源框架都在使用...使用 Tree Api 的方式也可以实现同样的效果 byte[] bytes = getBytes(); ClassReader cr = new ClassReader(bytes); ClassNode
具体的实现可以参看《AspectJ程序设计指南》这本书 (2)ASM 如果说 AspectJ 只能满足 50% 的字节码处理场景,那ASM就是一个可以实现 100% 场景的 Java 字节码操作框架,它的功能也非常强大...使用 ASM 操作字节码主要的特点有:操作灵活,可以根据需求自定义修改、插入、删除。上手比较难,需要对 Java 字节码有比较深入的了解。...下面简单介绍一下ASM ASM 库提供了两个用于生成和转换已编译类的 API,一个是核心 API,以基于事件的形式来表示类,另一个是树 API,以基于对象的形式来表示类。...核心是ClassNode,可以在此基础上增加或者删除属性,成员之类的,当然还有更高级的。缺点是:如果使用者对字节码不熟悉的话不好操作 3.掌握插桩应该具备的基础知识 (1)熟练掌握字节码相关技术。...不过也大致理解了具体的流程 (1)继承Transform实现字节码的修改(其中就有asm的应用,对ASM有所了解的话基本能看懂第一篇文章里面的modifyClass这个函数是干嘛的。
因此可以用于在转换链中的任何一点上,跟踪生成或者转换方法的内容。...例如: java -classpath asm.jar:asm-util.jar \ org.objectweb.asm.util.TraceClassVisitor \ java.lang.Void...CheckClassAdapter 这个类已经在上一章中介绍过了,用于检查ClassVisitor方法是否按照适当顺序被调用、方法参数是否合法,它也同样适用于MethodVisitor的方法。...它可以被用来知道如果通过ASM生成某些编译后的代码:在Java中只要编写相应的源码即可,使用javac编译,并且使用ASMifier访问编译后的类。 你将会得到ASM代码,来生成相应源码的字节码。...当然在它仅能作用在包含了预先计算过栈哈希帧的编译类,即使用Java 6或者更改版本编译的类(或者像之前的示例一样,使用含有COMPUTE_FRAMES参数的ASM adapter将类升级到Java 6)
1.备份数据库和控制文件 一般使用ASM的场景是RAC,当然也有单机使用ASM的环境(Standalone)。这些都不重要,即使是使用的文件系统,备份数据库的方法也都是一样的。...我这里的备份集是在我的NAS存储上,可以在Site B直接看到这些备份集。...数据库; 数据文件,在数据库已经mount的基础上,设定要恢复数据文件的目录,根据备份集恢复数据库,最终确认可以open数据库。...这本来是天经地义的一件事,因为之前的数据库是在ASM环境,控制文件也是之前环境备份出来的,记录的肯定是ASM的路径无疑。...磁盘组上,显然是不合我们要求的,所以我们需要在新的文件系统路径下创建新的redo日志文件,并删除ASM的那些日志文件,同时我们现在的环境是单实例,不再需要thread 2: alter database
,包名)后,需要删除对应的原class文件 混淆前后的效果如下图所示 方案实现 pom引用 org.ow2.asm org.ow2.asm asm-commons asm-util 9.0 org.ow2.asm ...org.ow2.asm asm-analysis <version
不过,这也带来了一些限制,其中大多数限制来自Groovy本质上仍然是一种动态语言。...在很多情况下,DSL引擎是用Groovy(或Java)编写的,然后用户代码作为脚本执行,这意味着在用户逻辑之上有某种包装器。...通常,用户编写的脚本无需测试就可以投入生产,因为DSL逻辑达到了任何用户都可以使用DSL语法编写代码的地步。最后,用户可能会忽略他们所编写的实际上是代码。...PS:注意,虽然在内部类型检查器支持多种机制来实现类型检查扩展(包括普通的旧java代码),但推荐的方法是使用那些类型检查扩展脚本。...2.4 类型检查扩展的相关API AST:类型检查API是一个低级API,处理抽象语法树。要开发扩展,您必须很好地了解AST,即使DSL比处理纯Java或Groovy的AST代码要容易得多。
领取专属 10元无门槛券
手把手带您无忧上云