反射的常用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. Git命令回退代码并同步到远程仓库

    git log 找到要回退的commit版本号并复制 git reset --hard [commitid] 本地库版本回退 git push -f origin [branchName] 同步到远端 ...

  2. 力扣992.K个不同整数的子数组-C语言实现

    题目 原题链接 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定独立的子数组为好子数组. (例如,[1,2,3,1,2] 中有 3 个不同的整数: ...

  3. TextCNN代码实践

    在上文<TextCNN论文解读>中已经介绍了TextCNN的原理,本文通过tf2.0来做代码实践. 数据集:来自中文任务基准测评的数据集IFLYTEK 导库 import os impor ...

  4. ajax全局

    $.ajaxSetup({ complete: function (xhr) { xhr.promise().done(function (json) { if (json.errorNo == &q ...

  5. spring-cloud-netflix-eureka-client

    服务注册中心eureka-server已经搭好,我们开始编写一个eureka-client,并提供一个hello服务 一.新建module,选择对应的springcloud模块,pom.xml如下: ...

  6. Dockfile搭建极简LNMP环境

    最近才发现ThinkPHP6.0和CI4.x都要求php版本为7.1以上了,本机的php版本还停留在7.0.3x,又懒得升级,于是考虑使用Docker来运行一个lnmp环境. 常规环境搭建的方式有两种 ...

  7. vue watch route params change

    vue watch route params change watch: { '$route.params.menuKey' (val, oldVal) { console.log('new rout ...

  8. TypedArray & ArrayBuffer

    TypedArray & ArrayBuffer Type Each element size in bytes Int8Array 1 Uint8Array 1 Uint8ClampedAr ...

  9. news of javascript

    news of javascript https://javascriptweekly.com/ https://javascriptweekly.com/issues https://www.inf ...

  10. django学习-2.urls.py和view.py的相关知识点

    1.URL函数简单解析 1.1.url() 函数可以接收四个参数,分别是两个必选参数:regex.view,和两个可选参数:kwargs.name. def url(regex, view, kwar ...