利用反射技术创建只包含私有无参构造函数的对象实例
2005-11-09 05:26 晓风残月 阅读(1722) 评论(2) 编辑 收藏 举报
呵呵,非常努力终于发了第一帖了.......
反射(reflection)简介:
反射是.NET架构的内建技术,通过 reflection,我们可以动态创建类的实例,可以是本地或是远程对象,或者获取对远程对象的引用。不仅如此,利用反射技术可以获取某个程序级所有类的列表,以及每个类中的所有方法和属性,还可以获得某个对象中所有实例变量列表,并且允许我们获取或者更改这些变量(包括私有变量)。
反射功能是如此的强大了,以至于是非常的危险,因为他可以打破对象的封装性(面向对象三大特性之一)。在我还没有认识到 reflection的强大功能时,我不禁想:这简直是 MS 给我们预留的“后门”,是.net framework的一打 bug。然而,事实上,她又是如此讨人喜欢,如果没有她,一些系统可能无法实现。据我所知, nhibernate(一个从hibernate移植到.net平台的ORM工具)当中久用了大量的反射技术,比如,nhibernate 的映射列可以是 实体类的 私有字段和私有属性。
反射的常用功能,我就不罗嗦了(但是也是唠叨了这么多,呵呵。。。),我想说的是大家可能不易发现的一点:利用反射技术创建只包含私有无参构造函数的对象实例
只包含私有无参构造函数的 Book 类:
测试代码:
非常遗憾的是这个“后门”也不是很”完美“,因为这个私有构造函数是不能包含任何参数的。不过,一般私有构造函数应用在包含在只包含静态属性和静态方法的类中,以防止 用户 通过 new 操作创建类的实例,因此私有构造函数一般也是无惨的。
反射(reflection)简介:
反射是.NET架构的内建技术,通过 reflection,我们可以动态创建类的实例,可以是本地或是远程对象,或者获取对远程对象的引用。不仅如此,利用反射技术可以获取某个程序级所有类的列表,以及每个类中的所有方法和属性,还可以获得某个对象中所有实例变量列表,并且允许我们获取或者更改这些变量(包括私有变量)。
反射功能是如此的强大了,以至于是非常的危险,因为他可以打破对象的封装性(面向对象三大特性之一)。在我还没有认识到 reflection的强大功能时,我不禁想:这简直是 MS 给我们预留的“后门”,是.net framework的一打 bug。然而,事实上,她又是如此讨人喜欢,如果没有她,一些系统可能无法实现。据我所知, nhibernate(一个从hibernate移植到.net平台的ORM工具)当中久用了大量的反射技术,比如,nhibernate 的映射列可以是 实体类的 私有字段和私有属性。
反射的常用功能,我就不罗嗦了(但是也是唠叨了这么多,呵呵。。。),我想说的是大家可能不易发现的一点:利用反射技术创建只包含私有无参构造函数的对象实例
只包含私有无参构造函数的 Book 类:
using System;
namespace MyCompany.MyApp.BizEntity
{
public class Book
{
ctor(s)
private System.String _Name;
public System.String Name
{
get { return _Name; }
set { _Name = value; }
}
private System.String _Author;
public System.String Author
{
get { return _Author; }
set { _Author = value; }
}
}//class Book
}//namespace MyCompany.MyApp.BizEntity
namespace MyCompany.MyApp.BizEntity
{
public class Book
{
ctor(s)
private System.String _Name;
public System.String Name
{
get { return _Name; }
set { _Name = value; }
}
private System.String _Author;
public System.String Author
{
get { return _Author; }
set { _Author = value; }
}
}//class Book
}//namespace MyCompany.MyApp.BizEntity
测试代码:
using System;
using System.Reflection;
namespace MyCompany.MyApp.BizEntity
{
public class Fixture
{
public void Main()
{
Book book;
//book = new Book(); //编译错误
book = (Book)Activator.CreateInstance( typeof(Book), true ); //编译成功
}
}//class Texfiur
}//namespace MyCompany.MyApp.BizEntity
using System.Reflection;
namespace MyCompany.MyApp.BizEntity
{
public class Fixture
{
public void Main()
{
Book book;
//book = new Book(); //编译错误
book = (Book)Activator.CreateInstance( typeof(Book), true ); //编译成功
}
}//class Texfiur
}//namespace MyCompany.MyApp.BizEntity
非常遗憾的是这个“后门”也不是很”完美“,因为这个私有构造函数是不能包含任何参数的。不过,一般私有构造函数应用在包含在只包含静态属性和静态方法的类中,以防止 用户 通过 new 操作创建类的实例,因此私有构造函数一般也是无惨的。