我想使用反射来修剪任何类字符串字段,但是当我运行程序时遇到了这个异常:
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()+";");
}
}
您的问题在这里:
clazz.getMethod("set"+fieldName);
From JavaDoc for Class
:
公共方法getMethod(字符串名称,类……parameterTypes)抛出NoSuchMethodException,SecurityException
返回一个反映方法的方法对象类或接口的指定公共成员方法由这个类对象表示。name参数是一个字符串指定所需方法的简单名称。的parameterTypes参数是一个Class对象数组,用来标识方法的形式参数类型,按声明顺序。如果parameterTypes为空,它被视为空数组。
你已经传入了无参数,所以它正在寻找一个不接受参数的方法。
假定您的setter
将接受String
参数:
clazz.getMethod("set"+fieldName, String.class);