反射的常用API
反射的常用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的更多相关文章
- 反射常用API
反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...
- 反射常用API以及内省机制(代码)
学习内容: (1)获取构造函数 这里不贴Person类了,不然代码太多太乱了,只给出一些常用API // 创建字节码对象 Class<?> aClass = Class.forName(& ...
- Javassist之常用API的应用 02
测试模型代码: package org.study2.JavaSenior.annotation.javassistDemo; /** * @Auther:GongXingRui * @Date:20 ...
- Java 常用API(二)
目录 Java 常用API(二) 1. Object类 2. Date类 概述 构造方法和成员方法 3. DateFormat类 概述 SimpleDateFormat类 练习 4. Calendar ...
- Java | 个人总结的Java常用API手册汇总
目录 常用API JavaAPI 1 java.lang String StringBuilder Integer parseXxx Math Object System Throwable Thre ...
- html5 canvas常用api总结(一)
1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...
- compass General 常用api学习[Sass和compass学习笔记]
compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 ...
- java基础3.0:Java常用API
本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...
- C++ 中超类化和子类化常用API
在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...
随机推荐
- C++ string (浅谈)
浅谈string <string> typedef basic_string<char> string; 本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能, ...
- nginx的log、upstream和server
一.log 首先一个log格式化的例子. #配置格式main的log log_format main '$host $status [$time_local] $remote_addr [$time_ ...
- 编译安装MySQL 5.5.33
环境要求: 主机名 IP地址 需要软件及版本 系统版本 mysql.mfyxw.com 192.168.80.135 Mysql5.5.33 5.5.33 1.设定主机名 hostnamectl se ...
- SOHO 程序员
SOHO 程序员:从事程序开发.维护的家居办公人员. 一.自由程序员 SOHO程序员代表一种自由.弹性而新型的工作方式.SOHO,代表一种新经济.新概念. 是一些热爱软件开发的一族. SOHO程序员 ...
- dp的小理解
这段时间刷dp,总结出了一个不算套路的套路. 1.根据题意确定是否有重叠子问题,也就是前面的状态对后面的有影响,基本满足这个条件的就可以考虑用dp了. 2.确定是dp后,就是最难的部分--如何根据题意 ...
- JS编程练习:封装insertAfter函数(功能类似于系统insertBefor)
那么insertAfter()要实现的功能: 在指定的子节点后面插入新的子节点: 1 <body> 2 <div> 3 <p></p> 4 <sp ...
- Mysql(三)------事务的特性、事务并发、事务读一致性问题
1 什么是数据库的事务? 1.1 事务的典型场景 在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还 是配置切面 <tx:advice id="txAdvice& ...
- 网易吃鸡 mac 版,没有声音
网易吃鸡 mac 版,没有声音 bug 声音太小了 客服电话 问题反馈 提交工单 https://gm.163.com/user_help.html?index=5&stypeid=3619 ...
- Worktile vs Teambition
Worktile vs Teambition 项目管理.团队协作 企业服务.协同办公 worktile 易成科技 北京易成星光科技有限公司 https://www.tianyancha.com/com ...
- iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug
iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug iOS 14.1 Bug 弹窗 UI 非常丑 弹窗屏占太高了 屏幕使用时间 https://support.apple ...