0

有没有办法将类作为 Class 对象传递给属性?

IE

    <managed-property>
        <property-name>clazz</property-name>
        <value>java.lang.Double.class</value>
    </managed-property>
4

2 回答 2

4

是的。但它将被实现为字符串。你可以把它变成Class你的bean,在任何需要的地方,使用Class.forName(clazz)

您可以尝试使用<property-class>java.lang.Class</property-class>,但我不确定是否有内置的转换器

于 2010-03-18T12:54:44.980 回答
1

不,没有办法。这只有在所讨论的类具有(默认)无参数构造函数时才有可能。java.lang.Double没有一个。此外,理论上你的构造是无效的。如果您在定义的位置使用具有(默认)无参数构造函数的类,则以下内容会java.lang.Double起作用:

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>mypackage.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>clazz</property-name>
        <property-class>java.lang.Class</property-class>
        <value>#{clazz.class}</value>
    </managed-property>
</managed-bean>

<managed-bean>
    <managed-bean-name>clazz</managed-bean-name>
    <managed-bean-class>java.lang.Double</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

结合

public class Bean {
    private Class<?> clazz; 

    public Class<?> getClazz() {
        return clazz;
    }

    public void setClazz(Class<?> clazz) {
        this.clazz = clazz;
    }
}

您确实需要将其指定为 aString并使用Class#forName()从中获取java.lang.Class。这是一个启动示例:

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>mypackage.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>className</property-name>
        <value>java.lang.Double</value>
    </managed-property>
</managed-bean>

结合

public class Bean {

    private Class<?> clazz;

    public Class<?> getClazz() {
        return clazz;
    }

    public void setClassName(String name) {
        try {
            this.clazz = Class.forName(name);
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("Illegal class name.", e);
        }
    }

}
于 2010-03-26T16:46:45.423 回答