简化繁琐的赋值——反射在Jdbc和Struts中的应用
p; System.out.println("no such type!");
return null;
}
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
果然是从stmt中取得对应位置的值。注意:读者可以看到,在该方法中列出的几种类型显然是不够的,读者可以自己加上其他的类型的取值。
最后,我们来看ValueSetter类的valueToBean方法。我们可以分析出,该方法的功能是将从数据源stmt中取得的值赋给Javabean对象o对应的字段。
ValueToBean的实现如下:
public static void valueToBean(String type,String methodName,Object o,String value)
{
try
{
if(Tools.isBlank(s)&&!(type.equals(“String”))) return;
//首先还是取得o对象对应的Class对象。
Class c=o.getClass();
//对于下面的两个语句,我们也作了标记,在后面陈述。
Class[] types=Tools.getTypes(type); 语句二
Object[] args=Tools.getArgs(type,value); 语句三
//取得Javabean的方法对象。
Method m=c.getMethod(methodName,types);
//调用该方法。
m.invoke(o,args);
}
catch(Exception e)
{
e.printStackTrace();
}
}
我们来看语句二:
显然是用来构造参数类型的Class数组。因为在Javabean中setXXX方法只有一个参数,该参数的类型名为type,所以Tools.getTypes(type)只有一个参数类型type需要构造,getTypes方法的实现如下:
public static Class[] getTypes(String type)
{
if(type.equals("java.lang.String"))
{
return new Class[]{String.class};
}
else if(type.equals("int"))
{
return new Class[]{Integer.TYPE};
}
else if(type.equals("long"))
{
return new Class[]{Long.TYPE};
}
else if(type.equals("float"))
{
return new Class[]{Float.TYPE};
}
else
{
System.out.println("no such type!");
return null;
}
}
在这个方法里头,同样,没有列举出来的类型读者可以补充。
语句三是根据invoke方法的需要,构造输入参数值的Object类型的数组,getArgs的实现如下:
public static Object[] getArgs(String type,String value)
{
if(type.equals("java.lang.String"))
{
return new Object[]{new String(value)};
}
else if(type.equals("int"))
{
return new Object[]{new Integer(Integer.parseInt(value))};
}
推荐文章 |
