我想使用反射修剪任何类字符串字段,但在运行程序时遇到此异常:
Exception in thread "main" java.lang.NoSuchMethodException: BeanX.setName()
at java.lang.Class.getMethod(Class.java:1624)
at Test.trimStr(Test.java:19)
at Test.main(Test.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
这是我的POJO BeanX
数据容器:
public class BeanX {
private String name;
private String fname;
private long age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public long getAge() {
return age;
}
public void setAge(long age) {
this.age = age;
}
}
这是我的测试类和我的花哨方法,但我不知道为什么会发生这种异常:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public <T> T trimStr(T t) throws Exception{
Class clazz = t.getClass();
Field[] fields = clazz.getDeclaredFields();
Method unknownMethod;
for(int i=0; i<fields.length; i++){
if(fields[i].getType().isAssignableFrom(String.class)){
String fieldName = fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1);
unknownMethod = clazz.getMethod("get"+fieldName);
String strValue = unknownMethod.invoke(t).toString();
unknownMethod = clazz.getMethod("set"+fieldName);
String newValue = strValue.trim();
unknownMethod.invoke(t, new String(strValue.trim()));
}
}
return t;
}
public static void main(String ... args)throws Exception{
BeanX x = new BeanX();
x.setAge(2L);
x.setName("John ");
x.setFname(" X");
System.out.println(x.getName()+";");
Test tee = new Test();
BeanX y = tee.trimStr(x);
System.out.println(y.getName()+";");
}
}
答案 0 :(得分:3)
你的问题在这里:
clazz.getMethod("set"+fieldName);
public方法getMethod(String name, 类... parameterTypes) 抛出NoSuchMethodException, SecurityException
返回反映的Method对象 指定类或接口的公共成员方法 由此Class对象表示。 name参数是一个String 指定所需方法的简单名称。 parameterTypes parameter是一个Class对象数组,用于标识方法 形式参数类型,按声明的顺序。如果parameterTypes为null, 它被视为一个空数组。
您已传入无参数,因此它正在寻找一个不带参数的方法。
大概你的setter
会带一个String
参数:
clazz.getMethod("set"+fieldName, String.class);