[转载]使用反射技术动态创建类对象(实例代码)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 经过数天的研究,终于能动态加载数据访问层了。虽然网上有不少介绍反射的文章,但都是从理论上来说的,没有一个特别详细的例子,所以一直没能写出实际代码。这里把自己的一段代码写出来,希望能够帮助像我一样的初学者快速上手,先应用,再深入,免得着急。

经过数天的研究,终于能动态加载数据访问层了。虽然网上有不少介绍反射的文章,但都是从理论上来说的,没有一个特别详细的例子,所以一直没能写出实际代码。这里把自己的一段代码写出来,希望能够帮助像我一样的初学者快速上手,先应用,再深入,免得着急。

首先说一下基本信息,本例以对数据库中的一个表Sort(类别)的访问为基础。表结构就不说了,而且我也不想涉及到对数据库的具体操作,主要是看一下思路。关于反射的一些概念和基本常识,请参考相关文章,网上有写得非常好的,作者就不班门弄斧了。

首先创建几个存放类文件的目录:    

    IDAL,表示数据访问层接口;

    SQLServerDAL,表示数据访问层,用于操作SQL Server数据库;

    AccessDAL,表示数据访问层,用于操作Access数据库;

    DALFactory,表示数据访问层类的类工厂;

    BLL,表示业务逻辑层;

然后在各文件夹下建立类,下面是对应的类的代码,命名空间为 “KoalaStudio.BookshopPortal”,这里只保留了最必要的代码。

(1)首先建立一个数据访问层接口KoalaStudio.BookshopPortal.IDAL.ISort:

    using System;

    using System.Data; 

    namespace KoalaStudio.BookshopPortal.IDAL 

     { 

        interface ISort 

       

            DataSet GetList();  

        }

    }

说明:首先定义了一个数据访问层接口,所有的数据访问层类都必须派生于该接口,这样就能对业务逻辑层提供统一的调用方法。

(2)然后建立数据访问层类KoalaStudio.BookshopPortal.SQLServerDAL.Sort和KoalaStudio.BookshopPortal.AccessDAL.Sort

    using System;

    using System.Data;

    using KoalaStudio.BookshopPortal.IDAL; 

    

    namespace KoalaStudio.BookshopPortal.SQLServerDAL 

     {

        class Sort : ISort        

            // 得到类别信息列表 

             public DataSet GetList()

            

                //此处为SQL数据库访问代码,得到的结果作为一个数据集返回

            }

        }

    

    namespace KoalaStudio.BookshopPortal.AccessDAL

    { 

        class Sort : ISort 

        { 

             // 得到类别信息列表 

            public DataSet GetList() 

           { 

               //此处为Access数据库访问代码,得到的结果作为一个数据集返回             }

        }

    }

说明:两个类都派生于ISort,实现的功能相同,不同点就是所操作的数据库不同

(3)下面就是类工厂的实现

    using System;

    using System.Reflection;

    using KoalaStudio.BookshopPortal.IDAL; 

    namespace KoalaStudio.BookshopPortal.DALFactory

     {

        class Sort 

       {

            public static KoalaStudio.BookshopPortal.IDAL.ISort Create() 

           { 

               //后台使用SQL Server数据库

                 string className = "KoalaStudio.BookshopPortal.SQLServerDAL.Sort";

                 //如果后台使用Access数据库,则写成:

               //string className = "KoalaStudio.BookshopPortal.AccessDAL.Sort";

                 Type t = Type.GetType(className); 

                 return (ISort) Activator.CreateInstance(t);       

            } 

        }

    }

说明:首先得到一个字符串,这个字符串就是需要使用的数据访问层类的名称。再实际环境中,需要把这个字符串存储于配置文件中,这样在程序运行时,只要修改了字符串也就修改了程序操作数据库的代码,而不用重新编译。

“Type t = Type.GetType(className);”根据字符串提供的类名称返回这个类的类型信息,然后用“Activator.CreateInstance(t)”即可将此类实例化。最后用“(ISort)”将得到的实例转换为“KoalaStudio.BookshopPortal.IDAL.ISort”类型。

(4)最后是KoalaStudio.BookshopPortal.BLL.Sor类

    using System;

    using System.Data;

    using KoalaStudio.BookshopPortal.IDAL; 

    

    namespace KoalaStudio.BookshopPortal.BLL

    

        public class Sort 

        { 

             /// 返回类别名称列表

             public static DataSet GetNameList()

            {

                 ISort sortDal = DALFactory.Sort.Create();

                 return sortDal.GetMainList();

            }

        }

    }

说明:用“ISort sortDal = DALFactory.Sort.Create();”既可直接生成一个数据访问类的实例。在这里,我们不必理会后台是什么数据库,只需要直接使用类工厂给我们提供的数据访问类实例即可。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
3月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
73 4
|
5月前
|
Java
java反射-获取类的属性、构造方法、方法
java反射-获取类的属性、构造方法、方法
|
5月前
|
Java
java反射-使用Class对象创建对象
java反射-使用Class对象创建对象
|
5月前
|
安全 Java
JAVA反射调用方法
JAVA反射调用方法
|
XML Java 数据格式
Java中静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象
Java中静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象
159 0
|
Java API
Java反射(通过反射获取构造函数、方法、属性)
1.通过反射获取构造函数,2.通过反射获取方法,3.通过反射调用成员属性
114 0
如何使用反射获取类对象
如何使用反射获取类对象
126 0
如何使用反射获取类对象
获得一个类的类对象有哪些方式?
方法1:类型.class,例如:String.class 方法2:对象.getClass(),例如:”hello”.getClass() 方法3:Class.
1855 0
Java反射 - 类对象
使用Java反射,您可以在运行时检查Java类。在使用Reflection时,检查类往往是你做的第一件事。从课程中你可以获得有关的信息 Class Name Class Modifies (public, private, synchronized etc.) Package Info Superclass Implemented Interfaces Constructors Methods Fields Annotations 加上更多与Java类相关的信息。
798 0