根据JVM规范得到class 文件结构定义如下: ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class ; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count -1]:对应的常量池数组 u2 access_flags:访问修饰符,如:public,private,protected,violated, u2 this_class:当前类的类名 u2 super_class :当前类的父类 u2 interfaces_count:当前类实现的接口数 u2 interfaces[interfaces_count]:当前类实现的接口列表 u2 fields_count:当前类的字段数量
字节码文件的格式固定如下: type descriptor u4 magic u2 minor_version u2 major_version u2 constant_pool_count cp_info constant_pool[cosntant_pool_count – 1] u2 access_flags u2 this_class u2 super_class u2 interfaces_count u2 interfaces[interfaces_count] u2 fields_count field_info fields[fields_count minor_version(u2):00 00,小版本号,因为我这里采用的1.7,所以小版本号为0. major_version(u2):00 33,大版本号,x033转换为十进制为51,下表是jdk method_info:方法表,其结构如下: Type Descriptor u2 access_flag u2 name_index u2 descriptor_index u2
SQL> create user u2 identified by u2; User created. SQL> grant execute on proc_case1 to u2; Grant succeeded. -- 创建存储过程同义词 SQL> conn u2/u2 Connected. SQL> conn u2/u2 Connected. : U2 SYS[U2]> create synonym proc_case1 for u1.proc_case1; Query OK, 0 rows affected (0.05 sec) SYS[U2 U2[U2]> set serveroutput on; Query OK, 0 rows affected (0.44 sec) U2[U2]> call proc_case1(); Query
类型 数量 名称 中文含义 u4 1 magic 魔数 u2 1 minor_version 小版本号 u2 1 major_version 大版本号 u2 1 constant_pool_count 常量数 cp_info constant_pool_count - 1 constant_pool 常量池 u2 1 access_flags 访问标记 u2 1 this_class 当前类 u2 1 super_class 父类 u2 1 interfaces_count 实现的接口数 u2 interfaces_count interfaces 接口列表 u2 1 fields_count 字段个数 { u2 : start_pc; (字节码的开始偏移量) u2 : end_pc; (字节码的结束偏移量) u2 : handler_pc; (catch异常的处理代码偏移量) u2 ) u2 : length; (变量声明周期的结束量) u2 : name_index; (常量池引用) u2 : decriptor_index; (描述引用) u2 : index
; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; ? { u2 start_pc; u2 length; u2 name_index; u2 descriptor_index ; { u2 start_pc; u2 length; u2 name_index; u2
无符号数属于基本的数据类型,以 u1、u2、u4、u8 分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或 utf-8 编码构成的字符串值。 每一个 class 文件对应于一个如下所示的 ClassFile 结构体: ClassFile { u4 magic;//魔数 u2 minor_version;//副版本号 u2 major_version ;//主版本号 u2 constant_pool_count;//常量池计数器, cp_info constant_pool[constant_pool_count-1];//常量池列表 u2 access_flags ;//访问标志 u2 this_class;//类索引,表示这个Class文件所定义的类或接口 u2 super_class;//父类索引 u2 interfaces_count;//接口计数器 u2 ];//字段表 u2 methods_count;//方法计数器 method_info methods[methods_count];//方法表 u2 attributes_count;//属性计数器
, u1 == u2) fmt.Println("u1 equals u2?" , u1 == u2) fmt.Println("u1 equals u2 with same pointer?" , u1 == u2) fmt.Println("u1 equals u2 with different pointer?" , cmp.Equal(u1, u2)) } 上面的例子中,我们将==与cmp.Equal放在一起做个比较: 在指针类型的字段Contact未设置时,u1 == u2和cmp.Equal(u1, u2 而cmp.Equal(u1, u2)可以比较指针指向的内容,从而返回true。 以下是运行结果: u1 == u2? true u1 equals u2?
类文件的格式如下: ClassFile { u4 magic; u2 minor_version; u2 -1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 is created: bool _synthetic_flag; int _sde_length; char* _sde_buffer; u2 instanceKlassHandle _super_klass; ConstantPool* _cp; Array<u2>* _fields; Array<Method*
其结构在 Java虚拟机规范中有如下定义: ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool [constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count ]; u2 fields_count; field_info fields[fields_count]; u2
u2 major_version; u2 constant_pool_count; cp_info constant_pool [constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count 无符号数是基本类型,u1、 u2、 u4、 u8 分别表示 1 个字节、 2 个字节、 4 个字节和 8 个字节的无符号数。
名称 类型 数量 attribute_name_index u2 1 attribute_length u4 1 max_stack u2 1 max_locals u2 1 code_length u4 名称 类型 数量 attribute_name_index u2 1 attribute_length u4 1 number_of_exceptions u2 1 exception_index_table 名称 类型 数量 attribute_name_index u2 1 attribute_length u4 1 line_number_table_length u2 1 line_number_table u2 1 name_indec u2 1 descriptor_index u2 1 index u2 1 ? u2 1 inner_class_access_flags u2 1 参考《深入理解Java虚拟机》
minor_version;//Class 的小版本号 u2 major_version;//Class 的大版本号 u2 access_flags;//Class 的访问标记 u2 this_class;//当前类 u2 super_class;//父类 u2 interfaces_count;//接口 u2 interfaces[interfaces_count];//一个类可以实现多个接口 2.2 Class 文件版本 u2 minor_version;//Class 的小版本号 u2 major_version;//Class 的大版本号 紧接着魔数的四个字节存储的是 Class 文件的版本号 查看类的访问标志 2.5 当前类索引,父类索引与接口索引集合 u2 this_class;//当前类 u2 super_class;//父类 u2 interfaces_count;//接口 u2
值为9 index u2 指向声明字段的类或接口描述符CONSTANT_Class_info的索引项 index u2 指向字段描述符CONSTANT_NameAndType的索引项 CONSTANT_Methodref_info tag u1 值为10 index u2 指向声明方法的类描述符CONSTANT_Class_info的索引项 index u2 指向名称及类型描述符CONSTANT_NameAndType的索引项 u2 指向名称及类型描述符CONSTANT_NameAndType的索引项 CONSTANT_NameAndType_info tag u1 值为12 index u2 指向该字段或方法名称常量项的索引 index u2 指向该字段或方法描述的索引 CONSTANT_MethodHandle_info tag u1 值为15 reference_kind u2 值必须在[1,9]之间,它决定了方法句柄的类型 u2 值必须是对当前常量池的有效索引,常量池在该处的索引必须是CONSTANT_NameAndType_info结构,表示方法名和方法描述符 参考《深入理解Java虚拟机》
minor_version;//Class 的小版本号 u2 major_version;//Class 的大版本号 u2 constant_pool_count ;//Class 的访问标记 u2 this_class;//当前类 u2 super_class;//父类 u2 interfaces_count;//接口 u2 interfaces[interfaces_count];//一个类可以实现多个接口 u2 2.2 Class 文件版本 u2 minor_version;//Class 的小版本号 u2 major_version;//Class 2.5 当前类索引,父类索引与接口索引集合 u2 this_class;//当前类 u2 super_class;//父类 u2
在经历过了魔数(u4)、文件版本(u2+u2)、常量池(u2(常量池元素的数量)+具体字节数)、类访问标记(u2)、类索引(u2)、父类索引(u2)、接口(u2(接口的数量) + 具体的字节数)之后,我们便进入了类的内部 字段表主要由以下属性构成: u2的访问标志 u2的简单名称索引 u2的描述符 u2的字段属性数量 具体的属性信息 access_flags 作为一个熟悉Java开发的同学来说,对于的类中的字段的修饰符必定不会陌生
= 1, dx = x2 – x1, dy; //u1为始点参数,初值0;u2为终点参数,初值1 if (clipTest(-dx, x1-XL, &u1, &u2)) //计算左边界交点参数 ,更新u1,u2 if (clipTest(dx, XR-x1, &u1, &u2)) //计算右边界交点参数,更新u1,u2 { dy=y2-y1 ; if(clipTest(-dy, y1-YB, &u1, &u2)) //计算下边界交点参数,更新u1,u2 if (clipTest(dy, YT-y1, &u1, &u2))//计算上边界交点参数,更新u1,u2 { if(u2 < 1){ ) *u2 = r; } else if (q < 0) retVal = 0; return retVal; }
u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count -1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exception_table[exception_table_length
jvm规范,类文件的结构如下: classFile{ u4 magic; #魔数,表示其是否是类文件,0-3字节,ca fe ba be u2 minor_version; #版本,4-7字节,类的版本,其中34表示java8 u2 major_version; #主版本, u2 access_flags; #访问标记 u2 super_class; #父类信息 u2 interfaces_count;#接口信息 u2 interfaces[interfaces_count]; u2 fields_count; #字段信息,成员变量信息 field_info ]; u2 attributes_count; #属性信息 attribute_info attributes[attributes_count
abstract class U{ } class u1 extends U{ public static function create(){ return new u1(); } } class u2 extends U{ public static function create(){ return new u2(); } } 这段代码正常工作是没问题,但大量重复的代码会很烦人 我不想在每个子类中添加 public static function create(){ return new self(); } } class u1 extends U{ function a(){} } class u2 class U{ public static function create(){ return new static(); } } class u1 extends U{ } class u2 extends U{ static function getGroup(){ return ‘u2’; } } class u3 extends u2{ } print_r(u1::create
U2:实时同步可以做到吗 U2:或者准实时也行 U1:据说现在 goldengate 也支持 oracle到 pg 的同步,但我没用过 U3:navicat里面有同步的功能,不知道是不是可以直接同步到PG U2:开源的吗Dts U6:不开源 云服务 U2:亚马逊云上有同类产品吗 U6:也有 讨论话题2: 有没有大神知道怎么静默按照19c rac的呢? :静默安装官方不支持的 U2:不过RAC on docker的官方方法里有步骤 U3:Oracle在容器里运行? 不应该返回一行吗 讨论精选: U1:没错,系统就是设计的 U2:为啥?有一个就应该看到一个呀,不然会以为没有gap呢? U2:你现在是 real time apply 吗?146的 日志,在备库 用 rman 的 list archivelog all 能显示出来吗?