.NET拾忆:反射的本质——元数据
反射主要使用的命名空间:
System.Reflection
System.Type
System.Reflection.Assembly
本质:元数据
反射的本质其实是使用元数据;元数据其实就是程序编译出来的特定数据结构的表;当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等;用过c++的可能会类比一下头文件;
反射的作用就是解析使用这些元数据;上面的几个命名空间就是实现这些解析与使用。
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Practice.NET.Reflact
{
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; } public Product()
{ } public Product(string name, decimal price)
{
this.Name = name;
this.Price = price; } public void PrintName()
{
Console.WriteLine(this.Name);
} void PrintPrice()
{
Console.WriteLine(this.Price.ToString());
} public string GetName(string name)
{
this.Name = name;
return this.Name; }
public void GetName()
{
PrintName();
} public void ShowPrice(ref decimal price)
{
this.Price = price; }
}
}
Product
using System;
using System.Reflection; namespace Practice.NET.Reflact
{
public class ReflactTest
{
/// <summary>
/// 基本用法
/// </summary>
public void Test()
{
//1、-------------------------程序集------------------------
string path = AppDomain.CurrentDomain.BaseDirectory + "Practice.NET.exe";//;
Assembly ass = Assembly.LoadFrom(path); //2、--------------------------类-------------------- //第一种方法,在类的构造函数是无参时使用方便,在有参时就不容易实现 object obj1 = ass.CreateInstance("Practice.NET.Reflact.Product");//实例化Person类,返回值是object,通过命名空间及类名得到
Type myType1 = obj1.GetType(); //得到类的类型 //第二种方法,通过获得类型的构造函数来实例化对象,在构造函数是有参时也容易实现 Type myType2 = ass.GetType("Practice.NET.Reflact.Product");//得到类的类型 ConstructorInfo constructor = myType2.GetConstructor(new Type[]);//得到myType的构造函数(无参) object instance2 = constructor.Invoke(null);//调用构造函数来实现实例化类现在先通过调用无参构造函数来实例化类,下面看一下通过反射怎么得到类成员: //3、--------------------方法------------------------- MethodInfo method1 = myType2.GetMethod("PrintName");//得到无参公有方法 MethodInfo method2 = myType2.GetMethod("PrintPrice", BindingFlags.Instance | BindingFlags.NonPublic);//得到私有方法 MethodInfo method3 = myType2.GetMethod("GetName", new Type[] { typeof(string) });//得到带参数的公有方法(后面的Type类型可以省略,但如果是重载方法就不能省) MethodInfo method4 = myType2.GetMethod("GetName", new Type[]); MethodInfo method5 = myType2.GetMethod("ShowPrice");//得到参数是ref的的方法 //4、-----------------------------属性------------------
//得到属性
PropertyInfo[] propertys = myType2.GetProperties(BindingFlags.Instance | BindingFlags.Public); PropertyInfo Name = myType2.GetProperty("Name");
PropertyInfo Price = myType2.GetProperty("Price"); FieldInfo name = myType2.GetField("name", BindingFlags.Instance | BindingFlags.NonPublic);//得到字段(全是私有的)
FieldInfo age = myType2.GetField("name", BindingFlags.Instance | BindingFlags.NonPublic); //设置/读取属性
Name.SetValue(instance2, "李四", null);//给Name设值,后面的null是对应的索引器 Price.SetValue(instance2, 23M, null); Name.GetValue(instance2); //5、----------------特性 myParamAttribute--------------
//foreach (var item in propertys)
//{
//item.GetCustomAttributes(typeof(myAttribute), true).Length //返回item包含myAttribute特性的数组 //} //6、----------------调用方法------------ method1.Invoke(instance2, null); method2.Invoke(instance2, null); Console.WriteLine(method3.Invoke(instance2, new object[] { "王五" }));//调用有返回值的方法 method4.Invoke(instance2, null); method5.Invoke(instance2, new object[] { 14M });//调用参数是ref的方法
}
}
}
ReflactTest
.NET拾忆:反射的本质——元数据的更多相关文章
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- .Net拾忆:从List去除重复-拾忆集合
方法1: private static List<int> DistinctList(List<int> list) {//去除重复 HashSet<int> ha ...
- JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法
/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建aut ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- 利用反射及JDBC元数据编写通用查询方法
元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...
- 利用反射及jdbc元数据实现通用的查询方法
---------------------------------------------------------------------------------------------------- ...
- MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询
1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...
随机推荐
- .NET Core开发日志——从搭建开发环境开始
.NET Core自2016年推出1.0版本开始,到目前已是2.1版本,在其roadmap计划里明年更会推出3.0版本,发展不可不谓之迅捷.不少公司在经过一个谨慎的观望期后,也逐步开始将系统升级至最新 ...
- centos 7 部署 MQTT
官方教程 :头痛的是nginx 和 mqtt布局有所冲突,后台不能使用需要调整,当然是用 nginx自家的布局没问题,但是要收费 官方地址 1.由于emqttd是用Erlang语言编写的,所以,在L ...
- windows10安装
https://www.microsoft.com/zh-cn/software-download/windows10
- FutureTask的用法及两种常用的使用场景
FutureTask可用于异步获取执行结果或取消执行任务的场景.通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过Fu ...
- redis有序集合性能 列表、集合、有序集合
https://www.cnblogs.com/pirlo21/p/7120935.html 1.1 列表 列表(list)类型是用来存储多个字符串,元素从左到右组成一个有序的集合.列表中的每个字符串 ...
- LeetCode 888 Fair Candy Swap 解题报告
题目要求 Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy tha ...
- 《mongoDB》索引
一:基础操作 创建单列索引 语法: >db.collection.createIndex(keys, options) 语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想 ...
- storm配置文件
- ReactDom.render调用后没有渲染
可能发生问题的代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 10种linux下磁盘快照方式恢复系统
导读 大家都知道windows系统有一个磁盘快照的功能,在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务(Volume Snapshot Service)的服务,他能够自动创建系统快照 ...