iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java Agent探针技术详解示例
  • 939
分享到

Java Agent探针技术详解示例

2024-04-02 19:04:59 939人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是java agent?使用示例入门进阶(一款接口mock数据小插件)使用什么是java agent? 在JVM中运行中,类是通过classLoader加载.class文件进

什么是java agent?

JVM中运行中,类是通过classLoader加载.class文件进行生成的。在类加载加载.class文件生成对应的类对象之前时,我们可以通过修改.class文件内容(就是字节码修改技术),达到修改类的目的。jdk提供了对字节码进行操作的一系列api,而使用这些api开发出的程序就可以称之为java agent。

java agent能做什么?

不修改目标应用达到代码增强的目的,就好像springaop一样,但是java agent是直接修改字节码,而不是通过创建代理类。例如skywalking就是使用java agent技术,为目标应用代码植入监控代码,监控代码进行数据统计上报的。这种方式实现了解耦,通用的功能。

文末附上了我写的一款接口mock agent。感兴趣的可以看看,学习一波。

使用示例

入门

创建Maven工程

创建一个简单的maven工程:

添加agent类:

package com.hiwei;
import java.lang.instrument.Instrumentation;
public class DemoAgent {
    
    public static void premain(String arg, Instrumentation instrumentation) {
        System.out.println("执行premain方法");
    }
}

pom.xml打包配置

添加打包插件:

      <plugins>
        <plugin>
          <artifactId>maven-shade-plugin</artifactId>
          <executions>
            <execution>
              <phase>package</phase>
              <Goals>
                <goal>shade</goal>
              </goals>
              <configuration>
                <shadedartifactAttached>false</shadedArtifactAttached>
                <createDependencyReducedPom>true</createDependencyReducedPom>
                <createSourcesjar>true</createSourcesJar>
                <shadeSourcesContent>true</shadeSourcesContent>
                <transfORMers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <manifestEntries>
                      <!-- 包含premain方法的类 -->
                      <Premain-Class>${premain.class}</Premain-Class>
                      <!-- 对目标类字节码操作权限 -->
                      <Can-Redefine-Classes>${can.redefine.classes}</Can-Redefine-Classes>
                      <!-- 对目标类字节码操作权限 -->
                      <Can-Retransform-Classes>${can.retransform.classes}</Can-Retransform-Classes>
                    </manifestEntries>
                  </transformer>
                </transformers>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>

将工程打成jar包,就可以使用了。打包很简单:

在target目录下就出现了jar包:

使用agent

创建测试类:

package com.hiwe.demo.cache;
public class TestCache {
    public static void main(String[] args) {
        System.out.println("测试类");
    }
}

添加javaagent参数配置:

-javaagent:D:\person-project\demo-agent\target\demo-agent-1.0-SNAPSHOT.jar

运行测试类:

进阶(一款接口mock数据小插件)

流程

使用java agent为接口mock数据

agent类:

package com.hiwei.test.agent;
import com.hiwei.test.agent.utils.StringUtils;
import java.io.*;
import java.lang.instrument.Instrumentation;
import java.NIO.charset.StandardCharsets;
public class DemoAgent {
    
