java agent-02-Java Instrumentation API

Java Instrumentation API是Java平台提供的一组API,它允许开发者在运行时通过修改字节码来监测和改变Java应用程序的行为。

这个API在Java SE 5(JDK 5)引入,为开发者提供了访问和操作类加载、字节码修改和类转换的能力,使得在Java应用程序运行时进行动态修改成为可能。

Java Instrumentation API的主要组成部分包括两个接口:Instrumentation和ClassFileTransformer。

1.Instrumentation接口

Instrumentation接口是Java Instrumentation API的核心部分,它位于java.lang.instrument包中。

该接口允许代理程序(即Java代理)与JVM进行交互,并在类加载过程中对类进行修改。

通过Instrumentation接口,代理程序可以实现以下功能:

•获取已加载的类信息,包括类的名称、方法、字段等。•修改类的字节码,实现对类的增强和拦截。•动态定义新的类。•获取和修改类加载器,实现自定义类加载器的功能。

要使用Instrumentation接口,代理程序需要在premain或agentmain方法中获取一个Instrumentation实例。这些方法是Java代理程序的入口点,premain在应用程序启动时调用,agentmain在应用程序运行时动态加载代理时调用。

2.ClassFileTransformer接口: ClassFileTransformer接口是用于在类加载过程中修改类字节码的关键接口。它位于java.lang.instrument包中。

通过实现ClassFileTransformer接口,代理程序可以在类被加载之前或之后,对类的字节码进行修改。在类加载期间,JVM会调用ClassFileTransformer的transform方法,代理程序可以在该方法中实现对类字节码的修改,并返回修改后的字节码。

ClassFileTransformer接口的方法:

loader:表示加载当前类的类加载器。className:表示正在加载的类的全限定名。classBeingRedefined:表示正在重定义的类的Class对象,若不是重定义,则为null。protectionDomain:表示保护该类域的域对象。classfileBuffer:表示类的字节码内容。

Java Instrumentation API为开发者提供了强大的能力,使得在Java应用程序运行时对类进行修改和增强成为可能。

但同时也需要注意,使用Java Instrumentation API需要小心谨慎,确保代理程序的操作是合理的,并且不会影响应用程序的稳定性和安全性。

实现接口

•MyAgent.java

最核心的就是最下面的方法。

•MyTransformer.java

我们只针对 com 开头的方法进行增强。

我们新建一个文件 src\\main\\resources\\META-INF\\MANIFEST.MF,内容如下:

需要指定我们定义的 Agent 路径。

生成的 agent jar 完整路径:

第一次测试的时候,发现自定义的 MANIFEST.MF 并没有被打包到最总的 jar 中,会导致找不到 Agent 信息。

我们可以在 pom 中指定:

我们创建一个简单的测试类

1) 编译

编译上面的类,然后到 classes 目录下

2) 运行

效果如下

https://blog.csdn.net/xixi8865/article/details/23849125

如何做一个api接口?

因为我是做Java开发的,所以就按照Java的开发流程说一下;首先一个好的API接口,设计是要下功夫的,细节就不在这里说了,这里还是主要说实现;如果开发环境具备,前后大概也就不到十分钟,就可以完成一个简单的API接口的开发(只是个demo)。

0、开发前准备:电脑上需要安装JDK、Maven和IDE。

1、新建一个基于Spring Boot的项目,为了快速完成,我选择登录到【

start.spring.io

】网站上,生成一个项目。通过【Search dependencies to add】可以选择需要引入的包,我这里只引入了Web,也就是Spring MVC;假如你需要通过Mybatis访问数据库,也可以在这里选择;然后点击生成项目。

2、将下载好的项目,解压后引入到你的IDE中,新建一个类:

com.wukong.apidemo.controller

3、在这个类中增加一个方法,并主要使用@RestController、@RequestMapping、@ResponseBody两个标签,整个类大概是这个样子:

4、这时候最简单的一个API接口就完成了,我们可以启动项目后,访问对应的接口地址,得到接口的返回信息:

5、我们再对这个接口稍微加工一些,让swagger帮助我们生成一个接口文档:

5.1、在

pom.xml

中进入swagger需要的包:

5.2、对ApiController增加:@Api、@ApiOperation、@ApiImplicitParams等标签:

5.3、这时候启动项目后,访问:

5.4、这里留了一个小问题,swagger的配置少了一步,按照上面的做饭,访问swagger的页面是会报404的,大家可以尝试解决。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。