Пусть User
случай класс, который содержит информацию о пользователе:Scala: сериализуемая альтернатива java.lang.reflect.Field
case class User(name: String, age: Int)
данного имени поля (например, "name"
или "age"
), я хочу вернуться a функция, которая извлекает это поле (без разбора имени поля снова). Короче говоря, мне нужно, чтобы это работало:
val u = User(name = "john",age = 44)
val func = extractFunctionFromFieldName("name") // returns func: User => Any
func(u) // return "john"
Читая о рефлексии, я получил что-то вроде этого, чтобы работать:
def extractFunctionFromFieldName(s: String): User => Any = {
val f = classOf[User].getDeclaredField(s)
f.setAccessible(true)
u: User => f.get(u)
}
Проблема заключается в том, что эта функция не сериализации, поскольку java.lang.reflect.Field
не сериализации.
Любые предложения или альтернативы?
Notes/более фона:
- Список полей намного больше, чем просто
{name,age}
и постоянно растет. Вот почему я хочу избежать жесткого кодирования - Использование
productElement
должно работать без проблем с сериализацией, поскольку поля заменяются цифрами. Но я понимаю, что нет никаких гарантий относительно порядка элементов продукта. - BTW, мне нужно, чтобы он был сериализуемым, поскольку я использую это с искровой апачей.
Благодарим за ответ. Но, как я сказал в вопросе, я хотел бы, чтобы функция избегала необходимости синтаксического анализа строки, содержащей имя поля, каждый раз при вызове функции. Представьте, что функция генерируется один раз, но применяется в миллиард раз. – Amir
Именно поэтому я дал последнее решение. Он создаст 'f' только в конструкторе, т. Е. В вашем случае при десериализации. –
Вы также должны рассмотреть решение 'productElement', которое вообще не будет включать отражение. –