三言两语说反射(unity中使用反射)

1,081 阅读3分钟

反射(Reflection)的用途

反射(Reflection)有下列用途:
它允许在运行时查看特性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
1.

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

2.

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

3.

可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

反射是一个十分简单而又灵活的东西,用好了,它就像一只温驯的猫,用不好,它就是被猫玩耍后的毛线团.

优缺点

优点:

1.反射提高了程序的灵活性和扩展性。
2.降低耦合性,提高自适应能力。
3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2.使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

Show Code

在unity中新建一个脚本

fqtzn0jwnr.png

这个脚本是需要来反射的

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"

运行结果如下:

fqtzn0jwnr.png