如何调用 java class 的静态方法而不在 JEXL 中创建 class 的实例?

How to call a static method of a java class without creating an instance of that class in JEXL?

我想调用 class 的静态方法而不将任何对象放入 JEXL 的上下文中。

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

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

来自文档:

ns:function A JexlEngine can register objects or classes used as function namespaces. This can allow expressions like: math:cosinus(23.0)

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

所以你必须用 JexlEngine

注册一个 class

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

提出这个要求的人提出了一个解决方案,将负担放在 JEXL 程序员身上。它创建一个String只是为了得到Stringclass,它只是用来查找想要的class.

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

...假设 "person" 在默认包中。这可用于调用 classes 的静态构造函数,例如没有 public 构造函数的模式:

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

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