反射——如何为使用反射创建实例的POJO类设置值



我已经为我的pojo类创建了一个实例,如下所示:

package com.hexgen.tools;
public class Foo {
    public static void main(String[] args) {
        Class c = null;
        try {
            c = Class.forName("com.hexgen.ro.request.CreateRequisitionRO");
            Object o = c.newInstance();
            System.out.println(o.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (IllegalAccessException iae) {
            iae.printStackTrace();
        } catch (InstantiationException ie) {
            ie.printStackTrace();
        }  
    }
}
当我打印

时,我得到了下面的字符串:

com.hexgen.ro.request.CreateRequisitionRO@95c7850[transSrlNo=<null>,transCode=<null>,inflowOutflow=<null>,transDate=<null>,tradeDate=<null>,tradeDateUpto=<null>,tradeTime=<null>,investCategory=<null>,custodian=<null>,holdType=<null>,securityType=<null>,security=<null>,assetClass=<null>,issuer=<null>,fundManager=<null>,marketType=<null>,tradePriceType=<null>,requisitionType=<null>,priceFrom=<null>,priceTo=<null>,marketPrice=<null>,averagePrice=<null>,quantity=<null>,price=<null>,grossAmtTcy=<null>,exchRate=<null>,grossAmtPcy=<null>,grossIntTcy=<null>,grossIntPcy=<null>,netAmountTcy=<null>,netAmountPcy=<null>,acquCostTcy=<null>,acquCostPcy=<null>,yieldType=<null>,purchaseYield=<null>,marketYield=<null>,ytm=<null>,mduration=<null>,currPerNav=<null>,desiredPerNav=<null>,currHolding=<null>,noofDays=<null>,realGlPcy=<null>,realGlTcy=<null>,nowLater=<null>,isAllocable=false,acquCostReval=<null>,acquCostHisTcy=<null>,acquCostHisPcy=<null>,exIntTcy=<null>,exIntPcy=<null>,accrIntReval=<null>,accrIntTcy=<null>,accrIntPcy=<null>,grossAodTcy=<null>,grossAodPcy=<null>,grossAodReval=<null>,bankAccAmtAcy=<null>,bankAccAmtPcy=<null>,taxAmountTcy=<null>,unrelAmortTcy=<null>,unrelAmortPcy=<null>,unrelGlTcy=<null>,unrelGlPcy=<null>,realGlHisTcy=<null>,realGlHisPcy=<null>,tradeFeesTcy=<null>,tradeFeesPcy=<null>,investReason=<null>,settleDate=<null>,stkSettleDate=<null>,custodianN=<null>,portfolio=<null>,userId=<null>]

字面上所有的值都设置为null,我想为类中可用的setter设置值。由于setter的名称可以随时更改,所以我计划动态设置值,这样就不会发生静态值设置。

是否可以为新创建的实例动态设置值?比如创建一些枚举,在枚举中设置一些默认值,如果是字符串,则设置一些默认值,如果是int,则设置一些默认值,如:

how to do this also i created a object which is not a array if i want to create array of objects using reflection how to go about it?

请帮助我找出并解决这些问题。

POJO在定义上没有标准设置器。我猜你指的是JavaBean。

要使用JavaBean的setter,最简单的方法是使用Introspector

public class Main {
    public static void main(String... ignored) throws Exception {
        SimpleBean sb = new SimpleBean();
        BeanInfo info = Introspector.getBeanInfo(SimpleBean.class);
        System.out.println("Calling setters");
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            if (pd.getWriteMethod() == null) continue;
            System.out.println("tSetting " + pd.getName());
            pd.getWriteMethod().invoke(sb, "Set now");
        }
        System.out.println("Reading the getters");
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            System.out.println("t" + pd.getName() + " = " + pd.getReadMethod().invoke(sb));
        }
    }

    public static class SimpleBean {
        String text;
        String words;
        public String getText() {
            return text;
        }
        public void setText(String text) {
            this.text = text;
        }
        public String getWords() {
            return words;
        }
        public void setWords(String words) {
            this.words = words;
        }
    }
}

打印

Calling setters
    Setting text
    Setting words
Reading the getters
    class = class Main$SimpleBean
    text = Set now
    words = Set now

您可以使用由类对象定义的字段:

Field f  = c.getFields()[0]; //or getField("...")
f.set(o, "new value");

edit:如果你只想使用setter:

for(Method m : c.getMethods())
  if (m.getName().startsWith("set") && m.getParameterTypes().length == 1)
     m.invoke(o, "myValue");

相关内容

  • 没有找到相关文章

最新更新