RTTI

Delphi RTTI(运行时类型信息) 如何根据名称找到控件如何根据名称找到对应的属性如何根据名称执行某个方法或事件 运行时类型信(以下简称RTTI)是在运行时保存和检索对象和数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的信息,并对它们进行一些处理.   RTTI需要引用单元TypInfo   至于RTTI的数据结构,大家可以参考TypeInfo单元的代码   看例子,先为大家介绍一下根据字符串找到属性,并 阅读详情
一:获得对象的RTTI(以下代码基于Delphi 6/7) RTTI(Runtime Type Information 运行时类型信息)指的是对象在编译的时候,将其属性、方法的类型信息编译进特殊的区域,使得应用程序可以运行时,动态的查找对象的成员(fields)和属性(properties),以及定位函数(methods)。能够编译进RTTI的成员主要是被声明在对象的published部分,对象published部分的成员与public部分的成员具有相同的可见性,但区别就在于此。当在持久化和反持久化的时候,RTTI被用来访问属性的值、在对象浏览器(Object Inspector)中显示属性,以及关联事件(Event)和事件句柄函数(Event Handler)。Published部分的属性类型被限定在几种特殊的类型中,只能是Ordinal(有序类型)、string、class、interface、variant和函数指针类型,数组属性是不能被声明为published。当然也不是每一个被声明在published部分的成员都可以被持久化下来,比如record、array,同时声明在published部分的函数不支持overload。任何一个类希望拥有RTTI,需要在其类声明的时候加上编译开关{$M+},或者其父类在声明的时候有{$M+},所以最简单的方式获得RTTI就是从TPersistent继承。 对象属性的RTTI 特别注意,并不是所有类型的属性都可以被编译到RTTI中。 以下是获得属性、类型的方法 function GetObjProps(AObj: TPersistent): String; var StrList: TStringList; PropCount, I: Integer; PropList: PPropList; begin StrList:= TStringList.Create; try PropCount:= GetPropList(AObj, PropList); try if PropCount>0 then for I := 0 to PropCount-1 do StrList.Append(Format('Property %s : %s ;',[PropList[I]^.Name, PropList[I]^.PropType^^.Name])); finally if PropCount>0 then FreeMem(PropList,PropCount*SizeOf(Pointer)); end; Result:= StrList.Text; finally StrList.Free; end; end; 当自己制作一个属性浏览器的时候,就可以通过TypInfo单元中的各种方法,获得属性名称、类型、值的读写。 对象函数的RTTI 二:获得函数的RTTI代码 以下函数是获得published部分声明的函数名称,不包含参数和返回值,引用单元ObjAuto。AObj声明时包含编译开关{$M+}。(代码修改自D7VCL中一段,虽然TObject中有MethodName和MethodAddress两个函数,但是使用汇编撰写的,翻译成Pascal代码,也差不多就是下面这段的意思): function GetObjMethodNames(AObj: TPersistent): String; var VMT: Pointer; MethodInfo: Pointer; Count: Integer; begin VMT := PPointer(AObj)^; repeat MethodInfo := PPointer(Integer(VMT) + vmtMethodTable)^; if MethodInfo <> nil then begin Count := PWord(MethodInfo)^; Inc(Integer(MethodInfo), 2); while Count > 0 do begin Result:= Result+ PMethodInfoHeader(MethodInfo)^.Name+#13+#10; Inc(Integer(MethodInfo), PMethodInfoHeader(MethodInfo)^.Len); Dec(Count); end; end; VMT := PPointer(Integer(VMT) + vmtParent)^; if VMT = nil then begin Exit; end; VMT := PPointer(VMT)^; until False; end; 以下代码是获取函数及其参数和返回值,引用单元ObjAuto。AObj声明时包含编译开关{$M+}{$METHODINFO ON}: function TForm1.GetObjMethods(AObj: TPersistent): String; const ConventionName: array [Low(TCallingConvention)..High(TCallingConvention)] of String = ('Register', 'Cdecl', 'Pascal', 'StdCall', 'SafeCall'); var StrList: TStringList; VMT: Pointer; MethodInfo: PMethodInfoHeader; Count: Integer; RoutinPrefix, MethodName, ReturnName, Params: String; MethodAddr, MethodEnd: Pointer; ReturnAddr: PReturnInfo; begin StrList:= TStringList.Create; try VMT := PPointer(AObj)^; repeat MethodInfo := PPointer(Integer(VMT) + vmtMethodTable)^; if MethodInfo <> nil then begin // Scan method table for the method Count := PWord(MethodInfo)^; Inc(Integer(MethodInfo), 2); while Count > 0 do begin RoutinPrefix:= ''; ReturnName:= ';'; Params:= ''; //now methodinfo points to head of method MethodName:= MethodInfo^.Name; MethodEnd := Pointer(Integer(MethodInfo) + MethodInfo^.Len); ReturnAddr:= Pointer(Integer(MethodInfo)+SizeOf(TMethodInfoHeader)- SizeOf(ShortString)+1+Length(MethodName)); MethodAddr:=Pointer(Integer(ReturnAddr)+SizeOf(TReturnInfo)); // RTTI involves methodinfo if Integer(MethodAddr) < Integer(MethodEnd) then begin if ReturnAddr^.ReturnType= nil then RoutinPrefix:='Procedure' else begin RoutinPrefix:= 'Function'; ReturnName:= ': '+ReturnAddr^.ReturnType^^.Name+ ';'; end; //add routin's convention type ReturnName:= ReturnName+ ' '+ConventionName[ReturnAddr^.CallingConvention]; //the first parameter is self pointer and be hidden Inc(Integer(MethodAddr), SizeOf(TParamInfo) -SizeOf(ShortString) + 1 + Length(PParamInfo(MethodAddr)^.Name)); while Integer(MethodAddr) < Integer(MethodEnd) do begin Params:= Params+ PParamInfo(MethodAddr)^.Name+': '+ PParamInfo(MethodAddr)^.ParamType^^.Name; Inc(Integer(MethodAddr), SizeOf(TParamInfo) -SizeOf(ShortString) + 1 + Length(PParamInfo(MethodAddr)^.Name)); end; end; //output information StrList.Append(Format(RoutinPrefix+' %s(%s)%s;', [MethodName,Params, ReturnName])); //jump to the next method Inc(Integer(MethodInfo),PMethodInfoHeader(MethodInfo)^.Len); Dec(Count); end; end; // Find the parent VMT VMT := PPointer(Integer(VMT) + vmtParent)^; if VMT = nil then begin Break; end; VMT := PPointer(VMT)^; until False; Result:= StrList.Text; finally StrList.Free; end; end; 三:通过运行时信息动态驱动函数 有了前面的一些知识,我们就可以获得对象RTTI中函数的信息了。至于如何调用执行这些函数,这里有两种方式。 第一种: 调用TObject.MethodAddress根据函数名称获得函数地址,这时由于只是得到函数地址,需要在调用端明确知道函数类型才能调用。形如以下代码: var P: procedure(Sender: TObject) of object; begin with TMethod(P) do begin Data:= Sender; Code:= Sender.MethodAddress('OnbtnClick'); end; P(Sender); end; 这种调用,形式简单,关联速度快,调用速度几乎不受损失。持久化机制中,对于Event-EventHandler关联和事件调用,就是采用该种方式。缺点是,该种方式获取函数地址的时候,并不能得到函数的类型和参数列表,除非在调用端明确知道函数类型,否则无法执行函数。基于此方法而设计的系统,例如Delphi持久化Event,都是依靠Event才知道Handler的类型,他们之间的关联有效性往往是在先期某个阶段就有检查。 第二种: 这是一种更加灵活一点的函数动态执行方式,使用ObjAuto单元中ObjectInvoke方法(参数:Instance,声明函数的对象;PMethodInfoHeader,函数的头信息;Params,传入参数的开放数组,传入参数的顺序和声明顺序相反,例如,声明成procedure pro(P1: Integer; P2: String),传参的时候,该数组要写成['str',2])。能够被ObjectInvoke驱动的函数应是声明在对象的published部分,对象声明的时候要加上编译开关{$M+}{$METHODINFO ON}。 假定有以下的类声明: type TMyType = type String; type ITest = interface(IInvokable) ['{E6344DBD-8663-40F2-8C7A-C6DFC4FCCA51}'] procedure ShowMsg(); stdcall; function AddStr(A1: String; A2: Integer): String; stdcall; function GetName(AComponent: TComponent): String; stdcall; procedure IncNum(var AInt: Integer); stdcall; function BuildObjByClass(AClassName: String): TComponent; stdcall; end; {$METHODINFO ON} TTest = class(TInterfacedPersistent, ITest) private FF2: Integer; FF1: String; FF3: TObject; FF4: TMyType; public procedure AfterConstruction; override; procedure BeforeDestruction; override; published property F1: String read FF1 write FF1; property F2: Integer read FF2 write FF2; property F3: TObject read FF3 write FF3; property F4: TMyType read FF4 write FF4; procedure ShowMsg(); stdcall; function AddStr(A1: String; A2: Integer): String; stdcall; function GetName(AComponent: TComponent): String; stdcall; procedure IncNum(var AInt: Integer); stdcall; function BuildObjByClass(AClassName: String): TComponent; stdcall; end; {$METHODINFO OFF} 驱动函数ShowMsg,这个比较简单,没有参数和返回值。 ObjAuto.ObjectInvoke(FTest, GetMethodInfo(FTest, 'ShowMsg'), [] ,[]); 驱动函数AddStr,两个不同类型的参数,传参的时候是倒序,有一个返回值,但都是简单类型。 var ResultValue: Variant; begin ResultValue:= ObjAuto.ObjectInvoke(FTest, GetMethodInfo(FTest, 'AddStr'), [] , [1, 'BBB']); ShowMessage(VarToStr(ResultValue)); end; 驱动函数IncNum,注意参数是var,传入的是引用,给Variant变量赋值的时候有些讲究。 var ResultValue: Variant; Param: Variant; I: Integer; begin I:= 1; with TVarData(Param) do begin VType:= varInteger or varByRef; VPointer:= @I; end; ObjAuto.ObjectInvoke(FTest, GetMethodInfo(FTest, 'IncNum'), [] ,[Param]); ShowMessage(IntToStr(I)); end; 驱动函数BuildObjByClass,返回的是对象类型,对象地址在TVarData.VPointer上,但Variant不支持对象类型,故TVarData.VType为unknown。 var ResultValue: Variant; begin ResultValue:= ObjAuto.ObjectInvoke(FTest, GetMethodInfo(FTest,'BuildObjByClass'), [] , ['TForm1']); ShowMessage(TComponent(TVarData(ResultValue).VPointer).ClassName); ... end; 在这里,并没有给出函数GetName是如何驱动,这是因为在使用ObjectInvoke的时候,ObjectInvoke参数为variant类型,由于Variant不支持对象以及指针类型,所以TVarData.VType为unknown,尽管TVarData.VPointer上可能有值,但在ObjectInvoke内部会对传入参数类型做检查,抛出类型异常。有人提出过修改ObjectInvoke的实现,去除传入参数的类型检查,但我觉得此举不甚严谨,因为类型检查在保证程序的鲁棒性是非常必要的,由于ObjectInvoke参数类型为Variant,其本身就不能携带完整实参类型信息(比之更进一步的方法是在驱动接口方法中的实现),另外还有一些类型的完整检查只能依赖于声明信息,例如结构体、枚举、集合、没有RTTI的对象,这些内容在Java、.Net中都比较容易获得,但在Delphi中却很难。最后,看一下VCL中使用ObjectInvoke的地方,主要是针对WebSnap,也即是说ObjectInvoke出现的并不算晚,但是针对Web调用,不支持传递指针也是可以接受的。 ==============================转自http://bbs.codegear-cn.com/viewthread.php?tid=1798&extra=page%3D3 之所在很早的时候函数就被编译进RTTI中,并不是为了在Delphi中实现反射,因为反射的概念只是Java、.NET这种基于VM的语言的一个小特性,而基于VM产生出的各种特性,包括垃圾回收、平台无关这些都是编译型语言的硬伤,所以Delphi不会特地为了反射而反射,只是用在一些特殊的领域。Delphi中支持函数的RTTI最早是为了实现事件句柄(EventHandler)的持久化。在Delphi语言创建之初就确定了对Property-Event的支持,这个特性也是Delphi最富魅力的特性之一。所谓的Event(事件),是消息或内部逻辑中发出的特定的请求,Event的定义需要明确特定的事件意义以及特定的编程接口,它是基于消息机制的一种逻辑扩展接口,Event本身并不直接包含逻辑,它只是一个锚点,真正的执行逻辑在EventHandler中,EventHandler依赖于外部的注入。 例如: 对象声明了一个处理消息WM_LBUTTONDBLCLK的函数,在接收到该消息后执行 if Assigned(FOnDblClick) then FOnDblClick(Self); 则外部就可以通过在EventOnDBClick属性上挂接处理函数,来实现对事件的响应,注入逻辑。我们知道,在IDE和持久化机制中,针对事件属性关联的EventHandler是声明在窗体对象published部分的函数(准确的说,由于EventHandler关联关系是需要持久化的,所以在Delphi的持久化机制中,EventHandler一定要是TReader/TWriter的Root下published中声明的函数),这是一种比较古老也过时的设计,现在由于AOP(Aspect-Oriented program面向方面编程)概念的发展,受其影响已将EventHandler发展为委托对象,事件的发起者只需要将自己注册在委托对象上,事件的处理逻辑也不直接响应事件,而也是注册在委托对象上,这样设计的好处是由于中间存在了一个delegation,也就提供了更方便更灵活的注入逻辑的机制,在后期加入和改变事件处理逻辑的时候也最大限度的保障了原有逻辑的稳定。这也是.Net中发展出委托的原因。当然,在很多国内的书籍中介绍到.Net的委托的时候,都会提到『不必关心具体的执行者,只要知道你的消息交给哪一个委托就好了』,这样的解释并没有切题,因为无论是Delphi中比较古老的设计,还是现今的委托,消息的发起者都不需要关心接收者的处理。 下面看一段持久化机制中的代码: procedure WriteMethodProp; var Value: TMethod; begin Value := GetMethodProp(Instance, PropInfo); WritePropPath; if Value.Code = nil then WriteValue(vaNil) else WriteIdent(FLookupRoot.MethodName(Value.Code)); end; 这段是TWriter.WriteProperty中持久化Event的子函数,基本逻辑就是:根据函数地址,在LookupRoot中找寻到函数名称,将其持久化。这里的LookupRoot就等于Root。而在TReader中反持久化的时候,代码如下: tkMethod: if NextValue = vaNil then begin ReadValue; SetMethodProp(Instance, PropInfo, NilMethod); end else begin Method.Code := FindMethod(Root, ReadIdent); Method.Data := Root; if Method.Code <> nil then SetMethodProp(Instance, PropInfo, Method); end; 这下就一目了然了,Data是Root,Code是根据函数名称在Root下找寻到函数地址。 如果我们想在Delphi中实现委托对象的话,可以在委托对象持久化的时候记录下Event的关联关系,例如,可以是以下的dfm文件: ... delegation: TNotifydelegation Events=< item host = Button1 Event = 'OnClick' end> end 而不必拘泥于一定要生成如下形式, ... Button1: TButton OnClick = delegation.OnNotify end 因为如果生成这种形式的话,需要改写VCL中的一些代码。 最简单的情况下,函数的RTTI是通过如下形式获得到的: var VMT: Pointer; MethodInfo: PMethodInfoHeader; begin VMT := PPointer(AObj)^; MethodInfo := PPointer(Integer(VMT) + vmtMethodTable)^; ... end; 这是一段摘自VCL中的代码,其意义是对象首地址负偏移vmtMethodTable(vmtMethodTable=-56在单元System中有相关常量值的定义)是RTTI方法表的入口地址,注意,方法表入口首先存储的当前对象的方法数量,然后首地址偏移2 Byte后才是所有函数的名称。在单元ObjAuto中相关结构体定义了方法表的内存结构。 当只有{$M+}的时候,方法表的内存布局是以下结构: TMethodInfoHeader = packed record Len: Word; Addr: Pointer; Name: ShortString; end; 其中Len是该函数信息结构的大小(当只有{$M+}时,Len=TMethodInfoHeader结构体的大小,注意Name是变体;当有{$M+}{$METHODINFO ON}时,Len=TMethodInfoHeader+TReturnInfo+TParamInfo+...+TParamInfo),Addr指向代码段函数地址,Name为函数名。 当有{$M+}{$$METHODINFO ON}时,内存布局如下: TMethodInfoHeader = packed record Len: Word; Addr: Pointer; Name: ShortString; end; + TReturnInfo = packed record Version: Byte; // Must be 1 CallingConvention: TCallingConvention; ReturnType: ^PTypeInfo; ParamSize: Word; end; + TParamInfo = packed record Flags: TParamFlags; ParamType: ^PTypeInfo; Access: Word; Name: ShortString; end; + ... + TParamInfo = packed record Flags: TParamFlags; ParamType: ^PTypeInfo; Access: Word; Name: ShortString; end; 其中,函数有多少参数就有多少TParamInfo结构体。任何对象函数,都包含第一个隐式参数Self,所以任何函数都至少包含一个TParamInfo结构体。 在最新版的Delphi中,为了更好的支持反射,于是默认情况扩展了RTTI信息,所以函数表内容变成了不但含有函数头信息,还包含了返回值和参数信息,故而编译后可执行程序的体积也变得庞大。
Delphi XE增强的RTTI妙用--动态创建包中的窗口类 以前要在运行时创建package中的form类,必须要在form单元文件中这样注册类:Initialization  RegisterClass(TForm3);Finalization  UnRegisterClass(TForm3);然后在调用模块中,通过FindClass或GetClass函数返回一个TPersistentClass,再通过此类引用创建窗口类:  AClass := GetClass(ClassName);  aForm := TCustomForm(AClass.Create).Cr 阅读详情

