引入:jvm
上文中咱們講解了Agent如何利用環境指針來訪問VM的字段訪問部分,如今來說解方法訪問部分。編輯器
分類11:方法訪問ide
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. 獲取方法的訪問修飾符code
jvmtiError GetMethodModifiers(jvmtiEnv* env, jmethodID method, jint* modifiers_ptr)
d.GetMaxLocals.獲取方法使用的局部變量it
jvmtiError GetMaxLocals(jvmtiEnv* env, jmethodID method, jint* max_ptr)
這個數值包含了方法入參中的變量數和方法體內用的局部變量數。io
e.GetArgumentsSize. 獲取方法的入參變量數table
jvmtiError GetArgumentsSize(jvmtiEnv* env, jmethodID method, jint* size_ptr)
f.GetLineNumberTable.獲取某給定方法的行號表class
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的函數,我就略去了。