它允许在运行时查看特性(attribute)信息。 它允许审查集合中的各种类型,以及实例化这些类型。 它允许延迟绑定的方法和属性(property)。 它允许在运行时创建新类型,然后使用这些类型执行一些任务。
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
反射是一个十分简单而又灵活的东西,用好了,它就像一只温驯的猫,用不好,它就是被猫玩耍后的毛线团.
1.反射提高了程序的灵活性和扩展性。 2.降低耦合性,提高自适应能力。 3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。 2.使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
在unity中新建一个脚本
这个脚本是需要来反射的
public class Drawed { public int Num1; public int Num2; public string Str1; public Drawed() { Num1 = 1; Num2 = 1; Str1 = "Hi,I am Jtro !"; } public int GetNum1() { return Num1; } public string GetStr() { return Str1; } public string SayHello(string Greeting, string Name) { return Greeting + "," + Name; } }
然后在新建一个UseDraw脚本,挂在摄像机上
using System.Collections; using System.Collections.Generic; using System.Reflection; using UnityEngine; public class UseDraw : MonoBehaviour { public Drawed drawed = new Drawed(); string Greeting = "Hello"; string Name = "I am Jtro"; // Start is called before the first frame update void Start() { MethodInfo getnum1 = drawed.GetType().GetMethod("GetNum1"); Debug.Log(getnum1.Invoke(drawed, null)); MethodInfo getstr = drawed.GetType().GetMethod("GetStr"); Debug.Log(getstr.Invoke(drawed, null)); MethodInfo sayHello = drawed.GetType().GetMethod("SayHello"); string [] obj = new string[] {Greeting ,Name };//对于反射中传入值的一个封装 Debug.Log(sayHello.Invoke(drawed, obj)); } // Update is called once per frame void Update() { } }
其中前两个反射方法很简单,没有传值,第三个方法中呢,是需要传入一些值的 在得到了MethodInfo之后呢,用invoke就可以执行该方法: invoke原型如下表格:
object Invoke (object obj,object[] parameters);
参数 | 说明 |
---|---|
obj | 一个对象引用,将调用它所指向的对象上的方法 |
parameters | 所有需要传递方法的参数都必须在parameters数组中指定,如果这个方法中没有参数,那么也要写一个"null" |
运行结果如下:
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句