流量回放repeater的原理分析一:sandbox源码分析

概述

想要弄明白sandbox如何实现字节码增强,我们首先得了解Instrumentation。
Instrumentation让我们有能力在jvm启动后进行Class的变型(java5以后)或者在jvm启动后,通过attach的方式加载jar包实现Class的变型(java6以后)。
sandbox-jvm便是根据此原理,实现一套框架,将不同的增强能力模块化管理,使用者只需要按照规范实现模块功能,即可被sandbox-jvm加载,实现字节码能力增强。
了解了上面的能力后,我们来看下sandbox-jvm的框架实现。

sandbox的代码主要分为几个过程:启动、模块加载、类增强实现

启动

上面我们提到,使用Instrumentation进行字节码增强有2种模式(attach模式和java-agent模式),sandbox-jvm的启动也是这2种,入口都在AgentLauncher中,分别对应着agentmain和premain,它们都调用了install方法,以agentmain为例:

public static void agentmain(String featureString, Instrumentation inst) {
   
        LAUNCH_MODE = LAUNCH_MODE_ATTACH;
        final Map<String, String> featureMap = toFeatureMap(featureString);
        writeAttachResult(
                getNamespace(featureMap),
                getToken(featureMap),
                install(featureMap, inst)
        );
    }

install函数的作用是在目标jvm上安装sandbox,创建独立的classloader,通过classloader加载JettyCoreServer.class,并且反射生成实例,建立httpserver监听请求

// CoreServer类定义
final Class<?> classOfProxyServer = sandboxClassLoader.loadClass(CLASS_OF_PROXY_CORE_SERVER);
// 获取CoreServer单例
final Object objectOfProxyServer = classOfProxyServer
		.getMethod("getInstance")
		.invoke(null);
// CoreServer.isBind()
final boolean isBind = (Boolean) classOfProxyServer.getMethod("isBind").invoke(objectOfProxyServer);
// 如果未绑定,则需要绑定一个地址
if (!isBind) {
   
	try {
   
		classOfProxyServer
				.getMethod("bind", classOfConfigure, Instrumentation.class)
				.invoke(objectOfProxyServer, objectOfCoreConfigure, inst);
	} catch (Throwable t) {
   
		classOfProxyServer.getMethod("destroy").invoke(objectOfProxyServer);
		throw t;
	}
}

启动jetty server,监听http请求,并且调用coreModuleManager.reset进行模块的加载,在下面一节介绍。

publi
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值