    public static void premain(String arg, Instrumentation instrumentation) {
        //读取mock文件
        try {
            FileInputStream file = new FileInputStream(arg);
            BufferedReader rd = new BufferedReader(new InputStreamReader(file, StandardCharsets.UTF_8));
            String configStr = readToString(rd);
            if(StringUtils.isNotEmpty(configStr)){
                MockConfig.parseConfig(configStr);
                instrumentation.addTransformer(new DemoTransformer());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static String readToString(Reader rd) throws IOException {
        StringBuilder sb = new StringBuilder();
        int i;
        while ((i = rd.read()) != -1) {
            sb.append((char) i);
        }
        return sb.toString();
    }
}

mock数据配置类

package com.hiwei.test.agent;
import com.alibaba.fastJSON.jsONObject;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MockConfig {
    private static Map<String, Map<String, Object>> mockData = new HashMap<>();
    public static void parseConfig(String configStr) {
        JSONObject config = JSONObject.parseObject(configStr);
        Set<String> classNameSet = config.keySet();
        classNameSet.forEach(className -> {
            Map<String, Object> methodMock = new HashMap<>();
            JSONObject methods = config.getJSONObject(className);
            Set<String> mSet = methods.keySet();
            mSet.forEach(m -> {
                methodMock.put(m, methods.get(m));
            });
            mockData.put(className, methodMock);
        });
    }
    public static boolean isMock(String className) {
        return !(mockData.get(className) == null);
    }
    public static Object getMockData(String className, String methodName) {
        Map<String, Object> stringJSONObjectMap = mockData.get(className);
        if (stringJSONObjectMap != null) {
            return stringJSONObjectMap.get(methodName);
        }
        return null;
    }
}

字节码操作类

package com.hiwei.test.agent;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import java.lang.instrument.ClassFileTransformer;
import java.security.ProtectionDomain;
public class DemoTransformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
        ClassPool classPool = ClassPool.getDefault();
        String realClassName = className.replaceAll("/", ".");
        //获取类
        if(MockConfig.isMock(realClassName)){
            try {
                CtClass ctClass = classPool.get(realClassName);
                CtMethod[] declaredMethods = ctClass.getDeclaredMethods();
                for (CtMethod m : declaredMethods) {
                    String mName = m.getName();
                    Object mockData = MockConfig.getMockData(realClassName, mName);
                    if(mockData!=null){
                        String mock = String.format("if(true){%s}", mockData);
                        m.insertBefore(mock);
                    }
                }
                return ctClass.toBytecode();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
        return classfileBuffer;
    }
}

配置文件:mock.json

{
  "com.hiwei.test.DemoService":{  -- 类名
    "add":"return 123;",   -- 方法名:mock代码
    "delete":"return \"mock delete\";",
    "getUser": "com.hiwei.test.User user2 = new com.hiwei.test.User();return user2;"
  }
}

使用

配置参数:

-javaagent:D:\person-project\java-agent\demo-agent\target\demo-agent-1.0-SNAPSHOT.jar=D:\person-project\java-agent\agent-test\mock.json

源码链接:https://GitHub.com/hiwei-zhang/java-agent

到此这篇关于Java Agent探针技术详解示例的文章就介绍到这了,更多相关Java Agent内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java Agent探针技术详解示例

本文链接: https://www.lsjlt.com/news/151639.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Agent探针技术详解示例
    目录什么是java agent使用示例入门进阶(一款接口mock数据小插件)使用什么是java agent 在JVM中运行中,类是通过classLoader加载.class文件进行生...
    99+
    2024-04-02
  • Java Agent (代理)探针技术详情
    目录前言:Java Agent 技术简介Java Agent 功能介绍Java Agent 实现原理Java Agent 案例前言: Java 中的 Agent 技术可以让我们无侵入...
    99+
    2024-04-02
  • Java绘图技术的详解及实例
    Java绘图技术的详解及实例简单实例public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Dem...
    99+
    2023-05-31
    java 绘图 ava
  • Java WebService技术详解
    Java WebService技术是一种用于构建分布式应用程序的技术,它允许不同的应用程序通过网络进行通信和交互。Java WebS...
    99+
    2023-08-11
    java
  • Java HttpClient技术详解
    目录一、HttpClient1.1、 前台系统访问后台接口的方式1.2、 什么是HttpClient1.3、 HttpClient入门案例1.3.1、 发起Get请求1.3.2、 带...
    99+
    2024-04-02
  • Java反射技术详解
    目录前言一、基本反射技术1.1 根据一个字符串得到一个类getClass方法Class.forNameType属性二、获取类的成员获取类中特定的构造方法调用构造方法调用类的私有方法获...
    99+
    2024-04-02
  • Android 中SQLite技术实例详解
    Android和iOS的数据库都是用SQLite来实现.一,SQLite数据库简介:轻量级:SQLite数据库是一个轻量级的数据库,适用于少量数据的CURD;文件本质:SQLite数据库支持大部分SQL语法,允许使用SQL语句操作数据库,其...
    99+
    2023-05-31
    android sqlite lite
  • Compose 动画艺术探索之可见性动画示例详解
    目录正文从可见性动画看起进入过渡——EnterTransition关闭过渡——ExitTransition过渡—&mdas...
    99+
    2024-04-02
  • C语言指针教程示例详解
    目录指针内存指针类型指针运算二级指针指针数组指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作...
    99+
    2024-04-02
  • JavaWeb之会话技术案例详解
    会话技术     1. 会话:一次会话中包含多次请求和响应。          &...
    99+
    2024-04-02
  • JavaWeb会话技术详解与案例
    1.什么是会话: 2.会话技术有哪些: 什么是Cookie? Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Sessi...
    99+
    2024-04-02
  • java多线程编程技术详解和实例代码
     java多线程编程技术详解和实例代码1.   Java和他的API都可以使用并发。可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序范围内...
    99+
    2023-05-31
    java 多线程 编程
  • Java SpringAOP技术之注解方式详解
    目录1.配置xml扫描注解 2.配置注解3.配置文件中开启自动代理4.通知类型注解5.测试类6.结果 总结1.配置xml扫描注解  <xml ve...
    99+
    2024-04-02
  • C++中常量与指针的示例详解
    前言 和指针联用有佷微妙的地方,之前一直佷晕,现在来继续研究下。诸如以下: int const; const int; const int* p; int const* p; i...
    99+
    2024-04-02
  • 详解Java动态字节码技术
    目录对 Debug 的好奇ASM动态生成字节码ASM 框架常用方法InstrumentJVM TI介绍Agent使用agent生成代码实现被修改的类AgentAttacher小结对 ...
    99+
    2024-04-02
  • Java绘图技术基础(实例讲解)
    如下所示:public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 demo=new D...
    99+
    2023-05-31
    java 绘图技术 ava
  • OpenSCA技术原理npm依赖示例解析
    目录npm介绍package-lock.jsonpackage.jsonnpm介绍 本文主要介绍基于npm包管理器的组件成分解析原理。 npm(全称Node Package Man...
    99+
    2023-02-17
    OpenSCA技术npm依赖 OpenSCA npm
  • Android再探全面屏适配示例详解
    目录前言Android P前后对不同的场景做适配状态栏导航栏和底部横条1. SYSTEM_UI_FLAG_HIDE_NAVIGATION2. SYSTEM_UI_FLAG_FULLS...
    99+
    2023-03-01
    Android全面屏适配 Android 全面屏
  • C++ 左值引用与一级指针示例详解
    将左值引用用于一级指针时,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa = pa; ...
    99+
    2024-04-02
  • go语言结构体指针操作示例详解
    目录指针go指针操作不能操作不合法指向new函数指针做函数的参数数组指针结构体指针变量结构体成员普通变量结构体成员指针变量结构体比较和赋值结构体作为函数参数指针 指针是代表某个内存地...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作