代码之家  ›  专栏  ›  技术社区  ›  grenade

3分钟后,什么是反射?

  •  39
  • grenade  · 技术社区  · 15 年前

    许多.NET面试问题列表( including the good ones )包含问题:“反射是什么?”.我最近被要求回答这个问题,在一个5个问题的背景下,技术测试设计在15分钟内完成,在一个自助餐厅里交给我一张空白纸。我的回答是这样的:“反射允许您在运行时发现任何对象的方法、属性和字段”。回想起来,我的回答解释了如何使用反射,但它并不能解释反射是什么。在我看来,我的回答足以说明我理解什么是反思。 对于 但没有解释什么反映 .

    因此,请在.NET的上下文中,用您自己简洁的语言定义反射 . 回答时间不要超过三分钟。不要提及 the .Net documentation 我们都看过。

    12 回复  |  直到 7 年前
        1
  •  42
  •   Brian Rasmussen    15 年前

    反射是以动态方式查询和与类型系统交互的能力。

        2
  •  11
  •   jk.    15 年前

    自省的一种形式,即能够编写查询代码的代码。

        3
  •  9
  •   antik    15 年前

    反射是CLR对代码级对象(例如通过API公开的类名、方法等)的感知,即System.Reflection,它允许开发人员利用运行时在其代码中对这些信息的认知。

    违反规则 :为了准确起见,我已将此答案从其原始形式进行了编辑。

        4
  •  8
  •   Amnon    15 年前

    反射是程序作为数据处理自身的能力。

        5
  •  6
  •   Brian Ensink    12 年前

    反射就像海军在寻找代码。

        6
  •  5
  •   Guge    15 年前

    在编译.NET语言期间,编译器将有关程序的信息放入程序文件中。程序本身或其他程序可以使用这些信息来确定程序包含哪些类、它们的方法、属性、字段和事件。类及其方法、属性等也可以通过反射来使用,即使其他程序在运行之前对它们一无所知。这允许不同的程序松耦合,并使各种令人兴奋的编程成为可能。反射还可以用于在运行的程序或程序文件中构建其他类。

        7
  •  4
  •   tzup    15 年前

    我喜欢您的回答,但我也会提到反射也是获取/设置私有/受保护字段/属性的一种方法,否则在运行时将不可用。

        8
  •  2
  •   Gilligan    15 年前

    反思是代码的恢复。

        9
  •  0
  •   Fiseha    11 年前

    反射同时是元数据和Microsoft中间语言(MSIL),打包在可移植可执行(PE)文件中,可以在运行时通过机制访问。

        10
  •  0
  •   rhatwar007    10 年前

    反射只不过是在运行时动态地访问项目(可能是系统或自己创建的)中未包含的其他dll的方法的能力。 这也有助于避免循环依赖问题。

        11
  •  0
  •   Shahar G.    7 年前

    反省是一种像 上帝 ( G 自然的 o 操作 D irector;-)—您可以“查看”程序集的内部,并执行各种专门为运行时设计的操作(system.reflection),例如查询类型及其成员、搜索接口或属性、实例化编译时未知的类型,甚至创建新类型(system.reflection.emit)。

        12
  •  0
  •   Anshul Goyal    7 年前

    通过使用C中的反射,我们可以找到对象、方法的详细信息,并在运行时创建对象和调用方法。

    using System;
    using System.Reflection;
    
    public class MyClass
    {
       public virtual int AddNumb(int numb1,int numb2)
       {
         int result = numb1 + numb2;
         return result;
       }
    
    }
    
    class MyMainClass
    {
      public static int Main()
      {
        // Create MyClass object
        MyClass myClassObj = new MyClass();
        // Get the Type information.
        Type myTypeObj = myClassObj.GetType();
        // Get Method Information.
        MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb");
        object[] mParam = new object[] {5, 10};
        // Get and display the Invoke method.
        Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " +  
                             myMethodInfo.Invoke(myClassObj, mParam) + "\n");
        return 0;
      }
    }
    

    下面的代码将获得类型信息:

    Type myTypeObj = Type.GetType("MyClass");
    

    下面的代码段将获取该方法的信息

    Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 
    

    以下代码段将调用AddNumb方法:

    myMethodInfo.Invoke(myClassObj, mParam);