昨天在看 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 动态创建类相关推荐

  1. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  2. python动态创建类_Python中通过参数动态创建扩展类(class)

    class Bar: def super_cool_function(self): print("Cool") 1.利用Python闭包动态扩展类 通过在内部创建并从函数返回它来动 ...

  3. Python中type()详解:动态创建类

    众所周知:type()函数可以查看变量的类型: 先看一个简单的列子来看一下type查看变量类型 class Animal():passa=Animal() print(type(a)) print(t ...

  4. java 动态创建实例_java – 有没有办法动态创建类(而不是实例)?

    我有一个关于如何动态创建类(而不是实例)的问题. 在我的项目中,我需要根据配置文件编写几个类似的类. 例如,有一个像这样的 JSON: { { "lang": "pyth ...

  5. python 动态_python实现动态创建类的方法分析

    本文实例讲述了python实现动态创建类的方法.分享给大家供大家参考,具体如下: python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamical ...

  6. Python面试常用的高级用法,怎么动态创建类?

    元类是Python当中的 高级用法 ,如果你之前从来没见过这个术语或者是没听说过这个概念,这是非常正常的,因为一方面它的 使用频率不高 ,另外一方面就是它相对 不太容易理解 .以至于很多Python开 ...

  7. php怎么创建对象变量,php实现变量动态创建类的对象用法

    这篇文章主要介绍了php使用变量动态创建类的对象,涉及php面向对象程序设计中对象的动态创建相关操作技巧,需要的朋友可以参考下 本文实例讲述了php使用变量动态创建类的对象.分享给大家供大家参考,具体 ...

  8. C# Activator的使用(类工厂动态创建类的实例)

    包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用.此类不能被继承--c# Activator c#在类工厂中动态创建类的实例 1. Activator.CreateInsta ...

  9. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

最新文章

  1. 征文 | 第一届全国计算社会科学高端论坛
  2. 三次元风景照秒变宫崎骏动画,还能把石原里美吉卜力化,AnimeGAN已开源
  3. Zabbix配置微信报警通知
  4. 【python3】通过hashlib 和base64 对字符串进行加密
  5. 11、mybatis返回List
  6. 怎样建设WEB Cache
  7. C# Winform下载文件并显示进度条
  8. iOS工程引入ios-charts-master
  9. android新建view类,android – 无法创建ViewModel类的实例(无法启动活动ComponentInfo)
  10. 虚拟机测试必备虚拟机之VirtualBox 使用
  11. 疫情之下,使用FRP实现内网穿透,远程连接公司电脑进行办公
  12. 2014年9月21日_随笔,jdic,ETL,groovy,Nutz好多东西想学
  13. linux 安装源码网卡包,【linux命令】Linux通过yum 或者源码编译安装vnstat查看网卡流量...
  14. 北京大学计算机学院周磊,马秀莉-北京大学信息科学技术学院
  15. 【分论坛第一期大剧透】开源技术与新IT基础设施联袂共舞
  16. 网络阅卷系统服务器配置,网上阅卷系统建设实施方案.doc
  17. Frame-Relay基础及配置学习笔记
  18. python经纬度转换xy坐标公式 pyqt_EXCEL公式进行经纬度与XY坐标的相互转换
  19. c++打开挑选图片对话框
  20. python亲和数_亲和数(示例代码)

热门文章

  1. 谈谈对后台登陆页面的渗透测试
  2. 域名解析错误分析及解决
  3. VI命令使用大全(删除精华)
  4. 京东金融信贷需求预测机器学习竞赛--代码重构--特征工程
  5. Excel快速将自己的名字识别为二维码
  6. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~5界面设计
  7. matlab中的if语句
  8. 关于Win11安装Anaconda弹出Navigator Error网页报错的解决方案
  9. php cs fixer.bat,在 Windows 上安裝 Sublime Text 2 搭配 PHP-CS-Fixer 套件
  10. ajax请求修改标题,jQuery AJAX自定义标题