user4454360
user4454360

Reputation:

Groovy - Is it possible to pass a class as a parameter?

This is just a very basic example of what I want to do. There's a bit more that goes on in the foobar method, but it's the gist of what I'm doing. It obviously doesn't work, since it fails to compile, but I'm wondering if I'm just passing the class incorrectly or using the 'className' parameter in the wrong way. I know I can rework it to take the string of the class name and just match it, but it seems a shame to do that. This would be so nice and DRY.

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)

I don't know much Java or Groovy, so I'm not sure what's possible vs impossible yet. Feel free to just tell me "No." I've tried googling and haven't found anything that really answers the question for me. A simple no would be great at this point haha.

Upvotes: 7

Views: 9339

Answers (1)

CptBartender
CptBartender

Reputation: 1220

Yes, it is possible to pass class as argument - in Groovy, classes are first class citizens (see this thread for more detail).

This construct: instance = new className(name: jsonParams.field) actually tries to create an instance of class named className, not of the class referenced by this variable. To make it compile, you need to call 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)

​ I'm not entirely sure what you want to achieve with the findByName method, though - neither Foo nor Bar have a static method named findByName as far as I can tell.

Upvotes: 7

Related Questions