我可以使用类助手来调用静态私有类方法吗?

免费咨询

特别是,我觉得有必要在TCharacter.IsLatin1private

type
  TCharacterHelper = class helper for TCharacter
  public
    class function IsLatin1(C: Char): Boolean; static; inline;
  end;

class function TCharacterHelper.IsLatin1(C: Char): Boolean;
begin
  Result := Ord(C) <= $FF;
end;

这种单线方法几乎可以立即重新实现,但是我最好还是让供应商自行决定确切的实现细节。

有什么办法可以“重新引入”这种方法来public提高知名度?

戴维·赫弗南

请参阅下面的更新

众所周知,助手确实会破坏个人的知名度。因此,可以从班级助手中看到私人成员。但是,此行为不会扩展到静态成员,因此TCharacter.IsLatin1在声明它的单元之外无法访问(通过公平的方式)。

那不公平的手段呢?好吧,有一些公开的TCharacterdo方法IsLatin1即使IsLatin1声明inline了这些方法,也似乎这些方法是使用call语句而不是内联的代码编译的。可能是因为它们的调用发生在相同的单元或相同的类型中,并且内联引擎无法内联。

无论如何,我要这样做的地方是,您可以在运行时分解其中一个调用。为了争辩,让我们考虑IsControl

class function TCharacter.IsControl(C: Char): Boolean;
begin
  if IsLatin1(C) then
    Result := InternalGetLatin1Category(C) = TUnicodeCategory.ucControl
  else
    Result := InternalGetUnicodeCategory(UCS4Char(C)) = TUnicodeCategory.ucControl;
end;

它的第一个动作是调用IsLatin1编译后的代码如下所示:

System.Character.pas.517: 
00411135 C3退出 
00411136 8BC0 mov eax,eax
TCharacter.IsControl:
00411138 53 push ebx
00411139 8BD8 mov ebx,eax
System.Character.pas.533: 
0041113B 8BC3 mov eax,ebx
0041113D E852FFFFFF呼叫TCharacter.IsLatin1
00411142 84C0测试al,al
00411144 740F jz $ 00411155

因此,您可以执行以下操作:

  1. 以的地址TCharacter.IsControl
  2. 在该地址处反汇编代码,直到找到第一call条指令。
  3. 对该call指令进行解码以找到目标地址,IsLatin1即可在此处找到目标地址

我并不是很赞成这个IsLatin1这是一个简单的函数,并且不受更改,因此重新实现它肯定更好。但是对于更复杂的情况,可以使用此方法。

而且我也没有要求独创性。我从madExcept源代码中学到了这项技术。


好的,@ LU RD足智多谋地找到了一种证明我错误的方法。对此表示祝贺。我所说的static方法是准确的,但是@LU RD使用了非常熟练的技巧来引入非静态类方法,从而破解了私有成员。

我想进一步说明他的答案,方法是显示如何使用两个助手使用原始名称公开该功能:

unit CharacterCracker;

interface

uses
  System.Character;

type
  TCharacterHelper = class helper for TCharacter
  public
    class function IsLatin1(C: Char): Boolean; static; inline;
  end;

implementation

type
  TCharacterCracker = class helper for TCharacter
  public
    class function IsLatin1Cracker(C: Char): Boolean; inline;
  end;

class function TCharacterCracker.IsLatin1Cracker(C: Char): Boolean;
begin
  Result := TCharacter.IsLatin1(C); // resolves to the original method
end;

class function TCharacterHelper.IsLatin1(C: Char): Boolean;
begin
  Result := TCharacter.IsLatin1Cracker(C);
end;

end.

您可以使用此单元,并且在该单元之外活动的唯一帮助程序是在接口部分中声明的帮助程序。这意味着您可以编写如下代码:

{$APPTYPE CONSOLE}

uses
  System.Character,
  CharacterCracker in 'CharacterCracker.pas';

var
  c: Char;

begin
  c := #42;
  Writeln(TCharacter.IsLatin1(c));
  c := #666;
  Writeln(TCharacter.IsLatin1(c));
  Readln;
end.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用类助手来调用静态私有类方法吗?

来自分类Dev

我们可以使用反射调用抽象类的私有方法吗?

来自分类Dev

我可以使用其他类的静态方法吗?

来自分类Dev

