Java反射-方法(Method)

工作了三年,第二次使用反射!

遇到的问题描述:

多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好。

查询原因是因为查询数据的SQL为:to_char(a.applyAmount,‘999g999g999d99‘) as applyAmount,

而数据库中applyAmount的值为0。

如果使用以下SQL语句进行测试的话,查询结果也会查询“            .00”的情况。

同时WEB端已采用标签库的形式解决了该问题,Mobile端使用该标签时,不能进行解析该标签。

SELECT TO_CHAR(‘0‘,‘999g999g999d99‘) FROM DUAL

这次的编码思路:

利用反射机制,使用List中对应的所有的setter()和getter()方法,将对象的属性重新赋值!

代码如下:

    /**
     * 利用Java反射机制
     * 当List中的对象属性-金额出现“.00”时,替换成“0”
     * @author czx
     * @date 2014-10-29
     * @param list 要处理的List可能是<?>类型的List
     * @return 处理后的List,即替换“.00”为“0”的List
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static List amonuntOfList2StringUtil(List list) {
        List newList = new ArrayList();
        // 非空判断
        if (list != null && list.size() > 0) {
            // 遍历循环list
            for (Object o : list) {
                // 取得list中存放的对象所属的类
                Class c = o.getClass();
                // 取得该类的所有方法数组
                Method[] ma = c.getMethods();
                if (ma.length > 0) {
                    // 遍历该方法数组
                    for (Method m : ma) {
                        // 仅处理set方法
                        if (m.getName().indexOf("set") >= 0) {
                            try {
                                // 取得get()方法
                                Method newm = c.getMethod(m.getName().replace("set", "get"),new Class[] {});
                                // 使用get()方法取得对应属性
                                Object newo = newm.invoke(o, new Object[] {});
                                // 属性满足去空.trim()后和“.00”相等时,替换为“0”
                                if (newo != null && ".00".equals(newo.toString().trim())) {
                                    // 使用set()方法,设置属性
                                    m.invoke(o, new Object[] { "0" });
                                }
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            } catch (SecurityException e) {
                                e.printStackTrace();
                            } catch (NoSuchMethodException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                newList.add(o);
            }
            return newList;
        }
        return list;
    }
时间: 2024-07-30 07:23:22

Java反射-方法(Method)的相关文章

Java 反射机制[Method反射]

Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射.示例代码很简单,很容易理解. 可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理. 真正的反射是调用MethodAccessor.invoke()真

Java反射方法总结

1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstructors() -- 获得类的所有公共构造函数 Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关) Constructor[] getDeclaredConstructors() -- 获得类

JAVA 反射之Method

★ Method没有构造器,只能通过Class获取. 重点方法: class.getDeclaredMethods():获取所有方法. class.getDeclaredMethod(String name, Class<?>... parameterTypes): 根据方法名获取方法,name是方法名,parameterTypes是可变参数即方法所需要的参数. method.invoke(Object obj, Object... args): 调用方法,obj表示调用方法的对象,args是

Java反射获取Android系统属性值

目录 目录 反射定义 为何需要反射 反射方法Method getDeclaredMethod方法 getMethod方法 参数解释 invoke方法 Android 反射应用 反射定义 "反射"(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为. 为何需要反射 反射带来的好处包括: 在运行时检测对象的类型. 动态构造某个类的对象. 检测类的属性和方法. 任意调用对象的方法. 修改构造函数.方法.属性的可见性. 反射方法Method getDeclaredMetho

Java 反射机制学习资料

Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方法 Java反射——注解 Java反射——泛型 Java反射——数组 Java反射——动态代理 Java反射——类的动态加载和重新加载

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag

java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】

转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法如果存在这样的注释,则返回指定类型的元素的注释,否则为null. 声明 以下是java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法的声明. public <T exte

java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式

作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记 接口类:Animals 1 public interface Animals { 2 3 public void eat(); 4 } package cn.chenc.study.entity; public interface InterfaceFactory { public String show(int i); } 实体类:Person package cn.chenc.study.entity; im

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam