使用ExpandoMetaClass添加构造函数

本文介绍如何使用Groovy的ExpandoMetaClass为已有类添加默认构造函数,避免修改原始代码。探讨了直接覆盖默认构造函数可能导致的问题,并提供了解决方案。

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

在写测试用例的时候, 要构造测试数据, 发现有一个类没有默认的构造函数, 而又不希望使用用户定义的构造函数, 另外也不想修改生产源代码, 因此需要添加一个默认的构造函数. 使用Groovy的ExpandoMetaClass就可以实现, 具体文章看这里([url]http://groovy.codehaus.org/ExpandoMetaClass+-+Constructors[/url])
通过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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值