Delphi 动态创建类
昨天在看 Java Web 开发时有看到servlet 通过反射动态创建类,想到Delphi中能否实现。
环境 Win10 x64 , Delphi 10.4 需引用 System.Rtti ;
发现 private 下的 function GetXY:Integer 没有获取到,why? Rtti设计就这样?
unit untTest;interfaceusesClasses,SysUtils,Dialogs;typeTTestClass = class(TPersistent) //需继承TPersistentprivateFX:Integer;FY:Integer;FStr : string;function GetXY:Integer;publicfunction DoAdd(x,y: Integer):Integer;procedure ShowMsgBox;property X: Integer read FX write FX;property Y: Integer read FY write FY;property STR: string read FStr write FStr;property XAY: Integer read GetXY;end;implementation{ TTestClass }function TTestClass.DoAdd(x, y: Integer): Integer;
beginResult := x+y;
end;function TTestClass.GetXY: Integer;
beginResult := FX+FY;
end;procedure TTestClass.ShowMsgBox;
beginShowMessage('Test Call');
end;initializationRegisterClass(TTestClass); //进行注册finalizationunregisterClass(TTestClass);end.
unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,System.Rtti,untTest;typeTForm1 = class(TForm)Memo1: TMemo;Button1: TButton;lbl_method: TLabel;edt_method: TEdit;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);private{ Private declarations }ref: TRttiContext;procedure ReflectClass(AClass:TRttiInstanceType);public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);
vart:TTestClass;typ: TRttiType;mthd: TRttiMethod;value: TValue;begin// 使用 FindClass 查找创建类t := FindClass('TTestClass').Create as TTestClass;typ := Ref.GetType(TTestClass);mthd := typ.GetMethod(edt_method.text);value := mthd.Invoke(t,[1,2]);ShowMessage(IntToStr(value.AsInteger));t.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
vartyp: TRttiType;
begintyp := Ref.GetType(TTestClass);ReflectClass(typ.AsInstance);
end;procedure TForm1.ReflectClass(AClass: TRttiInstanceType);
varfields : TArray<TRttiField>;field : TRttiField;methods : TArray<TRttiMethod>;method : TRttiMethod;params : TArray<TRttiParameter>;param : TRttiParameter;props : TArray<TRttiProperty>;prop: TRttiProperty;s : string;
beginmemo1.Lines.Add(AClass.Name);fields := AClass.GetFields;for field in fields dobeginmemo1.Lines.Add(field.Name +' -- '+ field.FieldType.Name);end;methods := AClass.GetMethods();for method in methods dobeginparams := method.GetParameters;s := EmptyStr;for param in params dobegins := s + Format('%s, ',[param.ToString]);end;s := Copy(s,1,Length(s)-2);if method.ReturnType = nil thens:= Format(' procedure %s(%s);',[method.Name,s])elses:= Format(' function %s(%s):%s;',[method.Name,s,method.ReturnType.Name]);memo1.Lines.Add(s);end;props := AClass.GetProperties;for prop in props dobegins := EmptyStr;if (prop.IsReadable) and(not prop.IsWritable) thens:= 'ReadOnly';if(not prop.IsReadable) and (prop.IsWritable) thens:= 'WriteOnly';memo1.Lines.Add(Format(' %s:%s;%s',[prop.Name,prop.PropertyType.Name,s]));end;
end;end.
参考:Delphi2010强化的反射_敦格-CSDN博客_delphi 反射
Delphi 动态创建类相关推荐
- python创建类的实例方法-Python中动态创建类实例的方法
简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...
- python动态创建类_Python中通过参数动态创建扩展类(class)
class Bar: def super_cool_function(self): print("Cool") 1.利用Python闭包动态扩展类 通过在内部创建并从函数返回它来动 ...
- Python中type()详解:动态创建类
众所周知:type()函数可以查看变量的类型: 先看一个简单的列子来看一下type查看变量类型 class Animal():passa=Animal() print(type(a)) print(t ...
- java 动态创建实例_java – 有没有办法动态创建类(而不是实例)?
我有一个关于如何动态创建类(而不是实例)的问题. 在我的项目中,我需要根据配置文件编写几个类似的类. 例如,有一个像这样的 JSON: { { "lang": "pyth ...
- python 动态_python实现动态创建类的方法分析
本文实例讲述了python实现动态创建类的方法.分享给大家供大家参考,具体如下: python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamical ...
- Python面试常用的高级用法,怎么动态创建类?
元类是Python当中的 高级用法 ,如果你之前从来没见过这个术语或者是没听说过这个概念,这是非常正常的,因为一方面它的 使用频率不高 ,另外一方面就是它相对 不太容易理解 .以至于很多Python开 ...
- php怎么创建对象变量,php实现变量动态创建类的对象用法
这篇文章主要介绍了php使用变量动态创建类的对象,涉及php面向对象程序设计中对象的动态创建相关操作技巧,需要的朋友可以参考下 本文实例讲述了php使用变量动态创建类的对象.分享给大家供大家参考,具体 ...
- C# Activator的使用(类工厂动态创建类的实例)
包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用.此类不能被继承--c# Activator c#在类工厂中动态创建类的实例 1. Activator.CreateInsta ...
- Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信
Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...
最新文章
- 征文 | 第一届全国计算社会科学高端论坛
- 三次元风景照秒变宫崎骏动画,还能把石原里美吉卜力化,AnimeGAN已开源
- Zabbix配置微信报警通知
- 【python3】通过hashlib 和base64 对字符串进行加密
- 11、mybatis返回List
- 怎样建设WEB Cache
- C# Winform下载文件并显示进度条
- iOS工程引入ios-charts-master
- android新建view类,android – 无法创建ViewModel类的实例(无法启动活动ComponentInfo)
- 虚拟机测试必备虚拟机之VirtualBox 使用
- 疫情之下,使用FRP实现内网穿透,远程连接公司电脑进行办公
- 2014年9月21日_随笔,jdic,ETL,groovy,Nutz好多东西想学
- linux 安装源码网卡包,【linux命令】Linux通过yum 或者源码编译安装vnstat查看网卡流量...
- 北京大学计算机学院周磊,马秀莉-北京大学信息科学技术学院
- 【分论坛第一期大剧透】开源技术与新IT基础设施联袂共舞
- 网络阅卷系统服务器配置,网上阅卷系统建设实施方案.doc
- Frame-Relay基础及配置学习笔记
- python经纬度转换xy坐标公式 pyqt_EXCEL公式进行经纬度与XY坐标的相互转换
- c++打开挑选图片对话框
- python亲和数_亲和数(示例代码)