`
net_liu
  • 浏览: 232774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

反射技术

阅读更多

什么是反射?

反射就是在运行时,动态获取对象信息的方法。比如:运行时获得对象有哪些属性,方法,委托等。

反射的作用?

能够实现运行时,动态调用对象的方法,以及动态设置、获取属性值等。

反射的示例:

using System; 
using System.Reflection; 
  
namespace CS_Test 
{ 
    public class MyStudent 
    { 
        private string sName; 
        public string SName 
        { 
            get { return sName; } 
            set { sName = value; } 
        } 
  
        private int sAge; 
        public int SAge 
        { 
            get { return sAge; } 
            set { sAge = value; } 
        } 
    } 
  
    class Test_Attribute 
    { 
        [STAThread] 
        static void Main(string[] args) 
        { 
            MyStudent stu1 = new MyStudent(); 
            stu1.SName = "刘德华"; 
            stu1.SAge = 40; 
             
            // 获得所有属性 
            PropertyInfo[] pros = stu1.GetType().GetProperties(); 
            // 显示所有属性值 
            foreach (PropertyInfo pro in pros) 
              Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null)); 
  
            //更改stu1对象的SAge值 
            stu1.GetType().GetProperty("SAge").SetValue(stu1, 30, null); 
  
            // 显示所有属性值 
            foreach (PropertyInfo pro in pros) 
              Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null)); 
        } 
    } 
} 

 

(二)关于特性

什么是 Attribute?
它是对运行时的对象或对象的属性、方法、委托等进行描述的

Attribute 的作用?
用于在运行时,描述你的代码或者影响你的程序的行为。

注意:

既然Attribute 是类,那么它的定义与定义类一样。

唯一不同的就是,自定义Attribute 类必须继承于System.Attribute 空间。

特性的示例:

 //描述数据库字段的 Attribute 
    public class DataFieldAttribute : Attribute 
    { 
        public DataFieldAttribute(string fieldName,string fieldType) 
        { 
            this._fieldName = fieldName; 
            this._fieldType = fieldType; 
        } 
  
        // 数据库字段名 
        private string _fieldName; 
        public string FieldName 
        { 
            get { return _fieldName; } 
            set { _fieldName = value; } 
        } 
  
        // 数据库字段类型 
        private string _fieldType; 
        public string FieldType 
        { 
            get { return _fieldType; } 
            set { _fieldType = value; } 
        } 
    } 

 

通过自定义Attribute,我们定义了类属性和数据库字段的一一对应关系,于是对MyStudent 类的Name、Age 属性都加上Attribute 的描述,指定他们对应的数据库字段名以及类型。

代码更改如下:

  public class MyStudent 
    { 
        private string _name; 
  
        //使用“特性”描述对应的数据库字段名、类型 
        [DataFieldAttribute("SName", "varchar")] 
        public string Name 
        { 
            get { return _name; } 
            set { _name = value; } 
        } 
  
        private int _age; 
  
        [DataFieldAttribute("SAge", "int")] 
        public int Age 
        { 
            get { return _age; } 
            set { _age = value; } 
        } 
    } 

 

(三)ORM 映射规则的定义

给实体类增加DataFieldAttribute 的描述,其实就是增加了O(对象)/ R(关系数据库)的映射规则。

下面我们就通过反射的方法实现:在运行时动态获取O/R  Mapping 的映射规则:

static void Main(string[] args) 
{ 
    MyStudent stu1 = new MyStudent(); 
    stu1.Name = "刘德华"; 
    stu1.Age = 40; 
    //通过反射的方法来动态获取此映射规则 
  
    PropertyInfo[] infos = stu1.GetType().GetProperties(); 
    object[] objs_fieldAttr = null; 
    foreach (PropertyInfo info in infos) 
    { 
        // GetCustomAttributes:  
        // 返回实体对象中每个属性对应的“特性”信息(数据库字段名、类型) 
        objs_fieldAttr = info.GetCustomAttributes( 
                              typeof(DataFieldAttribute), false); 
        if (objs_fieldAttr != null) 
        { 
            Console.Write("实体类的属性名:" + info.Name); 
            Console.Write(" -> 数据库字段名:"); 
            Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[0]).FieldName); 
        } 
    } 
} 

 

显示结果:

实体类的属性名:Name -> 数据库字段名:SName
实体类的属性名:Age -> 数据库字段名:SAge

 

 

接下来的工作就是:怎样根据这种方法动态地从对象中获取映射规则,然后动态构造Insert、Update、Delete 等 SQL 语句。这就是实现自己的ORM 的原理。

 

 

这里的代码仅仅是举例,而要真正实现一个ORM,我们还需要考虑的很多,比如:
1、实体类对应于哪张数据库表?
2、数据库表中的 PK  和 FK(如果有的话)怎么表示?
……

 

学习来源:

分享到:
评论

相关推荐

    反射技术+简单工厂模式

    在编程领域,反射技术和简单工厂模式是两种非常重要的设计概念,它们在软件开发中有着广泛的应用。接下来,我们将深入探讨这两个知识点。 首先,让我们来理解什么是反射技术。反射是Java(以及其他支持反射机制的...

    基于光频域反射技术的超弱反射光纤光栅传感技术研究

    采用超弱反射光纤光栅(FBG)结合光频域反射技术(OFDR),实现了大容量、高空间分辨率的准分布式光纤光栅传感网络的解调。通过对拍频信号分离的优化和非线性矫正,利用拍频信号的频谱信息,实现了高空间分辨率的光纤...

    反射实例 帮助你透彻理解反射技术 .net

    在.NET框架中,反射是一种强大的工具,它允许程序在运行时检查自身并...同时,`AssiamlyTest`这样的示例资源对于学习和实践反射技术是非常宝贵的。理解并熟练运用反射,将极大地提升我们的编程能力和解决问题的效率。

    框架的概念及用反射技术开发框架的原理

    通过学习和理解框架的概念,以及如何利用反射技术开发框架,开发者能够更好地掌握Java编程的高级技巧,提高软件开发的生产力。在实际项目中,熟练运用各种框架可以极大地提升开发效率,同时也能保证软件的质量和可...

    JDBC_Java反射技术入门

    在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...

    jsp 反射技术例子

    Java反射技术是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在JSP(Java Server Pages)中,反射技术的应用可以帮助开发者在运行时动态地获取类的信息,...

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射技术Demo

    Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...

    java反射技术ppt

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和属性。通过反射,开发者能够获取关于类的信息,并且能够在运行时动态地创建对象和调用方法,这为编程带来...

    Java反射技术浅谈.pdf

    Java反射技术浅谈 Java反射技术是一种强大的技术,它允许Java程序访问、检测和修改它自己的状态或行为。通过反射,Java程序可以加载一个运行时才知道名称的类,获取其完整的内部信息,并创建其对象,或者对其属性...

    c# vs2008 反射技术演示代码.rar

    本压缩包文件“c# vs2008 反射技术演示代码.rar”显然是为了帮助初学者理解并掌握这一关键技术。 首先,我们需要了解什么是反射。在.NET Framework中,每一个类型(包括类、接口、结构等)都有一个与之对应的Type...

    基础深化和提高-java反射技术

    Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...

    反射技术详解

    常用的技术中的反射技术,上面有很详细的讲解

    java的反射技术

    ### Java的反射技术详解 #### 一、Java反射技术概述 Java反射技术是Java语言的一项重要特性,它赋予了Java程序“动态性”。利用反射机制,可以在程序运行时动态地获取类的信息,并直接操作这些信息。这对于那些...

    反射技术压缩和修复Access数据库(没有依赖)

    在这种背景下,"反射技术压缩和修复Access数据库(没有依赖)"的方案显得尤为重要。 反射技术,通常指的是在运行时通过程序动态地获取类、对象、方法等信息并进行操作的能力,这在编程中被称为“反射”。在.NET框架下...

    采用反射技术和XML的通用实体类

    本文将深入探讨如何结合反射技术和XML来实现通用实体类,并解释这两个技术在这一过程中的作用。 首先,让我们了解什么是反射技术。在Java中,反射是一种强大的工具,它允许程序在运行时检查和操作其他类、接口、...

    面试经常面试到的反射技术

    反射技术在Java编程语言中扮演着至关重要的角色,它是Java平台的一个强大特性,允许程序在运行时检查并操作自身。面试中,反射技术通常被用来评估候选人的高级Java理解和问题解决能力。以下是对这一主题的详细阐述:...

    利用太赫兹-衰减全反射技术对多西环素水溶液进行检测

    利用太赫兹-衰减全反射技术对多西环素水溶液进行检测,黄宇新,徐文道,太赫兹(THz)波是一种介于红外与微波之间的特殊波段的电磁波,其频率范围在0.1-10 THz之间。由于水对太赫兹波的吸收非常强烈,利用�

Global site tag (gtag.js) - Google Analytics