ConstantPool结构
2021/11/14 23:39:48
本文主要是介绍ConstantPool结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
结构图
本图来自揭秘Java虚拟机(JVM设计原理与实现)
数据存放源码
put
void slot_at_put(int which, CPSlot s) const { assert(is_within_bounds(which), "index out of bounds"); assert(s.value() != 0, "Caught something"); *(intptr_t*)&base()[which] = s.value(); } intptr_t* obj_at_addr_raw(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (intptr_t*) &base()[which]; } jint* int_at_addr(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (jint*) &base()[which]; } jlong* long_at_addr(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (jlong*) &base()[which]; } jfloat* float_at_addr(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (jfloat*) &base()[which]; } jdouble* double_at_addr(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (jdouble*) &base()[which]; }
// For temporary use while constructing constant pool void klass_index_at_put(int which, int name_index) { tag_at_put(which, JVM_CONSTANT_ClassIndex); *int_at_addr(which) = name_index; } // Temporary until actual use void unresolved_klass_at_put(int which, Symbol* s) { release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass); slot_at_put(which, s); } void method_handle_index_at_put(int which, int ref_kind, int ref_index) { tag_at_put(which, JVM_CONSTANT_MethodHandle); *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind; } void method_type_index_at_put(int which, int ref_index) { tag_at_put(which, JVM_CONSTANT_MethodType); *int_at_addr(which) = ref_index; } void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) { tag_at_put(which, JVM_CONSTANT_InvokeDynamic); *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index; } void unresolved_string_at_put(int which, Symbol* s) { release_tag_at_put(which, JVM_CONSTANT_String); *symbol_at_addr(which) = s; } void int_at_put(int which, jint i) { tag_at_put(which, JVM_CONSTANT_Integer); *int_at_addr(which) = i; } void long_at_put(int which, jlong l) { tag_at_put(which, JVM_CONSTANT_Long); // *long_at_addr(which) = l; Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l)); } void float_at_put(int which, jfloat f) { tag_at_put(which, JVM_CONSTANT_Float); *float_at_addr(which) = f; } void double_at_put(int which, jdouble d) { tag_at_put(which, JVM_CONSTANT_Double); // *double_at_addr(which) = d; // u8 temp = *(u8*) &d; Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d)); } Symbol** symbol_at_addr(int which) const { assert(is_within_bounds(which), "index out of bounds"); return (Symbol**) &base()[which]; } void symbol_at_put(int which, Symbol* s) { assert(s->refcount() != 0, "should have nonzero refcount"); tag_at_put(which, JVM_CONSTANT_Utf8); *symbol_at_addr(which) = s; } void string_at_put(int which, int obj_index, oop str) { resolved_references()->obj_at_put(obj_index, str); } // For temporary use while constructing constant pool void string_index_at_put(int which, int string_index) { tag_at_put(which, JVM_CONSTANT_StringIndex); *int_at_addr(which) = string_index; } void field_at_put(int which, int class_index, int name_and_type_index) { tag_at_put(which, JVM_CONSTANT_Fieldref); *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; } void method_at_put(int which, int class_index, int name_and_type_index) { tag_at_put(which, JVM_CONSTANT_Methodref); *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; } void interface_method_at_put(int which, int class_index, int name_and_type_index) { tag_at_put(which, JVM_CONSTANT_InterfaceMethodref); *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice } void name_and_type_at_put(int which, int name_index, int signature_index) { tag_at_put(which, JVM_CONSTANT_NameAndType); *int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice }
tags
Array<u1>* tags() const { return _tags; }
void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); } // 常量池类型标志
这篇关于ConstantPool结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-09cosmos 开发是什么-icode9专业技术文章分享
- 2024-07-09Cosmos 示例-icode9专业技术文章分享
- 2024-07-09安装Cosmos SDK-icode9专业技术文章分享
- 2024-07-09ubuntu 安装 cosmos-icode9专业技术文章分享
- 2024-07-09cosmos 开发能做到跨链吗-icode9专业技术文章分享
- 2024-07-09app 未公示个人信息的收集范围 的解决办法-icode9专业技术文章分享
- 2024-07-08测试人员在 Scrum 中的角色是什么?
- 2024-07-07Dify + TiDB Vector,快速构建你的AI Agent
- 2024-07-06有没有什么开源的py项目可以对图像进行分类-icode9专业技术文章分享
- 2024-07-05feign默认connecttimeout和readtimeout是多少-icode9专业技术文章分享