EL语句:${person.dog.name}如何知道属性"person"是Person类型?

How does EL statement: ${person.dog.name} know that attribute "person" is of type Person?

我有这些来自 Head First 书中的图片:


我希望您注意替换 ${person.dog.name} 的代码。我唯一想知道的是它如何知道属性“person”是 Person 类型的对象?当然是getAttribute() returns Object,所以肯定要转成Person,可是它怎么知道是从Person class?

我猜这段代码之前使用 findAttribute() 来查找存储值为“person”的属性的范围。稍后它会尝试使用 getAttribute() 获取它。所以在它找到它之后,它得到它——但它仍然不知道它在现实中得到了什么。所以 how/where 它“弄清楚”它是 Person 类型了吗?

没有。通过在 任何对象 person 解析为 上寻找方法 getDog(),然后重复该过程,使用反射来解析属性。

EL 引擎看到 person 并在美化的 HashMap 中查找它(这是 request.setAttribute 正在填充的 - 美化的哈希图)。

它在那里找到一个对象,因为你设置了它。它获取此对象并对其调用 .getClass(),returns Person.class。然后它在 dog 上运行 capitalizer 函数以生成 getDog。然后它使用 .getFields() 扫描所有字段以及使用 .getMethods() 的所有方法,查找名为 dog 的字段或名为 getDog 的无参数实例方法。它找到方法并调用它。

重复此原则以了解它最终如何处理 .name 部分。

现在 EL 有一个对象(在任何对象上调用 getName 的结果 wsas 通过反射调用 getDog 在任何 person 上返回),以及到位的 toStrings。

我不认为它是 HTML 逃避它,所以这是一本 'helpfully' 告诉您如何使用过时技术 (JSP) 来创建安全漏洞的书。太好了。

你有新书吗?你可能想要买不到 10 年的东西:)