2

Let say I have such class:

public class MyClass {

  ...

  private Map<String, Class> eventsMapping = new HashMap<String, Class>();

  ...

}

public void setEventsMapping(Map<String, Class> mappings){
    this.eventsMapping = mappings;
}

How to create bean of such class with filled in eventsMapping? I mean XML definition of bean. The problem is that HashMap contains Classes and not objects.

I assume that it should be something like:

<bean id="myBean" class="com.my.MyClass" >
    <property name="eventsMapping">
        <map>
            <entry key="ABC">
               <bean class="java.lang.Class">
                   ???
               </bean>
            </entry>
        </map>
    </property>
</bean>

How to pass there particular Class (not an object)

4

5 回答 5

4

如果您正在寻找将java.lang.Class实例作为值的地图,则只需使用

<bean id="myBean" class="com.my.MyClass">
    <property name="eventsMapping">
        <map>
            <entry key="ABC" value="java.lang.Class" ></entry>
        </map>
    </property>
</bean>

Spring 将使用转换服务将Stringjava.lang.Class更改Classjava.lang.Class.

同样,您可以将值放入<value>元素中。

<bean id="myBean" class="com.my.MyClass">
    <property name="eventsMapping">
        <map>
            <entry key="ABC">
                <value>
                    java.lang.Class
                </value>
            </entry>
            <entry key="DEF">
                <value>
                    java.util.List
                </value>
            </entry>
        </map>
    </property>
</bean>
于 2013-11-05T15:27:40.627 回答
2

不能像这样创建一个 bean java.lang.Class

<bean name="aClassBean" class="java.lang.Class" />

原因:

From Javadocs:

类没有公共构造函数。相反,Class 对象是由 Java 虚拟机在加载类时自动构造的,并通过调用类加载器中的 defineClass 方法来构造。

要创建类型的 bean,java.lang.Class请像这样创建您的 bean:

<bean id="aClassBean" class="java.lang.Class" factory-method="forName">
      <constructor-arg value="full.package.name.of.the.class"/>
</bean>
于 2013-11-05T15:32:21.887 回答
1

您可以使用静态工厂方法来创建 bean:

<entry key="ABC">
     <bean class="java.lang.Class" factory-method="forName">
         <constructor-arg ref="className"/>
     </bean>
</entry>

您也可以尝试使用从完全限定字符串到类的自动转换,但是当使用通用映射时,这可能不适用于您的情况。

于 2013-11-05T15:31:00.767 回答
0

你可以试试这样的

  <bean id="dbFieldConverters" class="java.util.HashMap">
      <constructor-arg>
         <map value-type="java.lang.Class">
             <entry key="tradeDate">
                <value>java.util.Date</value>
              </entry>
              <entry key="lastUpdate">
                  <value>java.sql.Timestamp</value>
               </entry>
          </map>
      </constructor-arg>
   </bean>
于 2013-12-12T08:11:26.500 回答
0

this works on my environment (Spring 4):

<map>
    <entry key="my-key">
       <value type="java.lang.Class">com.example.MyClassName</value>
    </entry>
</map>

Please note the target property is Map<String, Class> type and the java.lang.Class is used as value type attribute.

于 2014-11-05T12:46:53.640 回答