JPDA 架构研究13 - Agent利用环境指针访问VM(类管理篇)

简介:

引入:

上文中提到Agent如何利用环境指针访问VM的(Watch)功能,这里主要讲解如何去管理类的。


分类9:管理类

a.GetLoadedClasses. 获得虚拟机中所有被加载的类的数组。

jvmtiError
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
              jclass** classes_ptr)

从返回值可以看出,class_count_ptr表示被加载的类的数量,classes_ptr表示类的数组列表。

注意,这里不包含内置类型对应的包装器类。比如说java.lang.Integer.TYPE就不包含在此列表中。


b.GetClassLoaderClasses.获取虚拟机中所有的Classloader所管理的类。

jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
            jobject initiating_loader,
            jint* class_count_ptr,
            jclass** classes_ptr)


c.GetClassSignature.获取某类的签名

jvmtiError
GetClassSignature(jvmtiEnv* env,
            jclass klass,
            char** signature_ptr,
            char** generic_ptr)

这里的签名是用的JNI类型签名方式,比如说java.util.List 的类签名是 "Ljava/util/List;"  而 int[] 的类签名是 "[I"


d.GetClassStatus.获取类状态

jvmtiError
GetClassStatus(jvmtiEnv* env,
            jclass klass,
            jint* status_ptr)

类的有如下状态,分别用状态标志位来表示:

JVMTI_CLASS_STATUS_VERIFIED 1 类的字节码已经被修改
JVMTI_CLASS_STATUS_PREPARED 2 类准备状态已经完成  
JVMTI_CLASS_STATUS_INITIALIZED 4 类初始化完毕,静态初始化块已运行 S
JVMTI_CLASS_STATUS_ERROR 8 类初始化错误,因此不可使用。  
JVMTI_CLASS_STATUS_ARRAY 16 类是个数组
JVMTI_CLASS_STATUS_PRIMITIVE 32  类是个原子类(比如 java.lang.Integer.TYPE).     


e.GetSourceFileName.获取指定类的源代码文件名

jvmtiError
GetSourceFileName(jvmtiEnv* env,
            jclass klass,
            char** source_name_ptr)


f.GetClassModifiers.获取类的访问修饰符

jvmtiError
GetClassModifiers(jvmtiEnv* env,
            jclass klass,
            jint* modifiers_ptr)

一般类的访问修饰符就是 public/private/protected ,另外还有final.

另外,如果类是原子类(比如java.lang.Integer.TYPE),则它的访问修饰符必定是public final.并且一定没有对应的interface.


g.GetClassMethods.获取类的方法列表。

jvmtiError
GetClassMethods(jvmtiEnv* env,
            jclass klass,
            jint* method_count_ptr,
            jmethodID** methods_ptr)

按照约定,分别返回方法数量以及方法的列表。注意,这个方法列表还包括构造器和静态初始块。


h.GetClassFields.获取类的字段列表。

jvmtiError
GetClassFields(jvmtiEnv* env,
            jclass klass,
            jint* field_count_ptr,
            jfieldID** fields_ptr)

注意,这个字段列表只包含直接声明的字段,不包含它从父类中继承过来的字段。字段的返回顺序精确的等同于在类文件中声明的顺序。


i.GetImplementedInterfaces.获取类所实现的接口

jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
            jclass klass,
            jint* interface_count_ptr,
            jclass** interfaces_ptr)

注意,对于类来说,这里只返回它直接implements XXX,XXX的接口。

对于接口来说,这里返回它 extends XXX的接口。


j.IsInterface.判断某类是否是一个接口

jvmtiError
IsInterface(jvmtiEnv* env,
            jclass klass,
            jboolean* is_interface_ptr)


k.IsArrayClass.判断某类是否是一个数组类

jvmtiError
IsArrayClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_array_class_ptr)


l.GetClassLoader.获取某类对应的类加载器的引用。

jvmtiError
GetClassLoader(jvmtiEnv* env,
            jclass klass,
            jobject* classloader_ptr)


m.GetSourceDebugExtension.获取类的debug扩展信息。

jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
            jclass klass,
            char** source_debug_extension_ptr)


n.RedefineClasses.重新定义一组类 (强大的热交换技术)

typedef struct {
    jclass klass;
    jint class_byte_count;
    const unsigned char* class_bytes;
} jvmtiClassDefinition;
jvmtiError
RedefineClasses(jvmtiEnv* env,
            jint class_count,
            const jvmtiClassDefinition* class_definitions)

这功能挺有趣,因为如果指定的字节码,则重新定义某类。所以该方法通过传入一组字节码来重新定义一组类。重新定义某类之后,对于该类会有如下一些改变:

(1).线程无需被挂起。

(2).类中的所有断点都被清除。

(3).所有属性都被更新。(注意,这里的属性是class对象的属性,不是类文件中的属性,那个叫字段field)

(4).类的已有的所有实例,其在堆上的ID都不受影响,其含有的字段值都不受影响。

另外,对于类的重新定义,也有些约束:

(1)重定义可以改变方法体,常量池,字段。

(2)重定义不可以添加/修改/删除任何类中的方法和字段。

(3)重定义不可以修改方法签名,改变访问修饰符和继承关系。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587816,如需转载请自行联系原作者
目录
相关文章
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
255 3
|
算法
鬼手操控着你的手机?大模型GUI智能体易遭受环境劫持
【9月更文挑战第27天】近年来,随着人工智能技术的发展,多模态大语言模型(MLLM)在图形用户界面(GUI)中广泛应用,提升了交互体验。然而,最新研究《环境警示:多模态智能体易受环境干扰》指出,这些智能体可能因环境干扰而行为失准。作者通过实验展示了即使是强大模型也会受无关因素影响,导致不可靠或不可预测的行为。研究还证实,通过环境注入攻击可进一步加剧此问题。尽管如此,多模态GUI智能体依然潜力巨大,未来需改进感知能力和算法以增强鲁棒性,解决环境干扰问题。论文详细内容见:https://arxiv.org/abs/2408.02544。
429 8
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
展望未来,随着5G、边缘计算等新技术的兴起,微服务架构的设计理念将会更加深入人心,Spring Cloud和Netflix OSS也将继续引领技术潮流,为企业带来更为高效、灵活且强大的解决方案。无论是对于初创公司还是大型企业而言,掌握这些前沿技术都将是在激烈市场竞争中脱颖而出的关键所在。
455 0
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
1626 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
存储 人工智能 自然语言处理
Cursor这类编程Agent软件的模型架构与工作流程
编程Agent的核心是一个强大的大语言模型,负责理解用户意图并生成相应的代码和解决方案。这些模型通过海量文本和代码数据的训练,掌握了广泛的编程知识和语言理解能力。
1446 1
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
933 4
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
244 2
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
528 2