`

使用ExpandoMetaClass添加构造函数

阅读更多
在写测试用例的时候, 要构造测试数据, 发现有一个类没有默认的构造函数, 而又不希望使用用户定义的构造函数, 另外也不想修改生产源代码, 因此需要添加一个默认的构造函数. 使用Groovy的ExpandoMetaClass就可以实现, 具体文章看这里(http://groovy.codehaus.org/ExpandoMetaClass+-+Constructors)
通过ExpandoMetaClass增加构造函数和增加方法有些不同, 不过其本质是给constructor 这个"特殊"的属性通过<<或=操作符赋一个闭包, 而参数就是该构造函数的参数.
class Book {
    String title
}
Book.metaClass.constructor << { String title -> new Book(title:title) }
def b = new Book("The Stand")


不过这里有一点需要特别注意, 如果需要覆盖原有的默认构造函数, 有可能出现堆栈溢出, 比如这样写:
class Book {
    String title
}
Book.metaClass.constructor = {  new Book() }
def b = new Book("The Stand")


其原因是因为通过Groovy的MetaClass循环调用了相同的默认构造函数, 避免出现这种情况的做法是使用Spring的BeanUtils方法:
class Book {
    String title
}
Book.metaClass.constructor = {  BeanUtils.instantiateClass(Book) }

def b = new Book("The Stand")
分享到:
评论

相关推荐

    构造函数和复制构造函数

    在main函数中,我们使用了多种方式来调用这些函数,例如语句1调用默认构造函数、语句2调用带参数的构造函数、语句5调用复制构造函数等。 在语句4中,我们使用了一个临时对象的方式来调用构造函数,这种方式可以理解...

    没有可用的复制构造函数或复制构造函数声明

    `std::map`在内部会使用复制构造函数来创建键值对的副本,因此如果类没有合适的复制构造函数,编译器将无法正确地处理这些对象。 首先,我们需要理解什么是复制构造函数。复制构造函数是一个特殊的构造函数,它在...

    包含构造函数和析构函数的C++程序

    ### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念...通过本篇文章的学习,我们应该能够掌握如何定义和使用构造函数与析构函数,并能在实际开发中灵活运用这些知识。

    构造函数与析构函数

    析构函数也是以类名作为函数名,与构造函数不同的是在函数名前添加一个“~”符号,标识该函数是析构函数。析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构...

    C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar

    在C++编程中,对象的构造过程涉及到多个层面,包括对象成员构造函数、基类构造函数以及派生类本身的构造函数。理解它们的执行顺序对于编写健壮的代码至关重要。以下将详细阐述这三个构造函数的调用时机和逻辑。 1. ...

    在派生类的构造函数中调用基类的构造函数

    在C++编程中,派生类继承自基类,它扩展或修改了基类的功能。在创建派生类的对象时,需要确保基类的...在实际开发中,尤其是在设计复杂的系统架构时,理解并正确使用派生类构造函数调用基类构造函数是不可或缺的技能。

    构造函数不能声明为虚函数的原因及分析

    构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时...

    继承类的构造函数

    在派生类的构造函数中,需要使用基类的构造函数名,后面括号内的参数表列中包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。例如,`Student1(int n, string nam, char s, int a, string ad):...

    构建一个类Point,它提供两个公有的构造函数,一个没有参数的Point构造函数和一个有两个double参数的构造函数。

    构建一个类Point,它提供两个公有的构造函数,一个没有参数的Point构造函数和一个有两个double参数的构造函数。另外在该类中提供一个静态方法计算两个点的直线距离,传入参数为两个Point类实例。然后设计一个测试类...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    例如,可以添加一个接收姓名、年龄等参数的构造函数,以便在创建对象时立即初始化这些属性。 3. **拷贝构造函数**:`cPerson::cPerson(cPerson &p)`,当通过一个已存在的`cPerson`对象创建新对象时,拷贝构造函数会...

    构造函数和析构函数PPT课件.pptx

    构造函数和析构函数PPT课件.pptx 构造函数是C++编程语言中的一种特殊的成员函数,它是在创建对象时由系统自动执行的函数。构造函数的主要功能是将对象初始化,并执行一些必要的操作,以便对象能够正确地工作。构造...

    构造函数实例(源码)

    复制构造函数是一种特殊的构造函数,它在创建新对象时使用已存在的对象作为参数。复制构造函数主要用于深拷贝或浅拷贝,以确保新对象与原对象具有相同的数据。例如: ```cpp class MyClass { public: MyClass...

    c#构造函数的调用过程

    在这个构造函数中,虽然原本应该使用`base`关键字来调用基类的构造函数,但示例中的注释部分显示了正确的做法。 ```csharp class C : B { public int z; // 接受三个整型参数的构造函数 public C(int i, int j,...

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    C#构造函数的理解

    - **使用多个构造函数**:类可以定义多个构造函数,这些构造函数可以有不同的参数列表。这种灵活性使得类可以在不同的情况下使用不同的初始化逻辑。 - **构造函数重载**:通过定义多个具有不同参数列表的构造函数,...

    构造函数不能为虚函数的理由

    构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。因此,构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数,而构造函数是在创建对象时...

    构造函数与默认构造函数

    构造函数与默认构造函数的声明、定义、应用、比较

    构造函数的继承问题 笔记

    ### 构造函数的继承问题 #### 背景与概念理解 ...综上所述,构造函数的正确使用对于确保类的继承关系能够正常工作至关重要。遵循正确的构造函数调用规则可以避免许多常见的编译时错误,并确保程序按预期运行。

    派生类构造函数和析构函数的执行顺序

    同样,派生类也需要添加析构函数来实现一些结束工作。 当创建对象时,编译系统会自动调用构造函数。构造函数的执行顺序是:首先执行基类的构造函数,然后执行派生类的构造函数。例如,在上面的例子中,当创建 B 类...

Global site tag (gtag.js) - Google Analytics