2

我想调用一个类的静态方法而不将任何对象放在 JEXL 的上下文中。

对于实例方法,我们将一个对象放入 MapContext 并使用键调用该方法。但就我而言,我没有任何上下文。${person.howYouDoing()}我不想使用 person 对象放在上下文中。

4

3 回答 3

1

https://issues.apache.org/jira/browse/JEXL-140对此进行了很好的讨论,作为 JEXL 改进。

提出这个要求的人提出了一个解决方案,将负担放在了 JEXL 程序员身上。它创建一个 String 只是为了获取 String 类,该类仅用于查找所需的类。

${''.class.forName('person').howYouDoing()}

...假设“人”在默认包中。这可用于为没有公共构造函数的类(如 Pattern)调用静态构造函数:

${''.class.forName('java.util.regex.Pattern').compile('\\d{2}-(\\w{3})-\\d{2}')}

顺便说一句,JEXL 开发人员建议子类化JexlContext总是返回任何存在的类。这比要求您的模板编写者执行''.class.forName()hack 更优雅,但由于您不想修改您的MapContext,它可能无法满足您的问题。它还污染了所有类的上下文。

于 2018-12-31T16:33:11.067 回答
0

从文档中:

ns:function JexlEngine 可以注册用作函数命名空间的对象或类。这可以允许如下表达式:math:cosinus(23.0)

https://commons.apache.org/proper/commons-jexl/reference/syntax.html

所以你必须用 JexlEngine 注册一个类

于 2018-02-02T14:39:47.997 回答
-2

从任何地方调用静态方法都没有问题。检查您是否已导入静态方法的类并且它在类路径中。

于 2018-02-02T14:04:15.420 回答