【问题标题】:Why have play framework templates access to private fields?为什么播放框架模板可以访问私有字段?
【发布时间】:2011-12-15 19:44:35
【问题描述】:

我有一个带有private 字段的类,并且怀疑模板在没有getX 方法的情况下无法访问它,但显示的值好像是public

class Task {
  private String title = "";
}

模板可以显示title,代码如下:

${task.title}

我猜这是由于反射魔法,但不应该没有 getter 就不可能渲染私有字段吗?

【问题讨论】:

    标签: java templates playframework private access-modifiers


    【解决方案1】:

    我的猜测是该框架正在动态添加 getter 和 setter 方法。尝试创建一个返回“覆盖”的 String getTitle() 方法,您肯定会知道。

    【讨论】:

    • 调用了getTitle() 方法,所以看起来 Play 正在自动生成 getter。但是documentation 表示这只会对类的任何公共、非静态、非最终字段进行。
    【解决方案2】:

    框架确实为公共字段生成了setter和getter,但是由于模板语言是Groovy并且Groovy似乎没有封装,所以不可访问的字段可以不受模板代码的任何限制访问。

    我报告了一个错误,但我真的不确定是否可以修复,因为 Play 1.x 的模板依赖于 Groovy(对于即将到来的 2.0 版本,play 将切换到 Scala 作为模板的语言) .

    如果你真的需要限制访问,你应该看看 SecurityManagers。它们可以防止对私有字段的反射,但我不知道您可以配置多精确的限制。


    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-07-23
      • 2021-06-29
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      相关资源
      最近更新 更多