相关推荐

c++RTTI

RTTI介绍二级目录三级目录 介绍 1.RTTI是运行阶段类型识别的简称。这是新添加到c++中的特性之一。 2.用途:假设有一个类层次结构,其中的类都是从同一个基类派生而来的,则可以让基类指针指向其中任何一个类的对象。这样就可以调用这些函数:处理信息后,选择哪个类,并创建这种类型的对象,然后返回它的地址,而该地址可以被赋给基类指针。如何知道指针指向的是那种对象呢? 二级目录 三级目录 ...

weixin_50866517的博客 1045

Delphi的RTTI&VMT

网上已经有很多关于RTTI的博客,最近刚好看到这里,以前没弄懂的东西,这次一起搞明白一下,写个博客,算是做个笔记。 这里有一篇英文文档,说的很详细: Delphi Q&amp;amp;amp;amp;A 概念 每个Delphi的类都有一张虚拟方法表(virtual-method table),或者说,Delphi的类是由它来定义的。从编译器角度来看,一个类就是指向VMT的指针。 一个虚拟方法表从指针所指地址的负偏移76 ...

得也一天,失也一天! 1536

Flink实战项目——城市交通实时监控平台

本项目是与公安交通管理综合应用平台、机动车缉查布控系统等对接的,并且基于交通部门现有的数据平台上,进行的数据实时分析项目。

