反射获取并设置字符串

时间:2014-06-17 15:06:48

标签: java java-ee reflection

我想使用反射修剪任何类字符串字段,但在运行程序时遇到此异常:

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()+";");    
    }
}

1 个答案:

答案 0 :(得分:3)

你的问题在这里:

clazz.getMethod("set"+fieldName);

来自JavaDoc for Class

  

public方法getMethod(String name,                  类... parameterTypes)                    抛出NoSuchMethodException,                           SecurityException

     

返回反映的Method对象   指定类或接口的公共成员方法   由此Class对象表示。 name参数是一个String   指定所需方法的简单名称。 parameterTypes   parameter是一个Class对象数组,用于标识方法   形式参数类型,按声明的顺序。如果parameterTypes为null,   它被视为一个空数组。

您已传入无参数,因此它正在寻找一个不带参数的方法。

大概你的setter会带一个String参数:

clazz.getMethod("set"+fieldName, String.class);