tags:

views:

185

answers:

4

Is there a way to set a property in spring to, not an instance of a class, but the class object itself? i.e.

Rather than

<bean>
   <property name="prototype" class="a.b.c.Foo">...

giving you an instance of "Foo", something like:

<bean>
  <property name="prototype" class="java.lang.Class" value="a.b.c.Foo.class"...

edit: best (working) solution so far - use the normal instantiation and derive the class in the setter. In terms of solutions I think this we'd describe this as "cheating":

<bean class="Bar">
   <property name="prototype" class="a.b.c.Foo">...


public class Bar{
        public void setPrototype(Object o){
                this.prototypeClass=o.getClass();

edit: dtsazza's method works as well.

edit: pedromarce's method works as well.

A: 

No. With a bean tag you instruct Spring on how to instantiate a class.

Kees de Kooter
A: 

Would <property name="x" class="a.b.c.Foo.class"> work? That should be an instance of a Class object...

extraneon
no, that'll give you a ClassNotFound, as there's no such thing as a Foo.class class defined.
Steve B.
+4  A: 

You could certainly use the static factory method Class.forName(), if there's no more elegant syntax (and I don't believe there is):

<property name="x">
   <bean class="java.lang.Class" factory-method="forName">
      <constructor-arg value="a.b.c.Foo"/>
   </bean>
</property>
Andrzej Doyle
I upvoted this, because it seemed like a good suggestion. Strangely enough, though, spring is complaining with a "ClassNotFoundException" for java.lang.Class.
Steve B.
Never mind, that exception was due to a misconfiguration:) Works fine.
Steve B.
+4  A: 
<bean>
   <property name="x">
      <value type="java.lang.Class">a.b.c.Foo</value>
   </property>
 </bean>

That should work.

pedromarce