关于JAVA反射编程的问题!~

yang4715639 2008-01-19 10:39:46
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就行的。。。我应该怎么取值
...全文
514 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
aChinese 2008-03-03
  • 打赏
  • 举报
回复
form里面有 name 这个属性, 也就是有 getName(), setName(String name)
这两个方法。

org.apache.commons.beanutils.BeanUtils.getProperty(form, "name")
就可以取出name的值,为什么不行
yang4715639 2008-03-01
  • 打赏
  • 举报
回复
不可以的
JavaLover00000 2008-01-22
  • 打赏
  • 举报
回复
///这是楼主在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;
}

aChinese 2008-01-22
  • 打赏
  • 举报
回复
BeanUtils就可以解决你的问题了
yys5566 2008-01-21
  • 打赏
  • 举报
回复
JAVA交流与学习群:45633778
挑战技术,超越自我!!
yang4715639 2008-01-21
  • 打赏
  • 举报
回复
没有人回答了吗?
yang4715639 2008-01-21
  • 打赏
  • 举报
回复
汗,你们没明白我的意思 ~~依据o2的字段取o1中找值 这个我知道怎么做,,但是我 就是在o1的取值过程中报错!~~
dgqbcht 2008-01-20
  • 打赏
  • 举报
回复

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{
//......
}
}
Ant 2008-01-20
  • 打赏
  • 举报
回复
这其实不是一个Java反射的问题,楼主你是不是在用Struts的ActionForm呢?

首先你也注意到了你的签名是很通用的ActionForm父类或者更加通用的Object,这样你直接使用form对象就只能调用ActionForm或者Object可见的方法,因为签名决定了你的调用权限,当然你实现可能是UserForm,在你确定了是UserForm的情况下,在Struts中是强制转型:


UserForm userFomr = (UserForm)form;


这样你可以调用userForm的getName,getID等方法了。不过硬编码就失去了可复用性,其实也是Struts-1设计不太好的部分,跟反射其实没多大关系
luoxinabc12345 2008-01-20
  • 打赏
  • 举报
回复
通过java反射机制完全可以的!
Kit_LO 2008-01-20
  • 打赏
  • 举报
回复
一楼的朋友反射用的很好,顶一下
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
好象不行喔。。我这里是从页面得到值以后把userForm传到我的类里面去,再一一把值取出来放到bo里面去

在上面的基础上改下

写这样一个方法
o1
o2

依据o2的字段取o1中找值
以前写过,摘代码太麻烦了,你自己写吧.很简单.
yang4715639 2008-01-20
  • 打赏
  • 举报
回复

假使我把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;
}
yang4715639 2008-01-20
  • 打赏
  • 举报
回复
好象不行喔。。我这里是从页面得到值以后把userForm传到我的类里面去,再一一把值取出来放到bo里面去。。\
UserForm userForm=(UserForm)form;

如果我传一个UserForm.class那么 取出来的值肯定是空的

如果我把userForm.getClass()传进去。而且不instace的话。就会出错,如果instace的话。出来的值都是null
JavaLover00000 2008-01-20
  • 打赏
  • 举报
回复
不用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帮助文档
等下我上传一份反射的资料,你可以下载下来看看。。
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
我一般用hibernate 先把对象load出来然后利用反射填充对象的值.上面少部分代码片段希望能帮助你吧
sunyujia 2008-01-20
  • 打赏
  • 举报
回复

/**
*
* 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;
}
yang4715639 2008-01-20
  • 打赏
  • 举报
回复
额。谢谢2楼3楼的回答。我想你们误会我的意思了。我的意思是 我现在不知道userForm里面的属性是哪些。


然后我从页面过来以后,这些值应该是直接进入了userForm里面,然后我把userForm传到我那个方法里面我就要动态的获取这个userForm里面每个属性相对应的值 1楼的办法应该可行。。我明天试试


但是1楼。我有个问题想问你,如果我不用method 我想用field有没有办法得到呢?
yang4715639 2008-01-20
  • 打赏
  • 举报
回复
碰到一个问题。。麻烦你看下


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的话。那就成了一个新的对象了。。值也肯定没有了。。该怎么办呢?
yang4715639 2008-01-20
  • 打赏
  • 举报
回复
恩恩。谢谢你的回答,这个方法我已经用到了。谢谢你的回答。我试下
加载更多回复(1)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