反射的常用API

加载程序集

Assembly assembly = Assembly.Load("程序集名称"); // 从前目录加载程序集,提供程序集名称,无后缀
Assembly assembly = Assembly.LoadFile("程序集完整路径"); // 加载指定路径的程序集,需要提供完整的路径(绝对路径)
Assembly assembly = Assembly.LoadFrom("程序集路径"); //加载程序集,可以是相对路径,也可以是绝对路径(需要后缀)

注意事项

  • 通常来说,一个项目一个assembly,即一个项目编译后得到一个dll或者exe(当程序有其他项目的依赖时会同时编译其他项目并将生成的dll拷贝至当前目录,看起来有多个dll)
  • 反射加载assemblly,如果加载的程序集有依赖项,则需要依赖项需要一同拷贝至当前项目,虽然不用使用Assembly加载,但是找不到依赖项运行时会抛异常

获取类型

Type的基本单位是class,即一个类一个Type

// 获取所有公开类
Type[] types = assembly.GetExportedTypes();
// 获取指定类
Type type = assembly.GetType("完整类名");// 提供完整类名,包括命名空间

注意事项:泛型类的类名为:类名`泛型参数个数,即:

public class GenericExample<T>
{
// 提供的类名为:GenericExample`1
}

泛型类获取后需要为其指定泛型的数据类型才能使用,这个在实例化对象的地方写

实例化对象

实例化对象使用Activator.CreateInstance();方法,这个方法有多个重载,用于不同的情况

// 调用无参构造函数,使用Activator.CreateInstance()实例化的对象为object类型,当需要通过点的方式使用其内部定义的属性和方法需要先进行类型转换
object oExample = Activator.CreateInstance(type);
// 调用无参非public构造函数,需要特别注意,这种方式可以破坏单例模式,即可以使用私有构造函数实例化对象
object oExample = Activator.CreateInstance(type, true);
// 调用构造函数,参数由object数组指定,在本例中,调用接受一个int的构造函数
object oExample = Activator.CreateInstance(type, new object[] { 123 }); // 当实例化泛型类时,需要先调用MakeGenericType指定泛型类的泛型参数类型
// MakeGenericType方法接收一个Type数组,传递类型列表,并返回一个新的类型,指定了泛型类具体类型的Type才能实例化对象
Type type = assembly.GetType("Example.GenericExample`1");
Type newType = type.MakeGenericType(new Type[] { typeof(int) });
object oExample = Activator.CreateInstance(newType);

使用对象

使用方法

