Как контроллеры Play вводят переменные с соответствующим именем в шаблоны?

В Воспроизвести начальные документы, они показывают этот контроллер:

public static void index() {
  Post frontPost = Post.find("order by postedAt desc").first();
  List<Post> olderPosts = Post.find("order by postedAt desc").from(1).fetch(10);
  render(frontPost, olderPosts);
}

Затем в шаблоне frontPost и oldPosts используются без какого-либо специального сопоставления!

<a href="#">${frontPost.title}</a>

Как игра сохраняет эти имена?

Ответ 1

Выполняется с помощью инъекции кода.

При компиляции некоторые классы расширены (с введением кода, Javassist), чтобы добавить некоторые сведения, такие как имена переменных.

В методе рендеринга эту операцию выполняет класс класса play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer.