通过反射实现多数据访问

每种数据库都有自己的链接组件。比如:System.Data.SqlClient,System.Data.OracleClient,Oracle.DataAccess.Client,MySql.Data,IBM.Data.DB2,Sybase.Data.AseClient,iAnywhere.Data.AsaClient,Npgsql等等!

反射:

通过【Type类】可以访问任意数据类型信息,常使用Type类的静态方法GetType(),如Type t =Type.GetType("MySql.Data");这就拿到了组件(提前得先引用)的元数据。

(1)通过【Assembly类】加载程序集,例如:Assembly  m_asmSqlClient = Assembly.LoadWithPartialName(“Oracle.DataAccess”);//LoadWithPartialName()使用部分名称从应用程序目录或从全局程序集缓存加载程序集。

(2)Type m_typSqlConnection = m_asmSqlClient.GetType("Oracle.DataAccess.Client.OracleConnection" ) //GetType()可以得到加载进来的程序集中的类

(3)ConstructorInfo info = m_typSqlConnection.GetConstructor(types); //GetConstructor(Type types )//根据参数类型得到实例,比如:Type[] types = new Type[1]; types[0] = Type.GetType("System.String"); 表示参数是字符串

(4)IDbConnection con = info.Invoke(parameters) as IDbConnection; //Invoke()初始化传入符合的参数类型,得到需要的类,参数:object[] parameters = new object[1]; parameters[0] = “链接字符串”; 

//【Type类】

1.获取给定类型的Type引用有3种方式:
  a.使用typeof运算符,如Type t = typeof(int);
  b.使用GetType()方法,如int i;Type t = i.GetType();
  c.使用Type类的静态方法GetType(),如Type t =Type.GetType("System.Double");
2.Type的属性:
  Name:数据类型名;
  FullName:数据类型的完全限定名,包括命名空间;
  Namespace:数据类型的命名空间;
  BaseType:直接基本类型;
  UnderlyingSystemType:映射类型;
3.Type的方法:
  GetMethod():返回一个方法的信息;
  GetMethods():返回所有方法的信息。

//【Assembly】

System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。

Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。

在Assembly有很多的方法和属性,里面的加载程序集有3个方法,分别是Load、LoadFrom和LoadFile。

//【ConstructorInfo 】

ConstructorInfo 类可以发现类构造函数的属性 (Attribute) 并提供对构造函数元数据的访问权。说白了通过它可以访问类的属性和方法。

 

转载于:https://www.cnblogs.com/it-xcn/p/5955919.html

在Java中,反射是一种强大的特性,它允许你在运行时检查类的信息、创建实例、访问其字段和方法。动态创建数据源可以借助反射实现,尤其是在Spring框架中,如果你希望在运行时动态改变数据库连接信息。 以下是使用反射动态创建数据源的一个简单示例: ```java import java.lang.reflect.Method; import javax.sql.DataSource; // 定义一个包含数据源构造函数的接口 interface DynamicDataSourceFactory { DataSource createDataSource(); } // 实现工厂类 class DynamicDataSource implements DynamicDataSourceFactory { private String dataSourceName; // 例如"dataSource1" 或者 "dataSource2" @Override public DataSource createDataSource() throws Exception { Class<?> dataSourceClass = Class.forName("com.example.YourDataSourceClass"); // 替换为实际的数据源类名 Method constructor = dataSourceClass.getMethod("getInstance", dataSourceName); // 获取构造函数 return (DataSource) constructor.invoke(null, dataSourceName); } } // 在你的应用中,你可以这样使用动态数据源工厂 DynamicDataSourceFactory factory = new DynamicDataSource(); String currentDataSource = ...; // 根据当前环境动态设置的数据源名称 try { DataSource dataSource = factory.createDataSource(currentDataSource); // 使用动态创建的数据源 } catch (Exception e) { // 处理异常 } ``` 在这个例子中,`YourDataSourceClass`应该是实现了`javax.sql.DataSource`接口并且有一个根据数据源名称创建实例的静态方法。通过反射加载这个类并调用对应的构造函数,就能得到一个动态的数据源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值