2015-05-13 2 views
3

Это всего лишь очень простой пример того, что я хочу сделать. Есть немного больше, что происходит в методе foobar, но это суть того, что я делаю. Очевидно, что это не сработает, поскольку он не скомпилируется, но мне интересно, неправильно ли я передал класс неправильно или с помощью параметра «className» не так. Я знаю, что могу переработать его, чтобы взять строку имени класса и просто сопоставить ее, но, похоже, это позор. Это было бы так красиво и сухо.Groovy - Можно ли передать класс в качестве параметра?

class Foo { 
    String name 
} 

class Bar { 
    String name 
} 

def foobar(field, className) { 
    def instance = className.findByName(jsonParams.field) 
    if(!instance) { 
     instance = new className(name: jsonParams.field) 
    } 

    return instance 
} 

foobar(foos, Foo) 
foobar(bars, Bar) 

Я не знаю много Java или Groovy, поэтому я не уверен, что возможно, пока невозможно. Не стесняйтесь просто сказать мне «Нет». Я пробовал поиск в Интернете и не нашел ничего, что действительно ответит на вопрос для меня. Просто нет, было бы здорово в этот момент ха-ха.

+0

Какова цель параметра «field»? Обычно устанавливаете свойство? Похоже, вы хотите установить «имя» экземпляра, который создается, что можно сделать. – pickypg

+0

Да. Это именно то, что я хочу сделать. Тем не менее, он продолжает терпеть неудачу в этой строке, говоря, что он не может разрешить класс className. Параметр поля - это просто, чтобы вырезать правильные данные объекта json. –

+1

Попробуйте 'className.newInstance()' вместо 'new className()'. Также используйте 'foobar (field, Class className)', чтобы сделать подпись понятной для понимания. – dmahapatro

ответ

4

Да, можно передать класс в качестве аргумента - в Groovy классы являются гражданами первого класса (see this thread for more detail).

Эта конструкция: instance = new className(name: jsonParams.field) на самом деле пытается создать экземпляр класса с именем className, а не класса, на который ссылается эта переменная. Для того, чтобы сделать его компиляции, вам необходимо позвонить Class.newInstance:

class Foo { 
    String name 
} 
class Bar { 
    String name 
} 
def foobar(String name,Class clazz) { 
    def instance = clazz.findByName(name) 
    if(!instance) { 
     instance = clazz.newInstance(name:name) 
    } 

    return instance 
} 
foobar('foo', Foo) 
foobar('bar', Bar) 

Я не совсем уверен, что вы хотите достичь с помощью метода findByName, хотя - ни Foo, ни Bar есть статический метод findByName насколько я могу судить.

+1

'newInstance' - это именно то, что мне нужно. Спасибо за ответ. Я этого раньше не видел. –

Смежные вопросы