引入:

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

分类11:方法访问

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

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

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

jvmtiErrorGetMethodDeclaringClass(jvmtiEnv* env,            jmethodID method,            jclass* declaring_class_ptr)

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

jvmtiErrorGetMethodModifiers(jvmtiEnv* env,            jmethodID method,            jint* modifiers_ptr)

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

jvmtiErrorGetMaxLocals(jvmtiEnv* env,            jmethodID method,            jint* max_ptr)

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

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

jvmtiErrorGetArgumentsSize(jvmtiEnv* env,            jmethodID method,            jint* size_ptr)

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

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

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

g.GetMethodLocation.  获取方法的位置

jvmtiErrorGetMethodLocation(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;
jvmtiErrorGetLocalVariableTable(jvmtiEnv* env,            jmethodID method,            jint* entry_count_ptr,            jvmtiLocalVariableEntry** table_ptr)

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

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

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

jvmtiErrorIsMethodNative(jvmtiEnv* env,            jmethodID method,            jboolean* is_native_ptr)

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

jvmtiErrorIsMethodSynthetic(jvmtiEnv* env,            jmethodID method,            jboolean* is_synthetic_ptr)

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

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

jvmtiErrorIsMethodObsolete(jvmtiEnv* env,            jmethodID method,            jboolean* is_obsolete_ptr)

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

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