yangwei2048的博客 837

delphi 整型RTTI(运行时类型识别)相关信息

delphi rtti相关笔记

qq_43404969的博客 475

深入解析rknn-toolkit2混合量化:如何为RK3588和RK356X选择最佳量化策略

本文深入解析了RKNN-Toolkit2混合量化技术,针对瑞芯微RK3588和RK356X芯片的硬件特性差异,提供了最佳量化策略选择指南。通过混合量化技术,开发者可以在保持较高推理效率的同时显著降低精度损失,特别适用于边缘计算场景。文章详细介绍了混合量化的技术原理、实战流程及芯片专属优化策略,帮助开发者充分利用硬件特性提升模型性能。

dog123的博客 258

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

Delphi中的RTTI:解锁运行时类型信息的奥秘

在Delphi编程中,RTTI(Run-Time Type Information,运行时类型信息)是一项强大的功能,它允许开发者在程序运行期间获取类型信息。本文详细介绍了Delphi中的RTTI机制,包括其工作原理、如何获取类和数据类型的RTTI信息,以及RTTI在实际编程中的应用场景。随着Delphi语言的不断发展,RTTI机制也将继续进化,提供更多的特性和改进,以满足开发者对于运行时类型信息处理的需求。Delphi中的RTTI主要分为类(class)的RTTI和一般数据类型的RTTI。

