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就行的我应该怎么取值
我试过用Class cls=form.getClass();
但是这样得到的是一个没有被实例化的Class对象返回的也就是ActionForm这个对象,而且还是空的
当然我也可以用这样的方式
public Object getActionFormModelValues(Object form) throws Exception{}
只要有办法取到值,但是又不要管传过来的是什么对象,只要这个对象继承了ActionForm就行的我应该怎么取值
解决方案 »
- Tomcat启动报错问题
- 求教一个orcal数据库查询缺失时间的问题!急~~~~~~
- 急:jsp换个机器就报Untrusted Server Certificate Chain错误是怎么回事?
- 请教:怎么把一个对象包装成一个form,然后通过post传递给另外一个servlet
- ENCTYPE="multipart/form-data"表单提交不了HTML编辑器内容
- 关于Tomcat+Jboss网页刷新的问题~~在线等待
- 问个关于自己的类A与B之间互相访问的问题!
- struts2简单的验证框架,帮忙看哪儿错了,验证不出来
- 哪有jsp的免费空间?最好支持ftp的
- 在java里边找不到httpclient里的GetMethod
- 未来计算机语言,大家看!!!
- 请问个人能把网站备案号申请下来吗?
你的这个方法想要干什么???
////看这段代码
Class cls=form.getClass();
Method method = cls.getDeclaredMethod("getName"); //取到form类中的getName()方法
Object temp = method.invoke(form); //执行getName()方法 接受反回值这样可以的到form 中的name字段的 值,temp中就是form的name的值
UserForm userFomr = (UserForm)form;
这样你可以调用userForm的getName,getID等方法了。不过硬编码就失去了可复用性,其实也是Struts-1设计不太好的部分,跟反射其实没多大关系
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{
//......
}
}
然后我从页面过来以后,这些值应该是直接进入了userForm里面,然后我把userForm传到我那个方法里面我就要动态的获取这个userForm里面每个属性相对应的值 1楼的办法应该可行。。我明天试试
但是1楼。我有个问题想问你,如果我不用method 我想用field有没有办法得到呢?
//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帮助文档
等下我上传一份反射的资料,你可以下载下来看看。。
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的话。那就成了一个新的对象了。。值也肯定没有了。。该怎么办呢?
/**
*
* 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;
}
UserForm userForm=(UserForm)form;如果我传一个UserForm.class那么 取出来的值肯定是空的如果我把userForm.getClass()传进去。而且不instace的话。就会出错,如果instace的话。出来的值都是null
假使我把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;
}
o1
o2
把
依据o2的字段取o1中找值
以前写过,摘代码太麻烦了,你自己写吧.很简单.
挑战技术,超越自我!!
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;
}
这两个方法。org.apache.commons.beanutils.BeanUtils.getProperty(form, "name")
就可以取出name的值,为什么不行