public Object getActionFormModelValues(ActionForm form) throws Exception{}form是我传过来的一个form=>UserForm ,,它继承了ActionForm这个时候form是有值的,假设form里面有3个字段分别是 id,name,pws。但是我要通过一种什么方法把里面的值给弄出来?
我试过用Class cls=form.getClass();
但是这样得到的是一个没有被实例化的Class对象返回的也就是ActionForm这个对象,而且还是空的
当然我也可以用这样的方式
public Object getActionFormModelValues(Object form) throws Exception{}
只要有办法取到值,但是又不要管传过来的是什么对象,只要这个对象继承了ActionForm就行的我应该怎么取值

解决方案 »

  1.   

    public   Object   getActionFormModelValues(ActionForm   form)   throws   Exception{ } 
    你的这个方法想要干什么???
    ////看这段代码
    Class   cls=form.getClass();
    Method method = cls.getDeclaredMethod("getName");  //取到form类中的getName()方法
    Object temp = method.invoke(form);  //执行getName()方法 接受反回值这样可以的到form 中的name字段的 值,temp中就是form的name的值
      

  2.   

    这其实不是一个Java反射的问题,楼主你是不是在用Struts的ActionForm呢?首先你也注意到了你的签名是很通用的ActionForm父类或者更加通用的Object,这样你直接使用form对象就只能调用ActionForm或者Object可见的方法,因为签名决定了你的调用权限,当然你实现可能是UserForm,在你确定了是UserForm的情况下,在Struts中是强制转型:
        UserForm userFomr = (UserForm)form;
    这样你可以调用userForm的getName,getID等方法了。不过硬编码就失去了可复用性,其实也是Struts-1设计不太好的部分,跟反射其实没多大关系
      

  3.   


    public void getValues(Object o){
    String className=o.getClass().getSimpleName();
    if(className.equals("UserForm")){
    UserForm form=(UserForm)o;
    System.out.println(form.getId());
    System.out.println(form.getUsername());
    System.out.println(form.getPws());
    }
    else{
    //......
    }
    }
      

  4.   

    额。谢谢2楼3楼的回答。我想你们误会我的意思了。我的意思是 我现在不知道userForm里面的属性是哪些。
    然后我从页面过来以后,这些值应该是直接进入了userForm里面,然后我把userForm传到我那个方法里面我就要动态的获取这个userForm里面每个属性相对应的值  1楼的办法应该可行。。我明天试试
    但是1楼。我有个问题想问你,如果我不用method 我想用field有没有办法得到呢?
      

  5.   

    不用method不行,不过可以同过field得到method,给你看段代码 ,应该对你的那个方法有些帮助
    //cls类中的所有字段都应该有setXXX()方法,
    public static Object initForm(Class cls,HttpServletRequest request) {
            try {
                Object obj = cls.newInstance();            Field[] fields = cls.getDeclaredFields();
                for (Field field : fields) {
                    String fieldName = field.getName();
                    Method method = cls.getDeclaredMethod("set" +
                            fieldName.substring(0, 1).toUpperCase() +
                            fieldName.substring(1), new Class[] {field.getType()});
                    String value = request.getParameter(fieldName);
                    method.invoke(obj, new Object[] {value});
                }
                return obj;
            } catch (Exception ex) {
                System.out.println(ex);
            }
            return null;
        }
    这段代码还有很多缺点,得要cls类中的字段都为String ,如果要cls类中有其他类型的字段,那这个方法中就得改改了。
    反射用到的方法你可以查查api帮助文档
    等下我上传一份反射的资料,你可以下载下来看看。。
      

  6.   

    碰到一个问题。。麻烦你看下
    UserForm userForm = (UserForm) form;
    this.getActionFormModelValues(form);
    public Object getActionFormModelValues(Object form) throws Exception{

    Class cls=form.getClass();
    System.out.println(cls.getName());
    Method m=cls.getDeclaredMethod("getName");
    Object obj=m.invoke(cls);
    System.out.println(obj);
            return null;
    }执行这段代码的时候  Exception: java.lang.IllegalArgumentException: object is not an instance of declaring class
    说class没有被instance,但是如果我cls.newInstance的话。那就成了一个新的对象了。。值也肯定没有了。。该怎么办呢?
      

  7.   


    /**
     * 
     * Description:通过反射填充对象
     * 
     * @param request
     * @param obj
     * @author 孙钰佳
     * @since:2008-1-10 下午02:13:26
     */
    public void setObjectFromRequest(String prefix, Object obj, String suffix) {
    List list = getFieldList(obj.getClass());
    for (int i = 0, size = list.size(); i < size; i++) {
    Field field = (Field) list.get(i);
    if (field.getName().indexOf("$") > 0)// 忽略代理,cglib
    continue;
    if (!isBasicType(field.getType()))
    continue;
    try {
    Method setter = com.nstc.util.reflect.ReflectUtil
    .getSetter(field);
    Class[] ptc = setter.getParameterTypes();
    Object val = CastUtil.castValue(getValue(field.getName(),
    prefix, suffix), ptc[0]);
    if (val != null)
    setter.invoke(obj, new Object[] { val });
    } catch (SecurityException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    } catch (NoSuchMethodException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    }
    }
    } /**
     * 取得类的字段
     * 
     * @param c
     * @return
     */
    private List getFieldList(Class c) {
    if (c == null)
    return new ArrayList();
    List retList = new ArrayList();
    Field[] fields = c.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
    retList.add(fields[i]);
    }
    if (c.getSuperclass() != null
    && c.getSuperclass() != (java.lang.Object.class)) {
    fields = c.getSuperclass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
    retList.add(fields[i]);
    }
    }
    return retList;
    } /**
     * 判断是否是基本数据类型 Description:
     * 
     * @param clazz
     * @return
     * @author 孙钰佳
     * @since:2007-7-4 下午02:59:44
     */
    private boolean isBasicType(Class clazz) {
    if (clazz.isArray())
    return false;
    else
    return "java.lang".equals(clazz.getPackage().getName())
    || "java.util.Date".equals(clazz.getName());
    } private Object getValue(String name, String prefix, String suffix) {
    if (name.equalsIgnoreCase("lastUpdateDate"))
    return DateUtil.fmtDateToYMD(new Date());
    Object value = null;
    if (request != null)
    value = request.getParameter(prefix + name + suffix);
    if (map != null && (value == null || "".equals(value)))
    value = map.get(prefix + name + suffix);
    return "".equals(value) ? null : value;
    }
    /**
     * 
     * Description:将一个Object对象转换为确定的类型 例如Object为String的2007-01-01 Class
     * c为Date返回的Object实际为Date类型返回后可强制类型转换,或用于其他不需要明确类型的地方,此方法多用于反射的情况
     * 
     * @param val待确定类型的对象
     * @param c目标类型的class
     * @return
     * @author 孙钰佳
     * @since:2008-1-10 下午02:08:38
     */
    public static Object castValue(Object val, Class c) {
    if (val == null || val.toString().equals("null"))
    return null;
    if ((java.lang.String.class).equals(c))
    return CastUtil.toString(val, null);
    if ((java.lang.Integer.class).equals(c) || Integer.TYPE.equals(c))
    return CastUtil.toInteger(val, null);
    if ((java.lang.Double.class).equals(c) || Double.TYPE.equals(c))
    return CastUtil.toDouble(val, null);
    if ((java.lang.Short.class).equals(c) || Short.TYPE.equals(c))
    return CastUtil.toShort(val, null);
    if ((java.lang.Long.class).equals(c) || Long.TYPE.equals(c))
    return CastUtil.toLong(val, null);
    if ((java.lang.Float.class).equals(c) || Float.TYPE.equals(c))
    return CastUtil.toFloat(val, null);
    if ((java.lang.Byte.class).equals(c) || Byte.TYPE.equals(c))
    return CastUtil.toByte(val, null);
    if ((java.lang.Boolean.class).equals(c) || Boolean.TYPE.equals(c))
    return CastUtil.toBoolean(val, null);
    if ((java.util.Date.class).equals(c)) {
    return DateUtil.fmtStrToDate(String.valueOf(val));
    }
    return null;
    }
      

  8.   

    我一般用hibernate 先把对象load出来然后利用反射填充对象的值.上面少部分代码片段希望能帮助你吧
      

  9.   

    好象不行喔。。我这里是从页面得到值以后把userForm传到我的类里面去,再一一把值取出来放到bo里面去。。\
    UserForm userForm=(UserForm)form;如果我传一个UserForm.class那么 取出来的值肯定是空的如果我把userForm.getClass()传进去。而且不instace的话。就会出错,如果instace的话。出来的值都是null
      

  10.   


    假使我把userForm.getClass()到这个方法里面
    public Object getActionFormModelValues(Class form) throws Exception{
    //Object o=form.newInstance();  //这一句的时候就会new一个Class了.值肯定没有了. Method m=form.getDeclaredMethod("getName");//把上面注释掉以后 执行到这里就会出错
    Object obj=m.invoke(o);
    System.out.println(obj);
    return null;
    }
      

  11.   

    好象不行喔。。我这里是从页面得到值以后把userForm传到我的类里面去,再一一把值取出来放到bo里面去在上面的基础上改下 写这样一个方法
    o1
    o2

    依据o2的字段取o1中找值
    以前写过,摘代码太麻烦了,你自己写吧.很简单.
      

  12.   

    通过java反射机制完全可以的!
      

  13.   

    JAVA交流与学习群:45633778 
    挑战技术,超越自我!!
      

  14.   

    汗,你们没明白我的意思 ~~依据o2的字段取o1中找值 这个我知道怎么做,,但是我 就是在o1的取值过程中报错!~~
      

  15.   

    ///这是楼主在8楼的代码!!
    public   Object   getActionFormModelValues(Object   form)   throws   Exception{ Class   cls=form.getClass(); 
    System.out.println(cls.getName()); 
    Method   m=cls.getDeclaredMethod("getName"); 
    Object   obj=m.invoke(cls);    ////这里m.invoke();里的参数应该是你的form
    System.out.println(obj);                               ////意思是执行form对象的m方法   
                    return   null; 
    } 楼主是想要把form 中的值取出来,放到一个实体类对象中去吧??如果是这样你可以用 
    BeanUtils.copyProperties(vo,po) ,这个方法可以把po中的数据拷贝到vo中 不过要 po和vo中的字段要一样才可以下面这段代码也可以
    ///form:有值的那个form,cls返回值的类型
    public static Object getActionFormModelValues(Object  form,Class cls) {
            try {
                Object obj = cls.newInstance();            Field[] fields = cls.getDeclaredFields();
                for (Field field : fields) {
                    String fieldName = field.getName();
                    Method setMethod = cls.getDeclaredMethod("set" +
                            fieldName.substring(0, 1).toUpperCase() +
                            fieldName.substring(1), new Class[] {field.getType()});
                    Method getMethod = cls.getDeclaredMethod("get" +
                            fieldName.substring(0, 1).toUpperCase() +
                            fieldName.substring(1));     
                    Object temp = getMethod.invoke(form);   
                    setMethod.invoke(obj, new Object[] {temp});
                }
                return obj;
            } catch (Exception ex) {
                System.out.println(ex);
            }
            return null;
        }
      

  16.   

    BeanUtils就可以解决你的问题了
      

  17.   

    form里面有 name 这个属性, 也就是有 getName(), setName(String name)
    这两个方法。org.apache.commons.beanutils.BeanUtils.getProperty(form, "name")
    就可以取出name的值,为什么不行