引入:

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