您的位置:首页 > 运维架构 > 网站架构

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

2014-12-09 14:43 351 查看
引入:
上文中我们讲解了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的函数,我就略去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JDWP JPDA JVMTI
相关文章推荐