美文网首页
java01 -- 反射

java01 -- 反射

作者: 半碗鱼汤 | 来源:发表于2019-08-21 21:12 被阅读0次

一、说明

我们经常会遇到一些很多字段的实体类,如果一个一个去 set 值或者 get 值,重复代码量实在太多,非常不方便。如果利用反射机制,就可以将类中所有字段提取出来,放到一个 Field 数组中,在去遍历这个数组,取出每一个 Field 的 name ,通过这个 name ,就可以调用 getter 和 setter 方法,非常方便。接下来,我们写几个常用的方法做一个工具类。

二、工具类代码

import java.lang.reflect.Method;
import java.math.BigDecimal;

/**
 * java 反射工具类
 */

public class ClassMethodUtil {

    /**
     * 根据属性,获取get方法
     *
     * @param ob   对象
     * @param name 属性名
     * @return
     * @throws Exception
     */
    public static Object getGetMethod(Object ob, String name) throws Exception {
        Method[] m = ob.getClass().getMethods();
        for (int i = 0; i < m.length; i++) {
            if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
                return m[i].invoke(ob);
            }
        }
        return null;
    }

    /**
     * 根据属性,拿到set方法,并把值set到对象中
     *
     * @param obj       对象
     * @param clazz     对象的class
     * @param filedName 需要设置值得属性
     * @param typeClass
     * @param value
     */
    public static void setValue(Object obj, Class<?> clazz, String filedName, Class<?> typeClass, Object value) {
        filedName = removeLine(filedName);
        String methodName = "set" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
        try {
            Method method = clazz.getDeclaredMethod(methodName, new Class[]{typeClass});
            method.invoke(obj, new Object[]{getClassTypeValue(typeClass, value)});
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 通过class类型获取获取对应类型的值
     *
     * @param typeClass class类型
     * @param value     值
     * @return Object
     */
    private static Object getClassTypeValue(Class<?> typeClass, Object value) {
        if (typeClass == int.class || value instanceof Integer) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == short.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == byte.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == double.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == long.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == String.class) {
            if (null == value) {
                return "";
            }
            return value;
        } else if (typeClass == boolean.class) {
            if (null == value) {
                return true;
            }
            return value;
        } else if (typeClass == BigDecimal.class) {
            if (null == value) {
                return new BigDecimal(0);
            }
            return new BigDecimal(value + "");
        } else {
            return typeClass.cast(value);
        }
    }

    /**
     * 处理字符串  如:  abc_dex ---> abcDex
     *
     * @param str
     * @return
     */
    public static String removeLine(String str) {
        if (null != str && str.contains("_")) {
            int i = str.indexOf("_");
            char ch = str.charAt(i + 1);
            char newCh = (ch + "").substring(0, 1).toUpperCase().toCharArray()[0];
            String newStr = str.replace(str.charAt(i + 1), newCh);
            String newStr2 = newStr.replace("_", "");
            return newStr2;
        }
        return str;
    }

}

相关文章

  • java01 -- 反射

    一、说明 我们经常会遇到一些很多字段的实体类,如果一个一个去 set 值或者 get 值,重复代码量实在太多,非常...

  • Java01

    一课程体系介绍 Java基础 Java Web 大数据 二基础知识 1 常见操作系统 Windows、Mac、Li...

  • java01

    八种几本类型的声明 public class BaseDataTypes{ public static void ...

  • Java01(基础)

    <补档> 自学java时的那些想法(一) 随着蓝桥杯boom的一声爆炸,终于下定了决心要认真学习了,回来也不看C了...

  • Java01 (20150416)

    碎碎念: 刚跑步回来,いよいよ今日になった~终于是到了今天。 早上其实六点多就醒了,但是实在是太瞌睡了,到最后还是...

  • 初学Java01

    接上一篇,如果说文学创作需要文采的话,相比较而言,我想从“零”开始学编程的话,应该每个人的差别不会太大,尤其...

  • JAVA01筆記

    JAVA名言1.簡單的2.萬般皆物件3.要什麼給甚麼物件導向:封裝、繼承、多型。一、前言 JAVA是高階語言的一種...

  • Core in JAVA01 GregorianCalendar

    1.日期打印 需要用到的java类 import java.util.Calendar; import java....

  • JavaSE Day01 JDK、IDE 安装

    1. Java01 的基础知识大纲 2. Java 有 3 大版本,分别用一句话描述一下? Java SE:是 J...

  • java01(基础环境搭建)

    javaEE:企业版 javaSE:标准版 javaME:小型版 JRE:java运行环境(包括java虚拟机和j...

网友评论

      本文标题:java01 -- 反射

      本文链接:https://www.haomeiwen.com/subject/etlwsctx.html