我可以使用变量作为标识符来设置私有类字段吗?怎么样?

来自分类常见问题

我可以使用超类的类工厂静态方法创建子类实例吗?

来自分类Dev

Ruby类使用静态方法调用私有方法吗?

来自分类Dev

我可以使用C样式转换将派生类转换为私有基类吗?

来自分类Dev

我可以使用invoke来抽象类方法吗

来自分类Dev

我可以使用方法而不是类 Quartz 来定义作业实例吗?

来自分类Dev

我们可以使用类的引用来调用方法吗

来自分类Dev

我们可以通过拥有非私有instanceName来创建Singleton类吗?

来自分类Dev

我可以在Java中的静态嵌套类之间限制对私有字段的访问吗?

来自分类Dev

您可以使用私有API来挂接iOS中的系统函数调用吗?

来自分类Dev

GSON可以处理静态私有嵌套类吗

来自分类Dev

我可以使用类实例的类来提高可读性吗?

来自分类Dev

如何从私有基类调用静态方法?

来自分类Dev

Java Classloaders-在私有类内调用静态方法

来自分类Dev

我可以禁止从基础调用派生类的私有成员吗?

来自分类Dev

使用静态解析的类型参数是否可以使用咖喱参数调用类方法?

来自分类Dev

使用静态解析的类型参数是否可以使用咖喱参数调用类方法?

来自分类Dev

验证使用PowerMockito调用最终类上的私有静态方法

来自分类Dev

我可以使用递归约束来定义通用类吗

来自分类Dev

我可以使用C ++中的模板类来做到这一点吗

来自分类Dev

我们可以使用Java关键字来命名类吗?

来自分类Dev

我可以使用 willSet 来构造类实例字典条目吗?

来自分类Dev

为什么我不能在类/静态方法中使用私有的、内部的、文件私有的方法?

来自分类Dev

可以使用静态方法来实现接口吗?

来自分类Dev

在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

来自分类Dev

我们可以通过创建私有getInstance方法和公共getter setter方法来制作Singleton类吗?

Related 相关文章

  1. 1

    我可以使用类助手来调用静态私有类方法吗?

  2. 2

    我们可以使用反射调用抽象类的私有方法吗?

  3. 3

    我可以使用其他类的静态方法吗?

  4. 4

    我可以使用变量作为标识符来设置私有类字段吗?怎么样?

  5. 5

    我可以使用超类的类工厂静态方法创建子类实例吗?

  6. 6

    Ruby类使用静态方法调用私有方法吗?

  7. 7

    我可以使用C样式转换将派生类转换为私有基类吗?

  8. 8

    我可以使用invoke来抽象类方法吗

  9. 9

    我可以使用方法而不是类 Quartz 来定义作业实例吗?

  10. 10

    我们可以使用类的引用来调用方法吗

  11. 11

    我们可以通过拥有非私有instanceName来创建Singleton类吗?

  12. 12

    我可以在Java中的静态嵌套类之间限制对私有字段的访问吗?

  13. 13

    您可以使用私有API来挂接iOS中的系统函数调用吗?

  14. 14

    GSON可以处理静态私有嵌套类吗

  15. 15

    我可以使用类实例的类来提高可读性吗?

  16. 16

    如何从私有基类调用静态方法?

  17. 17

    Java Classloaders-在私有类内调用静态方法

  18. 18

    我可以禁止从基础调用派生类的私有成员吗?

  19. 19

    使用静态解析的类型参数是否可以使用咖喱参数调用类方法?

  20. 20

    使用静态解析的类型参数是否可以使用咖喱参数调用类方法?

  21. 21

    验证使用PowerMockito调用最终类上的私有静态方法

  22. 22

    我可以使用递归约束来定义通用类吗

  23. 23

    我可以使用C ++中的模板类来做到这一点吗

  24. 24

    我们可以使用Java关键字来命名类吗?

  25. 25

    我可以使用 willSet 来构造类实例字典条目吗?

  26. 26

    为什么我不能在类/静态方法中使用私有的、内部的、文件私有的方法?

  27. 27

    可以使用静态方法来实现接口吗?

  28. 28

    在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

  29. 29

    我们可以通过创建私有getInstance方法和公共getter setter方法来制作Singleton类吗?

热门标签

归档