学习--反射

可以通过反射获取程序或程序集中的类、方法、特性。

1.反射的用途:

(1)使用Assembly加载程序集和定义,加载在程序集清单中获取所包含的模块,以及从此程序集中查找类型并创建该类型的实例。 
    (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 
    (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符和实现详细信息。 
    (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符和实现详细信息。
    (5)使用FiedInfo了解字段的名称、访问修饰符和实现详细信息,并获取或设置字段值。
    (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。 
    (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。 
    (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

注:这部分总结引用博友:dodo,他总结的很好。

2.代码实例

2.1 反射加载dll,读取module、类、方法、特性
Assembly assembly = Assembly.Load("DB.SqlServer");
Console.WriteLine("---------GetModules------------");
foreach (var item in assembly.GetModules())
{
Console.WriteLine(item.FullyQualifiedName);
}

foreach (var item in assembly.GetTypes())
{
Console.WriteLine(item.FullName);
}

Type typeDbHelper = assembly.GetType("DB.SqlServer.DBHelper");
foreach (var item in typeDbHelper.GetConstructors())//构造函数
{
Console.WriteLine(item.Name); //ctor是构造函数的名称(输出)
}

Console.WriteLine("------属性-----");
foreach (var item in typeDbHelper.GetProperties())
{
Console.WriteLine(item.Name);
}

Console.WriteLine("------方法-----");
foreach (var item in typeDbHelper.GetMethods())
{
Console.WriteLine(item.Name);
}

Console.WriteLine("------属性-----");
foreach (var item in typeDbHelper.GetFields())
{
Console.WriteLine(item.Name);
}

2.2反射创建对象

Object objectType = Activator.CreateInstance(typeDbHelper);
IDBHelper dbHelperReflection = (IDBHelper)objectType;
dbHelperReflection.Add();

2.3反射调用实例方法

Console.WriteLine("**************反射调用实例方法****************");

{
MethodInfo methodInfo = typeDbHelper.GetMethod("Add");
methodInfo.Invoke(objectType, null);
}
{
MethodInfo method = typeDbHelper.GetMethod("Show1", new Type[] { typeof(string) });
method.Invoke(objectType, new object[] { "nike" });
}
{
MethodInfo method = typeDbHelper.GetMethod("Show2", new Type[] { typeof(int) });
method.Invoke(objectType, new object[] { 123 });
}
{
MethodInfo method = typeDbHelper.GetMethod("Show3", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(objectType, new object[] { "私有方法参数" });
}

{
MethodInfo method = typeDbHelper.GetMethod("ShowGeneric");
method=method.MakeGenericMethod(typeof(string));
method.Invoke(objectType, new object[] { "泛型" });
}

3.DBHelper类

public class DBHelper : IDBHelper
{
public string ID { get; set; }
public string Pname = null;

public bool Add()
{
return true;
}

public bool Delete()
{
return true;
}

public bool Update()
{
return true;
}

public void Query()
{
Console.Write("这是{0}的Query方法", this.GetType().FullName);
}

public void Show1(string str)
{
Console.WriteLine("参数为{0}", str);
}

public void Show2(int num)
{
Console.WriteLine("参数为Int,是{0}",num);
}

private void Show3(string str)
{
Console.WriteLine("这是私有方法,参数为{0}",str);
}

public void ShowGeneric<T>(string name)
{
Console.WriteLine("这是{0}的ShowGeneric,T={1},name={2}",this.GetType(),typeof(T),name);
}
}

注:刚刚学习,有错误的地方请大家给予指出,谢谢。

时间: 2024-12-12 08:02:22

学习--反射的相关文章

Java学习-反射机制入门

1.反射机制 我们在正常的使用过程之中只关心类产生对象,而后通过对象调用类之中的方法,可是,除了这种传统的方式外,也可以利用反射操作. 1.1.认识反射 既然有反,那么一定存在有正,正是指通过类产生对象,而后通过对象执行操作.而反呢?通过对象找到它所在类的信息.所有的对象都支持反这一操作,因为Object类有一个方法:public final Class<?> getClass(). 1 package cn.kvikon.demo; 2 import java.util.Date; 3 4

java学习——反射机制

/* * JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法: * 对于任意一个对象,都能够调用它的任意一个方法和属性: * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. * * 动态获取类中信息,就是java反射 . * 可以理解为对类的解剖. * * 要想要对字节码文件进行解剖,必须要有字节码文件对象. * 如何获取字节码文件对象呢? * */ 1. 通过Class clazz =Class.forName()找

Java再学习-反射机制

首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了.废话不说,上主题! Java反射机制 运行时 判断任意一个对象所属的类 构造任意一个类的对象 判断任意一个类所具有的成员变量和方法 调用一个对象的方法 注意点:运行时,而不是编译时 首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧. 通过反射来进行方法调用的具体步骤: 1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段) 2.如

JAVA学习--反射之动态代理模式

1 import java.lang.reflect.InvocationHandler; 2 import java.lang.reflect.Method; 3 import java.lang.reflect.Proxy; 4 5 //动态代理的使用,体会反射是动态语言的关键 6 interface Subject { 7 void action(); 8 } 9 10 // 被代理类 11 class RealSubject implements Subject { 12 public

python学习-反射

web框架路由实例 根据用户的输入的 URL 不同,调用不同的页面 account.py 模块中存放了 login,logout,home 三个页面函数 # /user/bin/env python __author__ = 'wenchong' def login(): print('这是一个登陆页面') def logout(): print('这是一个退出页面') def home(): print('这是主页') web.py 文件为框架入口文件,通过 if...elif...else

学习反射札记

个人觉得,反射就是在不知道对象内部构造的情况下,对其成员进行访问,即获得属性的值以及调用其中的方法等. 为了更好的说明,下面用控制台程序来举例说明: /// <summary> /// Person对象/// </summary> class Person    {        public string FirstName { get; set; } public string LastName { get; set; }        public void GetFullN

Python学习——反射

class Foo(object): def __init__(self): self.name = 'wupeiqi' # self.age = age def func(self): print("func is running.") return 'func' obj = Foo() # #### 检查是否含有成员 #### print(hasattr(obj, 'name')) print(hasattr(obj, 'func')) # # #### 获取成员 #### pri

java学习----反射

目录 1.什么是反射 2.反射的运用 3.总结   一.什么是反射 反射:反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力   ----by  维基百科 java中的反射也是如此,利用反射的原理我们可以在程序运行时候的能够动态的创建对象,并且调用对象的方法和属性 它的作用是:1.在运行时判断任意一个对象类型 2.在运行时候能够构造任意一个对象 3.在运行时候判断一个类的属性和方法 反射在实际开发中的运用主要是在编写第三方jar包中比较多.我们可以运用反

JAVA学习--反射属性操作

1 //获取对应的运行时类的属性 2 @Test 3 public void test1(){ 4 Class clazz = Person.class; 5 //1.getFields():只能获取到运行时类中及其父类中声明为public的属性 6 Field[] fields = clazz.getFields(); 7 8 for(int i = 0;i < fields.length;i++){ 9 System.out.println(fields[i]); 10 } 11 Syste