EL 如何在不知道其 class 的情况下使用对象的方法和字段
How does EL work with methods and fields of object without knowing its class
当我们在 jsp 中做类似
的事情时,我无法理解它是如何工作的
${someObject.doMethod()}
我不明白的是我们没有在这里定义对象的 class 但是 jasper 编译了它并且这段代码有效。
我是说我们不写
${SomeClass someObject.doMethod()}
请解释一下它是如何工作的。
EL 正在后台使用 reflection API。因此,在您的示例中,someObject
首先取自当前上下文(您可以将其视为 Map
),然后进一步解析表达式的其余部分。例如,如果它以 ()
结尾,则在对象上搜索具有给定名称的方法。如果它是类似 ${someObject.someField}
的东西,那么会寻找一个 public getter,命名为 getSomeField()
,等等
@Prisoner 的一个很好的评论——需要注意的一件重要事情是 EL 是在运行时评估的。因此,如果您在某些表达式中使用的对象或方法实际上不存在,您将不会获得任何编译器 errors/warnings。
当我们在 jsp 中做类似
的事情时,我无法理解它是如何工作的${someObject.doMethod()}
我不明白的是我们没有在这里定义对象的 class 但是 jasper 编译了它并且这段代码有效。 我是说我们不写
${SomeClass someObject.doMethod()}
请解释一下它是如何工作的。
EL 正在后台使用 reflection API。因此,在您的示例中,someObject
首先取自当前上下文(您可以将其视为 Map
),然后进一步解析表达式的其余部分。例如,如果它以 ()
结尾,则在对象上搜索具有给定名称的方法。如果它是类似 ${someObject.someField}
的东西,那么会寻找一个 public getter,命名为 getSomeField()
,等等
@Prisoner 的一个很好的评论——需要注意的一件重要事情是 EL 是在运行时评估的。因此,如果您在某些表达式中使用的对象或方法实际上不存在,您将不会获得任何编译器 errors/warnings。