如何编写Java代理

对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问。 这是我们学习的实现此类代理的经验教训。

开始

使用“ static public static void premain(String args,Instrumentation inst)”方法创建一个代理类。 将该类放入一个jar文件中,其中包含指向Agent类的清单。 premain方法将在应用程序的main方法之前调用。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.2
Created-By: 1.8.0_05-b13 (Oracle Corporation)
Built-By: Thomas Krieger
Implementation-Vendor: Anarsoft
Implementation-Title: VMLens Agent
Implementation-Version: 2.0.0.201511181111
Can-Retransform-Classes: true
Premain-Class: com.anarsoft.trace.agent.Agent
Boot-Class-Path: agent_bootstrap.jar

来自vmlens的MANIFEST.MF文件。

类加载器魔术第1部分

代理类将由系统类加载器加载。 但是我们必须避免代理和应用程序使用的类之间的版本冲突。 尤其是代理中使用的框架对于应用程序类应该不可见。 因此,我们使用专用的URLClassLoader来加载所有其他代理类:

// remember the currently used classloader
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();// Create and set a special URLClassLoader
URLClassLoader classloader = new URLClassLoader(urlList.toArray(new URL[]{}) , null );
Thread.currentThread().setContextClassLoader(classloader);// Load and execute the agent
String agentName = "com.anarsoft.trace.agent.runtime.AgentRuntimeImpl";
AgentRuntime agentRuntime  =  (AgentRuntime) classloader.loadClass(agentName).newInstance();// reset the classloader
Thread.currentThread().setContextClassLoader(contextClassLoader);

类加载器魔术第2部分

现在,当访问字段时,我们使用asm添加我们的静态回调方法。 为了确保这些类在所有其他类中可见,它们必须由引导类加载器加载。 为此,它们必须位于java包中,并且包含它们的jar必须位于引导类路径中。

package java.anarsoft.trace.agent.bootstrap.callback;public class FieldAccessCallback {public static  void getStaticField(int field,int methodId) {}}

vmlens的回调类。 它必须在java包命名空间中才能在所有类中可见。

Boot-Class-Path: agent_bootstrap.jar

vmlens的MANIFEST.MF文件中的引导类路径条目。

VMLens是一种轻量级的Java竞争条件捕获器,是作为Java代理构建的。 我们知道,编写Java代理可能是一件棘手的事情。 因此,如果您有任何问题,请在下面的评论中提问。

翻译自: https://www.javacodegeeks.com/2015/12/write-java-agent.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

48道C语言上机题参考答案,二级C语言上机题库参考答案(已修改).doc

二级C语言上机题库参考答案(已修改).doc下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档,不会出现我们的网址水印。3、该文档所得收入(下载内容预览)归上传者、…

Python练习-从小就背不下来的99乘法表

心血来潮,灵机一动,反正就是无聊的做了一个很简单的小玩意: for i in range(1,10):#让i 1-9 循环9次print("\n")#每循环一次进行一次换行for j in range(1,10):#让j 1-9 循环9次print(j, "x",i , "", i * j," ",end"")#输出…

