引入:
上文中我们讲解了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,如需转载请自行联系原作者