JPDA 架構研究16 - Agent利用環境指針訪問VM(方法訪問篇)

引入: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的函數,我就略去了。

相關文章
相關標籤/搜索