JPDA 架构研究16 - Agent利用环境指针访问VM(方法访问篇)

简介:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

引入:

上文中我们讲解了Agent如何利用环境指针来访问VM的字段访问部分,现在来讲解方法访问部分。


分类11:方法访问

a.GetMethodName. 获取方法名字和签名

jvmtiError
GetMethodName(jvmtiEnv* env,
            jmethodID method,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)


b.GetMethodDeclaringClass.获取方法声明的类

jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
            jmethodID method,
            jclass* declaring_class_ptr)


c.GetMethodModifiers. 获取方法的访问修饰符

jvmtiError
GetMethodModifiers(jvmtiEnv* env,
            jmethodID method,
            jint* modifiers_ptr)


d.GetMaxLocals.获取方法使用的局部变量

jvmtiError
GetMaxLocals(jvmtiEnv* env,
            jmethodID method,
            jint* max_ptr)

这个数值包含了方法入参中的变量数和方法体内用的局部变量数。


e.GetArgumentsSize. 获取方法的入参变量数

jvmtiError
GetArgumentsSize(jvmtiEnv* env,
            jmethodID method,
            jint* size_ptr)


f.GetLineNumberTable.获取某给定方法的行号表

typedef struct {
    jlocation start_location;
    jint line_number;
} jvmtiLineNumberEntry;
jvmtiError
GetLineNumberTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLineNumberEntry** table_ptr)

这个行号表来自于分析源代码


g.GetMethodLocation.  获取方法的位置

jvmtiError
GetMethodLocation(jvmtiEnv* env,
            jmethodID method,
            jlocation* start_location_ptr,
            jlocation* end_location_ptr)


h.GetLocalVariableTable.获取方法的本地变量列表。

typedef struct {
    jlocation start_location;
    jint length;
    char* name;
    char* signature;
    char* generic_signature;
    jint slot;
} jvmtiLocalVariableEntry;
jvmtiError
GetLocalVariableTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLocalVariableEntry** table_ptr)


i.GetByteCodes. 获取方法的字节码

jvmtiError
GetBytecodes(jvmtiEnv* env,
            jmethodID method,
            jint* bytecode_count_ptr,
            unsigned char** bytecodes_ptr)


j.IsMethodNative.判断某方法是否是native方法

jvmtiError
IsMethodNative(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_native_ptr)


k.IsMethodSynthetic.判断某方法是否是合成方法

jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_synthetic_ptr)

所谓合成方法就是不出现在源代码中而是由编辑器创造出来的方法。


l.IsMethodObsolete.判断某方法是否是过时的方法。

jvmtiError
IsMethodObsolete(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_obsolete_ptr)

判断该方法是否使用了一个过期的方法版本。



剩余还有一些JVMTI的函数,我就略去了。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587917,如需转载请自行联系原作者
目录
相关文章
|
10月前
|
Linux Anolis 异构计算
关于远程直接内存访问技术 RDMA 的高性能架构设计介绍
本文介绍 RDMA 技术的基本原理及交流在工程上的设计思路。
|
15天前
|
存储 人工智能 开发框架
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
19 0
|
2月前
|
消息中间件 存储 SQL
Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
【2月更文挑战第18天】Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
492 0
|
7月前
|
关系型数据库 MySQL Linux
Linux环境下LNMP架构实战案例
Linux环境下LNMP架构实战案例
|
8月前
|
存储 缓存 Kubernetes
基于 ACK Fluid 的混合云优化数据访问(一):场景与架构
基于 ACK Fluid 的混合云优化数据访问(一):场景与架构
|
9月前
|
关系型数据库 MySQL 应用服务中间件
Linux巩固篇020-Linux LNMP 架构部署动态网站环境
纸上得来终觉浅,绝知此事要躬行
136 0
|
11月前
|
数据采集 存储 负载均衡
大数据数据采集的数据采集(收集/聚合)的Flume之架构模式的并联Agent
在Flume中,架构模式是数据采集和传输过程中最核心的部分。Flume支持多种不同的架构模式,其中并联Agent架构模式是一种比较常见的模式。
97 0
|
12月前
|
数据采集 存储 监控
大数据数据采集的数据采集(收集/聚合)的Flume之架构模式的串联Agent
在Flume中,架构模式是数据采集和传输过程中最核心的部分。Flume支持多种不同的架构模式,其中串联Agent架构模式是一种比较常见的模式。
56 0
|
12月前
|
数据采集 存储 监控
大数据数据采集的数据采集(收集/聚合)的Flume之架构模式的单Agent
在Flume中,架构模式是数据采集和传输过程中最核心的部分。Flume支持多种不同的架构模式,其中单Agent架构模式是最常见的一种。
77 0
|
1天前
|
人工智能 数据安全/隐私保护 UED
Agent AI智能体的未来
Agent AI智能体的未来
http://www.vxiaotou.com