问题标签 [expandometaclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
17133 浏览

class - 复制 Groovy 类属性

我想以通用方式将对象属性复制到另一个对象(如果目标对象上存在属性,我会从源对象复制它)。

我的代码使用ExpandoMetaClass可以正常工作,但我不喜欢这个解决方案。还有其他方法可以做到这一点吗?

0 投票
2 回答
984 浏览

groovy - 带有 GMock 的具有多个静态方法的部分模拟类

我正在使用 GMock 为我们现有的 Java 项目添加一些单元测试。我们有多个需要测试的方法是静态方法的地方,它们在我们要测试的方法中使用了额外的静态方法。

我希望能够部分模拟该类,除了用于测试的初始入口点之外,该类几乎所有静态方法。

例如:

我希望我可以模拟第二个静态方法,但是一旦我这样做,method(String) 就会进入 MIA 并且执行测试失败并出现预期异常。有没有办法可以部分模拟类,保持第一种方法的功能,但模拟第二种方法的静态访问?

我也尝试过使用元类编程来模拟该方法,但如果我将方法设置为一个闭包,第一个方法会再次进入 MIA。不知道如何使用重载方法来做到这一点。有任何想法吗?

0 投票
1 回答
500 浏览

groovy - 用 groovy expando 元类覆盖 JList toString 方法以显示 groovy 类的实例

在一个 groovy swing 应用程序中,我有一个代表教师的类,如下所示:

Docente.groovy

我使用 toString 方法在 JTable 中显示教师姓名(带名词)以及某些其他值。想法是将其中一些显示在表格上,将其余部分显示在 JDialog 窗口上,以便执行子 CRUD 操作。

假设 sw 是 groovy 的 SwingBuilder 对象的一个​​实例,而 grdDocentes 是 JTable 的 id,我使用以下代码来填充该表:

DocentesUI.groovy

ObtenerDocentes() 是用于从数据库中获取所有教师的方法。第二列 (it) 是 Docente 实例本身,并且正如预期的那样,它显示调用 toString() 方法的 nombre 属性。我这样做是因为我发现在获取对象的其他属性时获取该表的第二列很方便。

现在,在另一个用户界面上,我想在 JList 中显示这些教师,但格式不同。这是 metaClass 的用武之地。在这个其他接口中,我想覆盖我的 Docente 类上的 toString()。因此,为此,我使用以下内容:

AsignarDocenteUI.groovy

这里,lstDocentesDisponibles 是 JList 的 id。当代码到达 println it.toString() 行时,它使用覆盖的 toString() 并向默认输出流显示“no entiendo”。但是,当我查看 JList 时,会显示原始的 toString()。我在这里想念什么?

任何提示表示赞赏。

谢谢,

爱德华多。

0 投票
3 回答
910 浏览

unit-testing - 覆盖 Grails GORM 域类上的事件关闭以进行单元测试

我正在开发一个新的 Grails 项目,最近注意到 Spring Security Core 生成的 User 类中的默认约定现在通过 beforeInsert/Update 事件自动编码密码。这是一种很好的、​​干净的、干燥的编码方式,也让人不可能忘记这样做。

但是,现在当尝试编写一些使用所述 User 类的单元测试时,我发现我要么必须模拟 springSecurityService (由于编码),或者更优选地(并且干净地),我只是覆盖beforeInsert/Update 闭包,其中一个什么都不做。通常在 Groovy 中,可以使用 ExpandoMetaClass 覆盖方法,阿拉...

...但我发现在创建和保存新用户时继续调用原始的 beforeInsert。这反过来又导致我的单元测试崩溃。解决这个问题并模拟服务对我来说是微不足道的,但上面应该可以工作。我错过了什么吗?GORM 的事件关闭有什么不同我没有接受的吗?

0 投票
1 回答
116 浏览

groovy - 替换/覆盖的无参数方法的结果未传递给构造函数

我试图通过替换该类中用于设置属性但未使用预期值设置属性的方法来更改 groovy 类的构造函数的行为。

0 投票
1 回答
731 浏览

java - Groovy 的 ExpandoMetaClass 的范围?

Groovy 公开了一个ExpandoMetaClass允许您将实例和类方法/属性动态添加到 POJO 的方法。我想用它来为我的一个 Java 类添加一个实例方法:

这相当于将Fizz类重构为:

我的问题:

这是否只添加doStuff(String blah)到这个特定的实例Fizz?还是现在的所有实例Fizz都有一个doStuff(String blah)实例方法?

如果是前者,我如何让所有实例Fizz都有doStuff实例方法?我知道如果我制作了 Groovy:

然后将添加一个静态类方法Fizz,例如Fizz.doStuff(String blah),但这不是我想要的。我只希望所有实例Fizz现在都有一个名为doStuff. 想法?

0 投票
4 回答
7698 浏览

java - 您可以使用 Groovy 元编程来覆盖 Java 类的私有方法吗

我正在尝试使用元编程覆盖 Java 类的私有方法。代码看起来像这样:

问题是 doSomethingCrazyExpensive 的重写实现没有被调用——我认为这是因为私有方法是由 init() 方法在内部调用的,而不是通过 metaClass 调用的。如果我直接调用 myProxy.doSomethingCrazyExpensive(),则会调用被覆盖的方法,因此元编程在某种程度上确实有效。

有没有办法使用元编程来覆盖 Java 类(或实例)上的方法,以便在内部调用被覆盖的实现时调用它?

0 投票
1 回答
68 浏览

groovy - Expando 元类行为取决于一个类是否是用户定义的?

在尝试 ExpandMetaClass 时,我遇到了这种行为:

哪个打印

这似乎不一致。这种行为背后的原因是什么?

0 投票
2 回答
109 浏览

grails - Grails:方法的 ExpandoMetaClass

考虑一种方法

如何为此编写 ExpandoMetaClass

0 投票
2 回答
205 浏览

groovy - 在 Groovy 中拥有可重用元类代码的优雅方式是什么?

我想对我的一些类应用元编程转换,比如说通过添加 printXxx 方法,如下所示:

我有一个粗略的想法,一旦我有了一个元类,如何做到这一点:

现在我如何把这段代码变成一个可重用的“库”?我想做类似的事情:

或者