Можно ли получить имена параметров метода в Scala - PullRequest
3 голосов
/ 04 марта 2011

Насколько я знаю, мы не можем сделать это на Java. Можем ли мы сделать это в Scala?

Предположим, существует метод, описанный ниже:

def insert(name:String, age:Int) {
    // insert new user
}

Можно ли получить имена параметров name и age в scala?


UPDATE

Я хочу сделать это, потому что я хочу автоматически связывать параметры методов.

Например, это веб-приложение, некоторые действия которого определены как

class UsersController extends Controller {
    def create(name: String, age: Int) {
          // insert the user
    }
}

Клиент нажал кнопку submit формы создания пользователя. URL будет /users/create и с некоторыми параметрами отправки.

На стороне сервера, когда мы получим URL с именем /users/create, мы найдем метод create в контроллере UsersController, найденный сейчас. Затем я должен получить имена параметров этого метода, затем мы можем получить их значения:

val params = getParamsFromRequest()
val method = findMethodFromUrl("/users/create")
val paramNames = getParamNamesOfMethod(method)
val paramValues = getValues(params, paramNames)

// then invoke
method.invoke(controller, paramValues)

Теперь ключ в том, как получить имена параметров метода?

Ответы [ 3 ]

9 голосов
/ 04 марта 2011

Это все еще очень a работа в процессе , но вы должны быть в состоянии:

import scalaj.reflect._
for {
  clazz <- Mirror.ofClass[UsersController].toSeq
  method <- clazz.allDefs.find(_.name == "insert").toSeq
  params <- method.flatParams
} yield params

Извините за toSeqs, оничтобы обойти известную проблему, используя Option s для простоты понимания.

Пожалуйста, не настаивайте слишком сильно, она все еще очень молода и хрупка.Я, конечно, еще не на той стадии, когда я принимаю сообщения об ошибках:)

ОБНОВЛЕНИЕ

Ну ... я знаю, что сказал, что я непринимать отчеты об ошибках, но этот показался настолько полезным, что я все равно отправил его на github.

Для динамического выполнения работы (из имени класса String):

import scalaj.reflect._
for {
  clazz <- Option(Class forName "x.y.UsersController")
  mirror <- Mirror.ofClass(clazz).toSeq
  method <- mirror.allDefs.find(_.name == "insert").toSeq
  params <- method.flatParams
} yield params
2 голосов
/ 04 марта 2011

Этот вопрос имеет некоторое представление о том, как это делается в Java: Есть ли способ получить имена параметров метода в Java?

1 голос
/ 04 марта 2011

Почему бы просто не использовать разные имена методов (чтобы отразить параметры, которые могут быть переданы)?Мол, craeteWithNameAndAgeAndGender (довольно стандартный подход).В любом случае вы не сможете иметь несколько методов с одинаковыми именами (/ arity / types type и порядком параметров) и просто разными именами параметров - перегрузка методов не работает таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...