2401_85763803的博客 922

差分运放电路输出电压偏置设计解析

差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。

weixin_35750747的博客 470

C++ RTTI

了解就好,静态语言没必要搞运行时反射。

weixin_41733034的博客 1040

从YOLOv8到RTDETR:如何将训练后的YOLO指标无缝转换为COCO格式

本文详细介绍了如何将训练后的YOLOv8指标无缝转换为COCO格式,特别适用于RTDETR模型的评估。通过数据准备、指标转换流程和实际项目经验,帮助开发者解决YOLO与COCO指标差异问题,提升模型评估的准确性和权威性。

weixin_29085151的博客 378

Jetson Nano 实战指南:深度学习环境配置与 YOLOv5 边缘端部署解析

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

FJN110的博客 152

RTTI详解

RTTI就是Run Time Identification,翻译过来就是运行时类型识别。它提供了一种编译器在运行时通过类型信息使用基类的指针或者引用来检查其所指向对象的实际派生类型的方法。我们已经知道,一个基类指针可以指向基类对象和个个子类对象,那我们如何直到其实际指向的对象的类型呢,RTTI就给我们提供了这种功能。RTTI主要通过dynamic_cast运算符和typeid运算符来实现这个功能的。

2301_78933228的博客 1418

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3051

手工实现RTTI

    运行时的动态类型检查(RTTI,Run Time Type Indentifiation)是c++中提供的一项语言机制,它主要用于判断多态对象的具体类型。     为什么不使用c++提供的RTTI功能     但c++中直接提供的RTTI存在一些缺点。首先它提供了取得类名(typeinfo中的name函数)的功能,这个功能实际上并不是RTTI必须的。很多时候我们不需要取得类的名字,而只是希

