Tir*_*dya 8 c# java reflection programming-languages
它说大多数高级动态类型语言都是反身的.维基百科上的反思(计算机编程)解释说,但它并没有真正给出它的含义.任何人都可以通过相关的例子以更简单的方式解释它吗?
举例说明如何以实际方式使用Reflection:
假设您正在开发一个要使用插件扩展的应用程序。这些插件是简单的Assembly,仅包含一个名为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 ... }
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,插件应该在运行时扩展您的应用程序。这意味着,当您的应用程序已经运行时,内容和逻辑应该从另一个程序集中加载。这意味着这些资源不会编译到您的程序集中,即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);
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以使用System.Reflection在运行时动态加载资源。这可能有助于理解您的使用方式。
在此页面上查看以查看如何更详细地访问程序集的示例。基本上和我写的内容相同。
为了更好地理解反射,请考虑评估程序的解释器。解释器是一个评估其他程序的程序。
程序可以 (1) 检查和 (2) 修改其 (a) 自己的状态/行为,或运行它的解释器的状态/行为 (b)。
那么就有四种组合。以下是每种操作的示例:
a 型称为结构反射。b 型称为行为反射。a 类型的反射在语言中相当容易实现。b 型的反射要复杂得多,尤其是 2b——这是一个开放的研究课题。大多数人通过反思理解的是1a和2a。
理解具体化的概念对于理解反思很重要。当程序中被解释的语句被求值时,解释器需要表示它。解释器可能具有对要解释的程序的模型字段、方法等的对象。毕竟,解释器也是一个程序。通过反射,解释程序可以获得对解释器中代表其自身结构的对象的引用。这就是具体化。(下一步是理解因果关系)
反射特性有很多种,有时很难理解什么是反射,什么不是反射,以及它的含义。从程序和解释器的角度思考。我希望它能帮助您理解维基百科页面(可以改进)。
| 归档时间: |
|
| 查看次数: |
8066 次 |
| 最近记录: |