Java 反射获取和设置字符串
我想使用反射修剪任何类字符串字段,但在运行th程序时遇到此异常:Java 反射获取和设置字符串,java,jakarta-ee,reflection,Java,Jakarta Ee,Reflection,我想使用反射修剪任何类字符串字段,但在运行th程序时遇到此异常: 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.NativeMethodAccessorImp
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);
从:
公共方法getMethodString名称,
班参数类型
抛出NoSuchMethodException,
安全例外
返回一个反映
类或接口的指定公共成员方法
由该类对象表示。name参数是一个字符串
指定所需方法的简单名称。参数类型
参数是一个类对象数组,用于标识方法的
形式参数类型,按声明的顺序。如果parameterTypes为null,
它被视为一个空数组
您没有传递任何参数,因此它正在寻找一个不带参数的方法
假定您的setter将接受一个字符串参数:
clazz.getMethod("set"+fieldName, String.class);
你读过getMethod的javadoc吗?它需要什么参数?问题是setMethod而不是GetMethod您的stacktrace在java.lang.Class.getMethodClass.java:1624中显示了其他情况,没有setMethod。我不是指吸引子和设定器。当使用bean时,我们考虑使用java. BeNe.OpSePrimor并从PrimeTrimeDr.Shanx中读取/写入方法,这是我的错误-我的眼睛在18小时编码后真的没有看到那个可笑的小部分。非常感谢。mate@JohnX仅仅18小时之后?这不是编程界的标准转变吗?我认为标准是8小时,所以10小时的开销。。。我正试图复活一个死了的项目,我在家里做自由职业者。你们每天花多少时间在一个代码上?