目前采用如下方法!但是需要更好的!!有想法的说!!前提是方法参数类型已知,且在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());
}
}
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());
}
}
* 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;
}}
* 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;
}
}
总算有人给个想法!!想过。javabean get /set方法命名规范导致我用多态比较麻烦。
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方法 希望能给你提供思路
手打的 有个地方打错了 "if(val != null){" 改成 "if(filedVal != null){"