Java 反射获取和设置字符串

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

我想使用反射修剪任何类字符串字段,但在运行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.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小时的开销。。。我正试图复活一个死了的项目,我在家里做自由职业者。你们每天花多少时间在一个代码上?