public static Object transall(Object ob) { String fieldname = "";
String fristname = "";
Field[] f = ob.getClass().getDeclaredFields();
for (int i = 0; i < f.length; i++) {
fieldname = f[i].getName().toLowerCase();
fristname = fieldname.substring(0, 1).toUpperCase();
try {
Method me = ob.getClass().getMethod(
"get" + fristname + fieldname.substring(1),
new Class[0]);
Object myob = me.invoke(ob, new Object[0]); if (myob != null
&& myob.getClass().isAssignableFrom(String.class)) {
String s = (String) myob;
Method me1 = ob.getClass().getMethod(
"set" + fristname + fieldname.substring(1),
new Class[] { String.class });
me1.invoke(ob, new Object[] { trans(s.trim()) });
} } catch (Exception e) {
e.printStackTrace();
}
}
return ob;
}
 希望能加上详细解释,谢谢大家了。

解决方案 »

  1.   

    public static Object transall(Object ob) {
        String fieldname = "";
        String fristname = "";
        // 得到ob类中所有的字段,getDeclaredFields表示所有声明的字段,
         // 而getFields()表示所有声明的public字段
         Field[] f = ob.getClass().getDeclaredFields();    // 对字段进行遍历
         for (int i = 0; i < f.length; i++) {        // 获得字段名的小写字母形式
             fieldname = f[i].getName().toLowerCase();        // 截取字段名的第一个字母的大写形式
             fristname = fieldname.substring(0, 1).toUpperCase();        try {
                // 从ob的类中寻找字段的get方法,new Class[0]表示get方法没有参数
                  // getMethod的第一个参数表示寻找的方法名
                  // 第二个参数表示方法的参数类型
                  Method me = ob.getClass().getMethod(
                        "get" + fristname + fieldname.substring(1),
                        new Class[0]
                    );            // 调用ob的getXxx方法,new Object[0]表示没有参数,调用结果赋给myob
                // invoke的第一个参数表示调用哪一个对象的方法,好比:ob.getXxx()
                // 第二个参数表示传入的参数,是个Object数组
                 Object myob = me.invoke(ob, new Object[0]);            // myob不为空,且myob属于String类型时
                 if (myob != null && myob.getClass().isAssignableFrom(String.class)) {                // 将myob强转成String对象
                      String s = (String) myob;                // 从ob的类中寻找字段的set方法,set方法带有一个String参数
                      Method me1 = ob.getClass().getMethod(
                            "set" + fristname + fieldname.substring(1),
                            new Class[] { String.class }
                        );                // 用去除空格的s作为参数调用ob的setXxx方法(trans不知道是做什么的)
                      me1.invoke(ob, new Object[] { trans(s.trim()) });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return ob;
    }
      

  2.   

    在不知道目标类有哪些方法的情况下,主动探知有这个类有哪些方法,并调用那些方法!你的这个例子只对类的属性及其对应的get/set方法进行了测试!比如属性为
    name
    对应的方法为
    getName
    setName注意首字母被大写了,这是 java Bean规定的,没什么可解释的!这些都是反射的功能。 可以衍生出很强的功能。呵呵呵!
    火龙果解释的很好,我就不多说了!
      

  3.   

    这个静态方法在复制对象,不过只能复制 类似于java Bean 这样的类