对于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

如何编写Java代理相关推荐

  1. java编写代理服务器_如何编写Java代理

    java编写代理服务器 对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用"静态公共静态无效值pre ...

  2. Java代理初学者指南

    尽管Java初学者很快学会了键入public static void main来运行他们的应用程序,但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支持: premain ...

  3. 通过 Lotus Domino Java 代理消费 Web 服务

    Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计.这种服务的主要优点是,它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法.例如,我们的公司使用 Web 服务从一台运行 ...

  4. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  5. 什么是动态代理?动态代理有哪些应用?如何编写动态代理案例

    什么是动态代理? 当我们需要给某个类或者接口中的方法添加一些额外的功能比如日志.事务的时候,可以通过创建一个代理类来实现这些功能:该代理类既包含了原有类的完整功能,同时在这些功能的基础上添加了其他的逻 ...

  6. Java~Java代理模式

    代理模式: 设计模式就是一套被反复使用.多数人知晓的.经过 分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人 理解并且保证代码可靠性.代理模式就是其中一种. 给某一个对 ...

  7. 使用JMockit编写java单元测试

    之前<有效使用Mock编写java单元测试>一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具--JMockit. 引用单元测试中mo ...

  8. 【java代理】动态代理

    java代理机制 Table of Contents 1 引言 2 常见的代理 3 代理模式UML图 4 代理模式实例 5 java动态代理 5.1 java动态代理UML图 6 代理模式与装饰者模式 ...

  9. 学习Java——代理

    目录 静态代理 动态代理 动态代理的几种实现方式 Java实现动态代理的大致步骤 Java 实现动态代理主要涉及哪几个类 动态代理实现 jdk动态代理 cglib动态代理 AOP 每日寄语 静态代理 ...

最新文章

  1. HttpSession常见问题
  2. Orecle基本概述(2)
  3. Hbuilder MUI里面使用java.net.URL发送网络请求,操作cookie
  4. 飞畅科技-工业交换机接口类型介绍
  5. 计算机启动软件,计算机软件及应用启动会-20210703001237.pptx-原创力文档
  6. 阿里云发布ECS磁盘加密,一键加密,业务0改动 1
  7. apk提取加密素材_从apk包中提取unity资源
  8. 2020护网参考学习 关于护网行动的总结
  9. 服务器安装lnmp的时候出现client_loop: send disconnect: Connection reset by peer
  10. php 数组导出csv_php导出百万数据到csv
  11. 我的缅甸往事(一) | 个人在缅甸的真实经历
  12. 用键盘控制鼠标移动的Python脚本
  13. 等保2.0控制点总结
  14. PPT超实用的23个快捷键
  15. KendoUI学习笔记
  16. c语言(vd6.0) sleep函数用法 及delay用法
  17. Speedoffice(word)如何修改行间距和段落间距
  18. Android Studio 下载
  19. 毕业设计java 课程精品网站,java毕业设计_springboot框架的精品课程网站
  20. LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法

热门文章

  1. 很简单很简单的DBHelper类
  2. java后台手动分页
  3. 2015蓝桥杯省赛---java---C---3(无穷分数)
  4. 在dialog中使用EditText键盘弹不起来的解决方法
  5. win10控制视频声音大小
  6. 2012三年大专计算机试题医学,计算机原理2012年4月真题(02384)
  7. 转:IDEA 创建类注释模板和方法注释模板
  8. java中两个map的融合(两个map有相同字段)
  9. jetty java_Jetty,Java和OAuth入门
  10. openjdk-7支持版本_长期支持对OpenJDK意味着什么?