有没有一种方法可以在eval中调用类方法?

卡格勒

我正在编写Groovy脚本,将其粘贴到要运行的基于Web的系统中。有一个可供在此环境中运行的脚本使用的类,我将其称为BrokenClass它有一个错误,该错误仅接受字符串文字作为其第一个参数,而不接受其中带有字符串的变量。因此,这将起作用(它返回一个列表):

BrokenClass.reflist('something', 'name')

但是,如果我尝试将变量用作第一个参数,则会出现错误:

list_name = 'something'
BrokenClass.reflist(list_name, 'name')

这将产生消息Metadata RefList[something] cannot be accessed

我对BrokenClass没有任何控制权(除了在上面提交错误外)。我试图通过以下方法解决该问题:

list_name = "foo"
list_call = "BrokenClass.reflist(${list_name}, 'name')"
list_values = Eval.me(list_call)

但是,这会产生一个错误:

groovy.lang.MissingPropertyException: No such property: BrokenClass for class: Script1

我尝试import在字符串中添加,但随后得到unable to resolve class BrokenClass

有没有一种方法可以BrokenClass在评估字符串中使用?还是我没有考虑过解决该bug的其他方法BrokenClass.reflistswitch由于可能的列表名称已更改,因此出现了一个很长的块。

方法签名为BrokenClass.reflist

public static List<Object> reflist(String reflistName, String field);
伊曼纽尔·罗莎(Emmanuel Rosa)

我怀疑BrokenClass.reflist()是通过使用==运算符而不是直接或间接进行了不正确的String比较String.equals()请参见文章的不同的解释。

问题

这是问题的示范:

def a = 'whatever'
def b = 'what' + 'ever'

assert doSomething('whatever') == 'OK'
assert doSomething(a) == 'OK'
assert doSomething(b) == 'ERROR'

def doSomething(String value) {
    if(value.is('whatever')) { // In Java this would be: value == "whatever"
        'OK'
    } else {
        'ERROR'
    }
}

由于它使用的是引用相等,在Groovy中是由Object.is(Object)方法完成的BrokenClass.reflist()因此无意中将其编码为仅适用于String文字:具有相同值的所有String文字都引用相同的String实例,从而得出True。在运行时以相同的文字值组成的String不会引用相同的String实例。

变通

显然BrokenClass.reflist()应该是固定的。但是,您可以使用一个Interned String来解决此问题

def b = 'what' + 'ever'

assert doSomething(b.intern()) == 'OK'

def doSomething(String value) {
    if(value.is('whatever')) { 
        'OK'
    } else {
        'ERROR'
    }
}

如果变量的值与String文字的值匹配,variable.intern()则将返回与匹配文字相同的String实例。这将使Java ==运算符可以按需工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以在类名称与全局函数相同的方法中调用全局函数?

来自分类Dev

有没有一种方法可以过滤R中函数调用的结果?

来自分类Dev

有没有一种方法可以从代码中调用GoogleSpreadSheet插件?

来自分类Dev

有没有一种方法可以过滤R中函数调用的结果?

来自分类Dev

有没有一种方法可以检测类或html中的辅助路由?

来自分类Dev

有没有一种方法可以记录所有DOM方法调用

来自分类Dev

有没有一种方法可以记录给定类的每个方法的每次调用?

来自分类Dev

有没有一种方法可以记录给定类的每个方法的每次调用?

来自分类Dev

有没有一种方法可以调用Sprite类的唯一重要参数?

来自分类Dev

有没有一种方法可以在python中为类的所有实例运行方法?

来自分类Dev

有没有一种方法可以在python中为类的所有实例运行方法?

来自分类Dev

有没有一种方法可以在类之间使用方法?

来自分类Dev

有没有一种方法可以在类之间使用方法?

来自分类Dev

有没有一种方法可以保存带有参数的函数调用?

来自分类Dev

有没有一种方法可以保存带有参数的函数调用?

来自分类Dev

有没有一种方法可以调用纯虚拟类的“删除析构函数”?

来自分类Dev

有没有一种方法可以确定哪个类在.NET中称为静态方法

来自分类Dev

有没有一种方法可以访问某个类中某个类型的所有变量?

来自分类Dev

有没有一种方法可以对类中的所有成员使用`std :: optional`

来自分类Dev

有没有一种方法可以扩展并调用std :: functions元组?

来自分类Dev

有没有一种方法可以获取脚本标记被调用的位置?

来自分类Dev

有没有一种方法可以授权直接调用Paypal API的订单

来自分类Dev

有没有一种方法可以在Java类中使用gradle变量

来自分类Dev

有没有一种方法可以防止填充类的填充

来自分类Dev

有没有一种方法可以隐式类覆盖默认实现

来自分类Dev

有没有一种方法可以指定类的默认属性?

来自分类Dev

有没有一种方法可以使用Smoke获得类的注释?

来自分类Dev

有没有一种方法可以完成eval的工作而无需在Python中使用eval

来自分类Dev

有没有一种方法可以在linq查询中参数化方法?

Related 相关文章

  1. 1

    有没有一种方法可以在类名称与全局函数相同的方法中调用全局函数?

  2. 2

    有没有一种方法可以过滤R中函数调用的结果?

  3. 3

    有没有一种方法可以从代码中调用GoogleSpreadSheet插件?

  4. 4

    有没有一种方法可以过滤R中函数调用的结果?

  5. 5

    有没有一种方法可以检测类或html中的辅助路由?

  6. 6

    有没有一种方法可以记录所有DOM方法调用

  7. 7

    有没有一种方法可以记录给定类的每个方法的每次调用?

  8. 8

    有没有一种方法可以记录给定类的每个方法的每次调用?

  9. 9

    有没有一种方法可以调用Sprite类的唯一重要参数?

  10. 10

    有没有一种方法可以在python中为类的所有实例运行方法?

  11. 11

    有没有一种方法可以在python中为类的所有实例运行方法?

  12. 12

    有没有一种方法可以在类之间使用方法?

  13. 13

    有没有一种方法可以在类之间使用方法?

  14. 14

    有没有一种方法可以保存带有参数的函数调用?

  15. 15

    有没有一种方法可以保存带有参数的函数调用?

  16. 16

    有没有一种方法可以调用纯虚拟类的“删除析构函数”?

  17. 17

    有没有一种方法可以确定哪个类在.NET中称为静态方法

  18. 18

    有没有一种方法可以访问某个类中某个类型的所有变量?

  19. 19

    有没有一种方法可以对类中的所有成员使用`std :: optional`

  20. 20

    有没有一种方法可以扩展并调用std :: functions元组?

  21. 21

    有没有一种方法可以获取脚本标记被调用的位置?

  22. 22

    有没有一种方法可以授权直接调用Paypal API的订单

  23. 23

    有没有一种方法可以在Java类中使用gradle变量

  24. 24

    有没有一种方法可以防止填充类的填充

  25. 25

    有没有一种方法可以隐式类覆盖默认实现

  26. 26

    有没有一种方法可以指定类的默认属性?

  27. 27

    有没有一种方法可以使用Smoke获得类的注释?

  28. 28

    有没有一种方法可以完成eval的工作而无需在Python中使用eval

  29. 29

    有没有一种方法可以在linq查询中参数化方法?

热门标签

归档