三言两语说反射(unity中使用反射)
【摘要】 反射(Reflection)的用途反射(Reflection)有下列用途:它允许在运行时查看特性(attribute)信息。它允许审查集合中的各种类型,以及实例化这些类型。它允许延迟绑定的方法和属性(property)。它允许在运行时创建新类型,然后使用这些类型执行一些任务。1.反射指程序可以访问、检测和修改它本身状态或行为的一种能力。2.程序集包含模块,而模块包含类型,类型又包含成员。反射...
反射(Reflection)的用途
反射(Reflection)有下列用途:
它允许在运行时查看特性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
1.
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
2.
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
3.
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
反射是一个十分简单而又灵活的东西,用好了,它就像一只温驯的猫,用不好,它就是被猫玩耍后的毛线团.
优缺点
优点:
1.反射提高了程序的灵活性和扩展性。
2.降低耦合性,提高自适应能力。
3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2.使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
Show Code
在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" |
运行结果如下:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)