s_51563946的专栏 1226

MacBook M芯片第二篇:Homebrew安装

Homebrew是MacOS/Linux平台的软件包管理工具,提供便捷的安装、卸载、更新等功能。

码农魏轩 893

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java的RTTI

在Java中,RTTI表现在:1。Class对象,是RTTI的核心,每个类都有一个class对象。每当编写并且编译一个新类,就会产生一个Class对象(被保存在同名的.class文件当中)2。instanceof 关键字用于检查对象是不是某个特定类型的实例。3。强制类型转换,如:Parent object = new Child();Child child = (Child)object;至于实现机制,根据JVM实现的不同,没有固定的答案。

FG2006的专栏 6701

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++之 RTTI

RTTI(Runtime Type Indentification) 即运行阶段类型识别。这是 C++新引进的特性之一。RTTI旨在为程序在运行阶段确定对象的类型提供一种标准方式。

luoyayun361的专栏 2889

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

什么是RTTI

参考: http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html 运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。 多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现...

kevin_loving的博客 542

RTTI的理解

1.我对RTTI的理解 RTTI是一种和虚函数功能类似,但是实现原理不一样的机制。 当我们创建一个类对象,并且使用这个对象时,除了知道这个对象中的成员以外,对于类的信息一概不知,比如这个对象所属类的类名,这个对象的继承关系(子类或者父类是什么等等 ),比如: Figure *p; p = new Circle(); Figure &q = *p; 在定义了p这个对象之后,电...

