2013-08-18 2 views
0

У меня есть десятки фрагментов JSON для синтаксического анализа, и для каждого из них мне нужно получить экземпляр правильного синтаксического анализатора. Моя идея состояла в том, чтобы создать конфигурационный файл, в котором нужно записать имя класса для создания экземпляра для каждого парсера (своего рода парсер URL-адреса карты). Возвращаясь к вашему решению, я не могу вызвать метод, который я реализовал в каждом парсере, если у меня есть указатель на Any. Я полагаю, что это очень распространенная проблема с хорошо продуманным решением, но я понятия не имею, какие могут быть лучшие методы.Scala v 2.10: Как получить новый экземпляр класса (объекта), начинающегося с имени класса

У меня действительно нет опыта работы с Java, Reflection, Class Загрузка и все такое. Итак, может ли кто-нибудь написать мне тело метода ниже? Мне нужно, чтобы получить экземпляр класса, переданного в качестве строки (аргументы не нужны для конструктора, по крайней мере, до сих пор ...)

def createInstance(clazzName: String) = { 
    // get the Class for the given clazzName, e.g. "net.my.BeautifulClazz" 

    // instantiate an object and return it 
} 

Спасибо, как обычно ...

ответ

1

Существует очень простой ответ:

scala> def createInstance(clazzName: String) = Class.forName(clazzName).newInstance 
createInstance: (clazzName: String)Any 

scala> createInstance("java.lang.String") 
res0: Any = "" 

Если это сработает для вас, все в порядке. Если это не так, мы должны заглянуть в ваш загрузчик классов. Обычно это вопрос, когда все станет грязным.

В зависимости, что вы хотите сделать, смотрите в:

  1. The cake pattern, если вы хотите, чтобы объединить свои классы во время компиляции
  2. OSGi, когда вы хотите создать плагин инфраструктуры (смотрите here для очень простой пример)
  3. Google guice, если вам действительно нужна инъекция зависимостей (например, при смешивании Scala и Java-коде) и шаблон торта не работает для вас
+0

Спасибо, за ответ. Ну, у меня есть кое-что, чтобы сказать о том, что вы предлагаете. Я нашел решение, которое вы разместили, и мне нужно отбросить его от Any до определенного объекта, который я разработал. Я только что добавил краткое объяснение того, что я пытаюсь сделать в своем оригинальном посте. Еще раз спасибо за вопрос. – Max

+0

Хорошо, я просто понял, что могу достичь своей цели, используя простой шаблон Factory: не нужно для загрузки классов или таких. Еще раз спасибо. – Max