什么是编程语言的反射属性
本文关键字:反射 属性 编程语言 什么 | 更新日期: 2023-09-27 17:56:05
它说大多数高级动态类型语言都是自反的。维基百科上的反思(计算机编程)解释了,但它并没有真正清楚地说明它的含义。谁能用相关的例子以更简单的方式解释它?
举个例子,如何以实际的方式使用反射:
假设您正在开发一个想要使用插件扩展的应用程序。这些插件是简单的程序集,只包含一个名为 Person 的类:
namespace MyObjects
{
public class Person
{
public Person() { ... Logic setting pre and postname ... }
private string _prename;
private string _postname;
public string GetName() { ... concat variabes and return ... }
}
}
好吧,插件应该在运行时扩展您的应用程序。这意味着,当应用程序已运行时,应从另一个程序集加载内容和逻辑。这意味着这些资源不会编译到您的程序集中,即 MyApplication.exe。假设它们位于一个库中:MyObjects.Person.dll。
您现在面临的事实是,您需要提取此信息,例如从MyObjects.Person访问GetName()函数。
// Create an assembly object to load our classes
Assembly testAssembly = Assembly.LoadFile(Application.StartUpPath + @"MyObjects.Person.dll");
Type objType = testAssembly.GetType("MyObjects.Person");
// Create an instace of MyObjects.Person
var instance = Activator.CreateInstance(objType);
// Call the method
string fullname = (string)calcType.InvokeMember("GetName",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, instance, null);
如您所见,您可以使用 System.Reflection 在运行时动态加载资源。这可能有助于了解您可以使用它的方式。
查看此页,查看如何更详细地访问程序集的示例。这基本上与我写的内容相同。
为了更好地理解反射,请考虑评估程序的解释器。解释器是评估其他程序的程序。
程序可以 (1) 检查和 (2) 修改其 (a) 自己的状态/行为,或运行它的中间处理器的状态/行为 (b)。
然后有四种组合。下面是每种操作的示例:
- 1a -- 读取对象具有的字段列表
- 2a -- 根据字段名称修改一个字段的值;方法的反射调用。
- 1b -- 检查当前堆栈以了解当前执行的方法是什么
- 2b -- 修改堆栈或语言中某些操作的执行方式(例如消息发送)。
A型称为结构反射。B型称为行为反射。在语言中,a型的反射是相当容易实现的。b型的反射要复杂得多,尤其是2b--这是一个开放的研究课题。大多数人通过反思理解的是1a和2a。
理解反思的概念很重要。当计算程序中被解释的语句时,解释器需要表示它。intepreter可能具有要解释的程序的模型字段,方法等的对象。毕竟,解释器也是一个程序。通过反射,解释程序可以获取对解释器中表示其自身结构的对象的引用。这就是化。(下一步是了解因果关系)
有各种各样的反射特征,有时很难理解什么是反射的,以及它的含义。从程序和口译员的角度思考。我希望它能帮助您理解维基百科页面(可以改进)。
反射是查询您在运行时编写的程序的元数据的能力,例如:在程序集中找到哪些类,这些类包含哪些方法、字段和属性等。
.net 甚至包含"属性",这些是您可以使用它们装饰的类、方法、字段等,它们的所有目的是添加可以在运行时查询的自定义元数据。
很多时候,详细信息仅取决于元数据。在验证时,我们不关心字符串或 int,但我们关心它不应该为 null。因此,在这种情况下,您需要检查属性或属性,而不关心特定类。有倒影在画面中。如果您喜欢动态生成方法(在 C# 4.0 的动态对象中可用),同样的方式也可以使用反射。基本上,它有助于进行行为驱动或面向方面的编程。
另一个流行的用途是测试框架。他们使用反射来查找在代理环境中测试和运行它的方法。
它是编程语言根据运行时信息调整其行为的能力。在 .Net/C# 世界中,这经常被使用。例如,将数据序列化为 xml 时,可以添加一个属性以在生成的 xml 中指定字段的名称。
这对 programmers.stackexchange.com 来说可能是一个更好的问题。
但它基本上只是意味着您可以从代码中查看代码。
在我的 VB6 时代,有一些 UI 对象具有 Text 属性,而其他对象具有描述(或者无论如何"文本"以外的内容,我忘记了)。 这很痛苦,因为我无法封装代码以相同的方式处理这两种对象。 通过反射,我至少能够查看对象是否具有文本或描述属性。
或者,有时对象可能都具有 Text 属性,但它们派生自不同的基类,并且没有应用任何接口。 同样,如果没有反射的帮助,很难用静态类型语言封装这样的代码,但是通过反射,即使是静态类型语言也可以处理它。