qq_34489443的博客 836

RTTI介绍

RTTI(Run-Time Type Information,运行时类型信息)是C++的一项功能,它允许在程序运行时检查对象的类型。RTTI的主要作用是在多态(polymorphism)场景中,可以在运行时安全地转换对象类型或判断对象的实际类型。RTTI 是在运行时判断类型的工具,但过度使用 RTTI 可能违反面向对象编程的设计原则,因为它使程序依赖于运行时信息,而不是通过虚函数机制实现多态。这个操作符特别有用,在存在虚函数的类层次结构中,可以判断实际对象的类型,并确保安全的类型转换。

qq_39437730的博客 561

获取对象属性 RTTI

RTTI 简介RTTI(Run-Time Type Information) 翻译过来的名称是“运行期类型信息”,也就是说可以在运行期获得数据类型或类(class)的信息。 类(class) 和 VMT 的关系一个类(class),从编译器的角度来看就是一个指向 VMT 的指针(在后文用 VMTptr 表示)。在类的 VMTptr 的负地址方向存储了一些类信息的指针,这些指针的值和

amyliwei的专栏 2670

DELPHI中使用RTTI

    运行期类型信息(RTTI)是一种语言特征,能使应用程序在运行时得到关于对象的信息。RTTI是Delphi的组件能够融合到IDE中的关键。它在IDE中不仅仅是一个纯学术的过程。    由于对象都是从TObject继承下来的,因此,对象都包含一个指向它们的RTTI的指针以及几个内建的方法。下面的表列出了TObject的一些方法,用这些方法能获得某个对象实例的信息。

