通常子类是不能访问父类的私有的成员变量及私有的方法,哪怎么才能做到呢?利用反射可以很容易的做到,以下代码在unity中测试通过;
定义一个父类:
using UnityEngine;
using System.Collections;
public class TestBase : MonoBehaviour
{
private int a = 1;
public int b = 2;
private void printPr()
{
Debug.Log("private method");
}
public void printPu()
{
Debug.Log("public method");
}
}
然后再声明一个类继承TestBase类:
using UnityEngine;
using System;
using System.Reflection;
public class TestOne : TestBase
{
// Use this for initialization
void Start()
{
analytical();
}
void analytical()
{
// 指明当前对象
object obj = (TestBase)this;
// 获取对象的类型
Type type = obj.GetType();
// 对象的父类类型
type = type.BaseType;
//字段绑定标志
BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
// 获取type 中的 私有变量a
FieldInfo ff = type.GetField("a", flag);
// 给变量赋值
ff.SetValue(obj, 123);
// 读取变量值
object value = ff.GetValue(obj);
Debug.Log(value);
//获取对象的私有方法print
MethodInfo mf = type.GetMethod("printPr", flag);
// 实现对象中的方法
mf.Invoke(obj, null);
}
}
analytical方法中阐述了具体的解析逻辑。
反射是动态执行的(和oc的动态性类似),效率会比直接引用低,也可能会存在很多的异常,用时需谨慎。
反射 也可以通过类名创建类实例:(实例就不在此处列出了)
反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败,请确保反射时使用类的完全限定名。
参考:https://msdn.microsoft.com/zh-cn/library/ms173183(VS.80).aspx