快速排序 数组 函数 c语言,书上快速排序程序中子函数是怎样更改数组的?理论上不可实现啊...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼return不可能返回数组,于是子hanshu1quicksort最后没有用return,但是没有return又怎么可以更改a[N]?主函数中的quicksort(a, 0, N - 1);将a[N]复制后传递给形参a,quicksort(a, 0, N -…

(原创)SpringBoot入门

本文章是SpringBoot入门的介绍在这里 我会尽量写一些细节性的东西,我用的是IDEA2016 Tomcat7 JDK1.8 Maven3.3.9 IDEA Tomcat JDK Maven的安装我就不详细了, 这里我会提到Maven的安装和如何使用阿里云的镜像,因为官网的JAR下载真的是...比乌龟还慢 先从Maven的配置开始,到官…

jbox2d_JBox2D和JavaFX:事件与力量

jbox2d在昨天的示例中,您看到了如何创建一个简单的世界并使用WorldView进行显示,以及如何提供自定义渲染器。 现在,我们将添加一些用户输入。 我们将创建一个类似于弹球机中的鳍状肢的控件。 为此,我们将创建一个关节。 在JBox2D中…

整数因子分解c语言递归,整数因子分解:计算一个整数所有的分解式(递归实现)...

原始问题描述:对于给定的正整数n,计算n有多少种不同的分解式。例如,当n12时,有8种不同的分解式:1212,1262,1243,1234,12322,1226,12232 ,12223对n的每个因子递归搜索,代码如下:void solve (int …

Tomcat 部署了web项目中文乱码

本地Tomcat 启动,网页端的中文传到后台显示乱码。 查询前段已经设置了 UTF-8格式, 后台收到中文的依然是乱码,原来是Tomcat的配置问题。 修改Tomcat的配置文件server.xml ,添加一个属性 URIEncoding"UTF-8",…

电脑基础c语言,C语言经验: 如何从零基础学习C语言?

C语言是面向过程的,而C 是面向对象的C和C 之间的区别:C是一种结构化语言,其重点是算法和数据结构. 在C程序设计中,首先要考虑的是如何通过过程来处理输入(或环境条件)以获得输出(或实现过程(事务)控制).C ,首先要考虑的是如何构建…

Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程

本发明涉及android界面布局,特别是一种基于堆积木思想的卡片式Android动态布局方法。背景技术:在Android流行的今天,android App在生活中使用日益广泛,相对PC,手机由于界面的尺寸的限制,手机的UI设计和布局…

java cpu_Java High CPU故障排除指南–第1部分

java cpu本文是该系列的第1部分,它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 本指南也适用于独立的Java程序,但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产…

android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug

其实这文章有点傻逼。相关的问题TextView android:ellipsize“end”超出一个字符时不显示…的解决http://www.pocketdigi.com/20140122/1261.html上面我到没有遇到过。但是我遇到的更神奇。就是在使用android:ellipsize“end”正常的情况下这个属性。该textView的文本就不能加入…

适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine,Swarm和Compose实现。 是的,所有这三个工具一起使此博客更加有趣! 该图说明了关键组件: Docker Machine用于配置多个Docker主机 …

android 手机工具箱,Android工具箱下载

安卓工具箱专业版是款集所有功能于一身的工具箱!包括硬件和软件和工具,您的手机使用的信息。非常容易使用,具有非常用户友好的用户界面。 主要功能: 1。硬件信息:CPU核心,CPU类型,内存信息&…

日记

时间:18年4月15日下午将近2点 地点:北京昌平区 本来是在github上写技术博客。突然听到楼下小朋友的嘻戏声,也是不止一次让这种声音勾起了我的回忆。 这种声音就仿佛是自己小时候和小朋友玩一般,但是,我现在却是在北京。…

一键复制android代码,兼容安卓和ios实现一键复制内容到剪切板

js兼容安卓和ios实现粘贴板一键复制color: #000;background: #fff;overflow-y: scroll;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%;}html*{outline:0;-webkit-text-size-adjust: none;-webkit-tap-highlight-color: transparent}*{margin:0;padding:0}.conten…

adf时间作用域_ADF:在任务流终结器中支持bean作用域

adf时间作用域介绍 当我们需要在任务流消失之前做一些最终工作(干净的资源,紧密的连接等)时,这是使用任务流终结器的非常普遍的建议做法。 和往常一样,我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围…

贴一段自动编译java,并混淆编译的代码

刚写的一个自动编译、混淆、打包jar的代码&#xff0c;做个记录 用到的NuGet&#xff1a; <?xml version"1.0" encoding"utf-8"?> <packages><package id"DotNetZip" version"1.10.1" targetFramework"net45&qu…

android jpush json,发送了正确的JPush json却报1002

问题描述&#xff1a;调用jPushClient.sendPush前将PushPayload转换成JSON串打印到日志上&#xff0c;检查日志上的JSON发现没有错误&#xff0c;但是response返回报{"error": {"message": "Missing parameter", "code": 1002}}, jpus…

Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明

在六月&#xff0c;我们在博客上发布了一个新的内部状态机&#xff0c;用于管理用户&#xff0c;计时器和引擎线程之间的交互。 现在&#xff0c;我们对该代码进行了另一次大的内部清理&#xff0c;以使其更易于阅读和理解。 如前所述&#xff0c;所有操作&#xff08;插入&am…

BZOJ 4517 组合数+错排

思路&#xff1a; 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace std; #define int long long const int mod1000000007,N1000050; int cases,n,m,fac[N],s[N]; int pow(int x,int y){int res1;while(y){i…