1212

理解RTTI

在我编码过程中,基本上没有用过RTTI,我想主要原因是:1.破坏了多态;2.RTTI会产生额外开销。         关于RTTI的概念,网络上很多,对于我来说,曾经有一个理解误区:在使用dynamic_cast(source_pointer)时,将基类的指针转化为派生类的指针,就是基类会凭空长出一截成为派生类,这种理解是错误的。要想使用dynamic_cast(source_pointer)将

Lemon 1022

关于C++中RTTI的思考

RTTI(运行时类型信息),是所有RAD开发工具的基础。     这段时间,因为需要在自己的软件中加入扩展的RTTI功能,于是专门对RTTI进行了研究,现在一些心得写下来。     RTTI是比较新的编程语言提供的能力,C、Fortran、Basic就没有,而现在几乎所有现代的、可视化的编程语言都提供了RTTI功能。C++的标准中也对RTTI作了规定。但相对其它语言而言,C++的RTTI信息是最简

jwqu的专栏 1402

RTTI和反射

1、RTTI     RTTI,运行时类型检查。JAVA中主要有两种方法允许我们获得运行时对象和类的信息。     传统的RTTI,假设我们在编译期和运行期已经知道了所有的类型     反射,允许在运行期获得对象的类型。 2、Class对象     class TestClass {}     TestClass testClass = new TestClass();     Cl

dazhong159的专栏 5021
上一篇: 技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言
下一篇: 优化数据库的思想:
一剑平江湖
博客等级 码龄18年 207粉丝 1070原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值