敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第 35 天,点击查看活动详情
我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们相互鼓舞
一、alibaba/jvm-sandbox 概述
alibaba/jvm-sandbox 是 JVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 处理计划。沙箱容器供给
- 动态增强类你所指定的类,获取你想要的参数和行信息乃至改变办法履行
- 动态可插拔容器结构
在其能力至上构建的上层使用有:
-
chaosblade-io/chaosblade
- 其chaosblade-io/chaosblade-exec-jvm 是一个依据 jvm-sandbox 的 chaosblade 履行器,用于经过增强类在 Java 使用程序上进行混沌实验。
-
alibaba/jvm-sandbox-repeater
- 依据 JVM-Sandbox 的录制/回放通用处理计划
二、实时无侵入 AOP 结构计划比照
在常见的 AOP 结构完结计划中,有静态织造和动态织造两种。
-
静态织造:静态织造发生在字节码生成时依据一定结构的规则提前将 AOP 字节码刺进到方针类和办法中,完结 AOP;
-
动态织造:动态织造则允许在 JVM 运行过程中完结指定办法的 AOP 字节码增强.常见的动态织造计划大多选用重命名原有办法,再新建一个同签名的办法来做署理的工作形式来完结 AOP 的功能(常见的完结计划如 CgLib),但这种方式存在一些使用鸿沟:
- 侵入性:对被署理的方针类需求进行侵入式改造。比方:在 Spring 中有必要是托管于 Spring 容器中的 Bean
- 固化性:方针署理办法在启动之后即固化,无法从头对一个已有办法进行 AOP 增强
要处理无侵入
的特性需求 AOP 结构具有 在运行时完结方针办法的增强和替换。在 JDK 的规范中运行期重界说一个类有必要准循以下准则
- 不允许新增、修正和删去成员变量
- 不允许新增和删去办法
- 不允许修正办法签名
JVM-SANDBOX 归于依据 Instrumentation 的动态织造类的 AOP 结构,经过精心结构了字节码增强逻辑,使得沙箱的模块能在不违反 JDK 约束情况下完结对方针使用办法的无侵入
运行时 AOP 拦截。
三、依据事情的行为注入和流控
在沙箱的世界观中,任何一个 Java 办法的调用都能够分解为BEFORE
、RETURN
和THROWS
三个环节,由此在三个环节上引申出对应环节的事情勘探和流程控制机制。
// BEFORE
try {
/*
* do something...
*/
// RETURN
return;
} catch (Throwable cause) {
// THROWS
}
依据BEFORE
、RETURN
和THROWS
三个环节事情分离,沙箱的模块能够完结很多类 AOP 的操作。
-
能够感知和改变办法调用的入参
-
能够感知和改变办法调用回来值和抛出的反常
-
能够改变办法履行的流程
- 在办法体履行之前直接回来自界说成果目标,原有办法代码将不会被履行
- 在办法体回来之前从头结构新的成果目标,乃至能够改变为抛出反常
- 在办法体抛出反常之后从头抛出新的反常,乃至能够改变为正常回来
四、最终说一句
我是石页兄,如果这篇文章对您有帮助,或者有所启示的话,欢迎关注笔者的微信大众号【 架构染色 】进行沟通和学习。您的支撑是我坚持写作最大的动力。
欢迎点击链接扫马儿关注、沟通。