目前采用如下方法!但是需要更好的!!有想法的说!!前提是方法参数类型已知,且在PO中唯一!import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.Date;public class ReflectPO {
/**
 * 根据参数类型动态调用对象方法
 * @param c 调用对象的类
 * @param type 参数类型
 * @param owner 调用对象
 * @param args 方法参数
 */
public void invokeMethodByParamType(Class c, String type, Object owner,
Object[] args) {
int flag = 0;
if (type == null) {
return;
}
Method methlist[] = c.getDeclaredMethods();
for (int i = 0, j = methlist.length; i < j; i++) {
Method m = methlist[i];
Class pvec[] = m.getParameterTypes();
            //参数都是一个j=pvec.length消掉
for (int k = 0; k < pvec.length; k++) {
if (type.equals(pvec[k].getName())) {
try {
invokeMethod(owner, m.getName(), args);
} catch (Exception e) {
}
flag = 1;
break;
}
;
}
if (flag == 1) {
break;
}
} }
/**
 * 通过方法名动态调用对象方法
 * @param owner 调用对象
 * @param methodName 方法名
 * @param args 方法参数
 * @return 
 * @throws Exception 
 */
public Object invokeMethod(Object owner, String methodName, Object[] args)
throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0;i < args.length; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
} public static void main(String args[]) {
Class c=TProperties.class;
ReflectPO rt = new ReflectPO();
TProperties abc = new TProperties();
Object temp = new Timestamp(new Date().getTime());
Object[] a = new Object[] { temp };
rt.invokeMethodByParamType(c, "java.sql.Timestamp", abc, a);
System.out.println(abc.getJavaLangDate());
}
}

解决方案 »

  1.   

    TProperties 类结构!!import java.sql.Timestamp;/**
     * TProperties entity. @author Edwin
     */public class TProperties implements java.io.Serializable { private Integer javaLangInteger;
    private Timestamp javaLangDate;
    private String javaLangString;
    /** default constructor */
    public TDocumentProperties() {
    } // Property accessors        public Integer getJavaLangInteger() {
    return this.javaLangInteger;
    } public void setJavaLangInteger(Integer javaLangInteger) {
    this.javaLangInteger = javaLangInteger;
    } public Timestamp getJavaLangDate() {
    return this.javaLangDate;
    } public void setJavaLangDate(Timestamp javaLangDate) {
    this.javaLangDate = javaLangDate;
    } public String getJavaLangString() {
    return this.javaLangString;
    } public void setJavaLangString(String javaLangString) {
    this.javaLangString = javaLangString;
    }}
      

  2.   

    你应该用 多态完成你的要求, 需要同一个函数, 不同的类型import java.sql.Timestamp; /** 
    * TProperties entity. @author Edwin 
    */ public class TProperties implements java.io.Serializable { private Integer javaLangInteger; 
    private Timestamp javaLangDate; 
    private String javaLangString; 
    /** default constructor */ 
    public TDocumentProperties() { 
    } // Property accessors         public Integer getJavaLangInteger() { 
    return this.javaLangInteger; 
    } public void setJavaLang(Integer javaLangInteger) { 
    this.javaLangInteger = javaLangInteger; 
    } public Timestamp getJavaLangDate() { 
    return this.javaLangDate; 
    } public void setJavaLang(Timestamp javaLangDate) { 
    this.javaLangDate = javaLangDate; 
    } public String getJavaLang() { 
    return this.javaLangString; 
    } public void setJavaLangString(String javaLangString) { 
    this.javaLangString = javaLangString; 

      

  3.   


    总算有人给个想法!!想过。javabean get /set方法命名规范导致我用多态比较麻烦。
      

  4.   

    目的就是数据存储类型+它的字面值---->设置到对应的PO中->映射到数据库(数据库表字段一旦确定,类型很难更改)一个表单字段(客户随意指定,类型随意指定,基本都是java类 类型)有没有玩泛型的高手呀!!估计能上升的空间也就是泛型了。
      

  5.   

    那帮不了你了, 看你的样子似乎是要通过  orm 来考虑的, 如果手写 sql的话可能还无所谡
      

  6.   

    我想到了 传属性名的方法 不需要知道参数的类型 和你的差不多 就是稍微改了下 利用了get/set方法的命名规范:public void setElement(Object obj, Object fieldVal, String filedName){
    if(val != null){
    Class clazz = obj.getClass();
    Field field = null;
    Method method = null;
    try {
            field = clazz.getDeclaredField(filedName);//根据名称获得该属性
    method = clazz.getMethod("set"+filedName.substrin(0,1).toUpperCase()+filedName.substring(1), field.getType());
                            //拆分属性名获得方法名 并以此方法名获得方法
            method.invoke(obj, fieldVal);//方法实现
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchFieldException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    }
    //调用的方法如下
    setElement(Person person, "张三", "name");
    这里只写了set方法 希望能给你提供思路
      

  7.   


    手打的 有个地方打错了 "if(val != null){" 改成 "if(filedVal != null){"