由CreateInstance所想到的......

本文介绍了在C#和Java中通过反射动态创建对象的方法,并列举了多种创建实例的技术,包括使用Class和Constructor类的newInstance方法、调用clone方法及反序列化等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//从程序集创建对象实例
string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//数据层的程序集名称
return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");

我最初以为CreatInstance只是创建一个引用,而不是实例...。其实这是创建实例的一种方法。

这句话还涉及到的一个知识点就是:C#中显/隐式实现接口

原文:http://www.cnblogs.com/dnawo/archive/2007/12/27/1016243.html

Java中创建对象的4中方法:

1、用new语句创建对象,这是最常用的创建对象的方式。

2、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

3、调用对象的clone()方法。

4、运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。

例子:http://blog.sina.com.cn/s/blog_4b81125f01000723.html

关于反射:
1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

 反射在实际中应用的例子:

我不必知道类的所有属性及方法,但是我可以将我需要得到或者改变的东西带入这个类中去创建一个实例。

比如在:页面有string name、int age、bool sex。java中提交页面的时候将以上用map封装成:类型&名字 这样的对象。我们只需要知道有一个类叫做proInfo,这个类里面可能有name、age、sex等等的处理信息。我们可以将UI上的名字与从这个类中取得的名字比较,然后进行get与set之类的操作。

我们只知道类名,但是我们想知道这个类里面的方法是不是有我们想要的,我们就可以动态的创建对象来实现。

另外,IDE编程工具用了很多反射。典型的就是:你在类名称后面输入一个" . ",会有相应的属性和方法显示。

using CodeEditor.CodeEdit; using Microsoft.CSharp; using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CodeEditor { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCompile_Click(object sender, EventArgs e) { //【1】新建C#代码生成器和代码编译器的实例 CodeDomProvider Provider = CodeDomProvider.CreateProvider("CSharp"); //【2】配置用于调用编译器的参数 CompilerParameters Parameters = new CompilerParameters(); Parameters.ReferencedAssemblies.Add("System.dll"); Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); Parameters.ReferencedAssemblies.Add("System.Linq.dll"); Parameters.GenerateExecutable = false; Parameters.GenerateInMemory = true; //【3】启动编译 CompilerResults Result = Provider.CompileAssemblyFromSource(Parameters, rtbCode.Text); if (Result.Errors.HasErrors) { AppendInfo("编译错误:"); foreach (CompilerError err in Result.Errors) { AppendInfo(err.ErrorText); } } else { // 通过反射,调用实例 Assembly objAssembly = Result.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("CodeEditor.CodeEdit.Code"); MethodInfo objMI = objHelloWorld.GetType().GetMethod("Test"); object ReValue = objMI.Invoke(objHelloWorld, null); AppendInfo(ReValue); } } //追加字符 private void AppendInfo(object Info) { rtbResult.Text =Info+"\n\r"; } } }
07-17
bool CDBConnect::ExecuteSqlW(const std::wstring& v_wstrSql, std::vector< std::vector<std::wstring>>& v_vvecwstrResult) { // 未连接 if(!IsConnect()) { LOG_FMT_ERROR(LOG_GET_ROOT(), "CDBConnect ExecuteSqlW With Result Not Connect"); SaveErrMsg(L"未连接"); return false; } // 关闭记录集 CloseRecordset(); // 是否成功执行 bool bOk = false; // 清空传入的数组 v_vvecwstrResult.clear(); // 将结果行数置零 m_dwResultRows = 0; try { // 创建记录集 if(S_OK != m_rsRecordsetPtr.CreateInstance(__uuidof(Recordset))) { LOG_FMT_ERROR(LOG_GET_ROOT(), "CDBConnect ExecuteSqlW With Result Create Recordset Failed"); return bOk; } // 以sql语句打开记录集 m_rsRecordsetPtr->Open(v_wstrSql.c_str(), m_cepConnectPtr.GetInterfacePtr(), adOpenDynamic, adLockReadOnly, adCmdText); // 空 if(NULL == m_rsRecordsetPtr || m_rsRecordsetPtr->adoEOF) { return true; } // 遍历记录集 std::vector< std::wstring> vecwstrCowRes; long lFiledCount = m_rsRecordsetPtr->Fields->Count; // 获取列名 vecwstrCowRes.clear(); for(long i = 0; i < lFiledCount; ++i) { try { vecwstrCowRes.push_back((wchar_t*)(m_rsRecordsetPtr->Fields->GetItem(i)->Name)); }catch(_com_error& ) { LOG_FMT_ERROR(LOG_GET_ROOT(), "CDBConnect ExecuteSqlW With Result Get Column Name Failed"); return bOk; } } v_vvecwstrResult.push_back(vecwstrCowRes); // 获取结果 while(!m_rsRecordsetPtr->adoEOF) { // 清空 vecwstrCowRes.clear(); for(long i = 0; i < lFiledCount; ++i) { _variant_t varValue = m_rsRecordsetPtr->Fields->GetItem(i)->Value; CString cstrValue; // ... 获取不同类型数据 vecwstrCowRes.push_back(cstrValue.AllocSysString()); } // 收集一行 v_vvecwstrResult.push_back(vecwstrCowRes); // 下一行 m_rsRecordsetPtr->MoveNext(); // 加1 ++m_dwResultRows; } // 获取成功 bOk = true; }catch(_com_error& ceComError) { LOG_FMT_ERROR(LOG_GET_ROOT(), "CDBConnect ExecuteSqlW With Result Failed"); if(NULL != ceComError.Description().GetBSTR()) { SaveErrMsg(ceComError.Description().GetBSTR()); // AfxMessageBox(ceComError.Description()); } } return bOk; }如何优化查询数据量过大卡死的情况
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值