如何调用 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 污染您的上下文。
我想调用 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 污染您的上下文。