// 以下所有type均是Type type = assembly.GetType("完整类名");中得到的type
// oExample为创建的实例Activator.CreateInstance(type) // 使用普通无参方法
// 通过方法名取得方法
MethodInfo method = type.GetMethod("Change");
// 通过Invoke调用,第一个参数为执行方法的对象实例,第二个参数为方法的参数
method.Invoke(oExample, null);
// 参数也可以为空object数组,效果相同
method.Invoke(oExample, new object[] {}); // 使用普通带参数方法
MethodInfo method = type.GetMethod("Change");
// 方法参数由object数组传递,如果方法有多个重载版本,则会自动根据object数组中存储的数据类型进行匹配
method.Invoke(oExample, new object[] { 123 }); // 使用静态方法
MethodInfo method = type.GetMethod("Change");
// 调用静态方法的方式与普通方法
method.Invoke(oExample, new object[] { "追风筝的人" });
// 静态方法因为不需要实例,所以可以在指定实例时赋值null
method.Invoke(null, new object[] { "麦田里的守望者" }); // 使用私有方法
// 使用私有方法需要使用BindingFlags.Instance | BindingFlags.NonPublic标注
MethodInfo method = type.GetMethod("PrivateChange", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(oExample, new object[] { "平凡的世界" }); // 使用泛型方法
MethodInfo method = newType.GetMethod("Change"); //泛型方法只写方法名,不需要跟`1泛型参数个数
// 使用泛型方法与前面加载泛型类类似,需要使用MakeGenericMethod指定泛型参数的具体类型
MethodInfo methodNew = method.MakeGenericMethod(new Type[] { typeof(string)});
methodNew.Invoke(oExample, new object[] {"血色浪漫"});

使用属性/字段

// 以下所有type均是Type type = assembly.GetType("完整类名");中得到的type
// oExample为创建的实例Activator.CreateInstance(type) // 获取所有属性
PropertyInfo[] property = type.GetProperties(); // 获取指定名称属性的值,GetValue接收获取值的对象
object value = type.GetProperty("属性名").GetValue(oExample)
// 设置指定名称属性的值,SetValue接收设置值的对象和设置的值
type.GetProperty("Id").SetValue(oExample, value); // 获取所有字段
FieldInfo[] fieldInfos = type.GetFields();
// 获取指定名称字段的值,GetValue接收获取值的对象
object value = type.GetField("字段名").GetValue(oExample);
// 设置指定名称字段的值,SetValue接收设置值的对象和设置的值
type.GetField("Id").SetValue(oExample, value);

反射的常用API的更多相关文章

  1. 反射常用API

    反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...

  2. 反射常用API以及内省机制(代码)

    学习内容: (1)获取构造函数 这里不贴Person类了,不然代码太多太乱了,只给出一些常用API // 创建字节码对象 Class<?> aClass = Class.forName(& ...

  3. Javassist之常用API的应用 02

    测试模型代码: package org.study2.JavaSenior.annotation.javassistDemo; /** * @Auther:GongXingRui * @Date:20 ...

  4. Java 常用API(二)

    目录 Java 常用API(二) 1. Object类 2. Date类 概述 构造方法和成员方法 3. DateFormat类 概述 SimpleDateFormat类 练习 4. Calendar ...

  5. Java | 个人总结的Java常用API手册汇总

    目录 常用API JavaAPI 1 java.lang String StringBuilder Integer parseXxx Math Object System Throwable Thre ...

  6. html5 canvas常用api总结(一)

    1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...

  7. compass General 常用api学习[Sass和compass学习笔记]

    compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 ...

  8. java基础3.0:Java常用API

    本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...

  9. C++ 中超类化和子类化常用API

    在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...

随机推荐

  1. 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则

    二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...

  2. service配置文件

    [Unit]Description="itcp Service"After=network.target cs_tcp.service [Service]Type=simpleGu ...

  3. Docker之Dockerfile文件

    Dockerfile是一堆指令,每一条指令构建一层,因此每一条指令的内容就是描述该层应当如何构建,在docker build的时候,按照该指令进行操作,最终生成我们期望的镜像文件 Dockerfile ...

  4. ++i和i++的区别

    它们两个的数值变化的区别,我这里就不多说了 这里主要说明两者在效率上的区别 (1)首先如果是自带的数据类型,比如int型,++i和i++,编译器的实现方式是相同的,两者并没有效率上的区别,虽然也有副本 ...

  5. 什么是 DNS 的 A记录 和 CNAME记录 域名解析 为我的自定义域名创建 CNAME 记录

    # CNAME https://support.google.com/blogger/answer/58317?hl=zh-Hans 为我的自定义域名创建 CNAME 记录 如果您的域名不是在 Blo ...

  6. ServerLess & MongoDB Atlas & REST API

    ServerLess & MongoDB Atlas & REST API ServerLess, Nodejs, MongoDB Atlas cloud 构建 REST API ht ...

  7. Google IO & 2019

    Google IO & 2019 Google IO Recap \ https://www.techradar.com/news/google-io-2019-keynote https:/ ...

  8. React Hooks & React v16.8.6

    React Hooks Hooks are a new addition in React 16.8 const [state, setState] = useState(initialState); ...

  9. flutter & dart & vs code & bug

    flutter & dart & vs code & bug Waiting for another flutter command to release the startu ...

  10. js currying & js 科里化

    js currying & js 科里化 var test = ( function (a){ console.log(`a2 =`, a);// 1 // console.log(`b2 = ...