如何动态创建java bean?

时间:2013-10-03 08:07:06

标签: java javabeans

如何在java中从table / s读取列后动态创建bean / s(在bean中保留列数据类型)?

4 个答案:

答案 0 :(得分:2)

<强>更新 以前的答案是试图立即解决问题。 所以它不是FlexBean的最终代码。 有关最终代码,请访问https://github.com/ramazanpolat/flexbean

OLD ANSWER

我遇到了同样的问题所以我写了FlexBean。

public class FlexBean {
    private List<String> propertyNames = new ArrayList<>();
    private Map<String, Object> propertyValueMap = new LinkedHashMap<>();
    private List<Type> propertyTypes  = new ArrayList<>();

    public FlexBean() {

    }

    public void setProperties(Map<String, Object> props){
        for (String propName:props.keySet()){
            addProperty(propName, props.get(propName));
        }
    }


    public void addPropertyNames(List<String> propertyNames){
        for (String name: propertyNames) {
            addProperty(name);
        }
    }

    public Collection<Object> getPropertyValues(){
        return propertyValueMap.values();
    }

    public List<String> getPropertyNames() {
        return propertyNames;
    }

    public Map<String, Object> getPropertyValueMap() {
        return propertyValueMap;
    }

    public List<Type> getPropertyTypes() {
        return propertyTypes;
    }

    public void addProperty(String propName, Type propType){
        propertyNames.add(propName);
        propertyTypes.add(propType);
    }

    public void addProperty(String propName){
        // default property type is String
        addProperty(propName, String.class);
    }

    public void addProperty(String propName, Object value){
        addProperty(propName);
        setProperty(propName, value);
    }

    public void addProperty(String propName, Type propType, Object value){
        addProperty(propName, propType);
        setProperty(propName, value);
    }

    public int getPropertyIndex(String propName){
        return propertyNames.indexOf(propName);
    }

    public Type getPropertyType(String propName){
        int index = getPropertyIndex(propName);
        return Iterables.get(propertyTypes,index);
    }

    public void setProperty(String propName, Object propValue){
        propertyValueMap.put(propName, propValue);
    }

    public Object getPropertyValue(String propName){
        return propertyValueMap.get(propName);
    }

    public <Any> Any getTypedPropertyValue(String propName){
        return (Any)((Any) propertyValueMap.get(propName));
    }

    public Object getProperty(int propIndex){
        return Iterables.get(propertyValueMap.entrySet(),propIndex).getValue();
    }
}

用法:

FlexBean flexBean = new FlexBean();

flexBean.addProperty("prop1", 1); // int inferred
flexBean.addProperty("prop2", "value2"); // string inferred
flexBean.addProperty("prop3", 0.1f); // float inferred

for (Object o: flexBean.getPropertyValues()) {
    System.out.println(o);
}

int prop1 = flexBean.getTypedPropertyValue("prop1");
String prop2 = flexBean.getTypedPropertyValue("prop2");
float prop3 = flexBean.getTypedPropertyValue("prop3");

答案 1 :(得分:1)

您可以使用http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/等框架动态创建类。或者,您可以将数据存储在Map中,其中键是列名,值是列值,多行可以存储在地图列表中

答案 2 :(得分:1)

您可能考虑使用Apache BeanUtils。

它提供了几个用于动态创建bean的类。它们都实现了DynaBean接口。例如,使用LazyDynaBean

DynaBean myBean = new LazyDynaBean();
myBean.set("myProperty", "myValue");

答案 3 :(得分:0)

有几个可用的框架/库可以帮助您生成类。 Evgeniy建议使用javassist。有像cglib,asm这样的类似库,你可以探索。

但是我真的想知道更多关于你的用例的事情,因为在我看来,动态生成的类在静态类型的语言中有缺点,比如Java。此外,获取字段数据类型需要使用Java反射机制进行内省。这本身就增加了复杂性。

我建议,以下任何一种:

  • 如果您可以访问数据库模式,请考虑事先生成bean类。您可以通过几种工具/插件为您喜爱的IDE实现此目的。

  • 考虑将数据存储在Map接口的实现中。例如,您可以使用其中一个将列ID映射到数据类型,另一个用于将列id映射到检索到的数据。然后,您可以在代码中使用这两个映射,而无需在运行时创建任何bean。