如何在不在JEXL中创建该类的实例的情况下调用java类的静态方法?

时间:2018-02-02 13:54:36

标签: java static static-methods jexl

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

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

3 个答案:

答案 0 :(得分:0)

来自文档:

  

ns:function一个JexlEngine可以注册用作的对象或类   函数命名空间。这可以允许表达式:   数学:余弦(23.0)

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

所以你必须在JexlEngine上注册一个班级

答案 1 :(得分:0)

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()黑客操作更为优雅,但是由于您不想修改MapContext,因此可能无法满足您的问题。它还会污染所有类的上下文。

答案 2 :(得分:-1)

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