引入:
上文中我们讲解了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的函数,我就略去了。