java 反射: 当Timestamp类型的属性值为null时,设置默认值

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Timestamp;

class Person {
    private String name;
    private int age;

    private Timestamp birth;

    public Timestamp getBirth() {
        return birth;
    }

    public void setBirth(Timestamp birth) {
        this.birth = birth;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }
}

/*****************************************************/
public class InvokeSetterMethod {
    public static void main(String[] args) {
        Person p = new Person();
        invokeSetterMethodByType(p, Person.class, "java.sql.Timestamp",
                Timestamp.valueOf("1111-11-11 11:11:11"), Timestamp.class);
         p.setBirth(Timestamp.valueOf("2014-12-11 00:00:00"));
        System.out.println(p.getBirth());
    }

    /**
     * 调用setter方法
     *
     * @param obj
     * @param att
     * @param value
     * @param type
     */
    public static void invokeSetterMethodByType(Object obj, Class cl,
            String methodType, Timestamp param, Class paramType) {
        try {

            Field[] f = cl.getDeclaredFields();
            for (Field field : f) {
                // 属性类型
                String type = field.getType().getName();
                // 属性名
                String name = field.getName();
                // 属性值
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
                        cl);
                Method getMethod = pd.getReadMethod();
                Object o = getMethod.invoke(obj);
                // 当Timestamp类型的属性值为null时,设置默认值
                if (methodType.equals(type) && null == o) {
                    setter(obj, name, param, paramType);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 调用setter方法
     *
     * @param obj
     * @param att
     * @param value
     * @param type
     */
    public static void setter(Object obj, String att, Object value,
            Class type) {
        try {
            Method met = obj.getClass().getMethod("set" + initStr(att), type);
            met.invoke(obj, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 调用getter方法
     *
     * @param obj
     * @param att
     */
    public static void getter(Object obj, String att) {
        try {
            Method met = obj.getClass().getMethod("get" + initStr(att));
            System.out.println(met.invoke(obj));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将单词的首字母大写
     *
     * @param old
     * @return
     */
    public static String initStr(String old) {
        String str = old.substring(0, 1).toUpperCase() + old.substring(1);
        return str;
    }
}

Original: https://www.cnblogs.com/qqzy168/p/3798239.html
Author: 嗨,你的益达~~~
Title: java 反射: 当Timestamp类型的属性值为null时,设置默认值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537493/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 用1000行代码统计西安新房价格后,我有一个惊人的发现……

    事情是这样的 前段时候,我站在华山之巅(没错,我去夜爬华山看日出了,要死),一个朋友突然问我: 你知道现在西安每个区域的新房均价是多少吗? 这个时候,肯定是用数据说话嘛。 不过你以…

    Java 2023年6月9日
    082
  • 选择结构-Java学习日记

    /* 选择结构: 也被称为分支结构。 选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。 Java语言提…

    Java 2023年6月5日
    074
  • 10 张图聊聊线程的生命周期和常用 APIs

    上一篇文章我们聊了多线程的基础内容,比如为什么要使用多线程,线程和进程之间的不同,以及创建线程的 4 种方式。 本文已收录至我的 Github: https://github.co…

    Java 2023年5月29日
    074
  • Java中实现多线程的方式

    通过继承Thread类,并重写run方法 public class MyThread extends Thread{ public static void main(String[…

    Java 2023年6月8日
    060
  • JAVA线程池ThreadPoolExecutor的分析和使用(新手踩坑和推荐方案)

    一、Java中的ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了…

    Java 2023年5月29日
    054
  • CSharp: Strategy Pattern

    csharp;gutter:true; /// /// A simple file handlng class /// Strategy Pattern 策略模式 ///20220…

    Java 2023年6月16日
    075
  • Redis GEO 地理位置

    GEO指令 GEOADD GEODIST GEOPOP GEOHASH GEORADIUS GEORADIUSBYMEMBER 指令补充 删除操作 避免单集合数量过多 存储原理 G…

    Java 2023年6月6日
    072
  • Java开发之@PostConstruct和@PreConstruct注解

    Java开发之@PostConstruct和@PreConstruct注解从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation…

    Java 2023年5月29日
    068
  • nginx server中的root和location的root的区别

    自己发现公司服务器上的nginx的配置文件里,server中有个root, location中也有root。当直接访问域名,后面什么都不加, 发现走的是location里面的roo…

    Java 2023年5月30日
    078
  • 如何优化好UITableView,值得思考

    如果你觉得 UITableViewDelegate 和 UITableViewDataSource 这两个协议中有大量方法每次都是复制粘贴,实现起来大同小异;如果你觉得发起网络请求…

    Java 2023年6月16日
    060
  • WPF 对Border 边框进行投影

    画一个 Border 对边框进行投影 <Window x:Class="WpfApp1.MainWindow" xmlns="http://sc…

    Java 2023年6月14日
    071
  • Android反编译之修改应用包名

    前言 近期看B站数码区这条视频 【大米】破处理器,它能行吗?K50电竞版评测_哔哩哔哩_bilibili 时,发现了UP主的一个比较骚的操作: 嗯?apk文件可以直接拿来使用修改包…

    Java 2023年6月7日
    089
  • 一文搞懂Flink Window机制

    Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算。 窗口化的Flink程序的结构通常如下,有分组流(keyed streams…

    Java 2023年6月6日
    0111
  • nginx刷新显示404

    1、web单页面开发模式,只有一个index.html入口,其他路径是前端路由去跳转的,nginx没有对应这个路径,所以就会报404了。 2、增加try_files $uri $u…

    Java 2023年5月30日
    087
  • Mysql 根据一个表数据更新另外一个表

    方法一: update 更新表 set 字段 = (select 参考数据 from 参考表 where 参考表.id = 更新表.id); update table_2 m se…

    Java 2023年6月5日
    075
  • CSS

    一、入门基础 1.1、语法 ​ 选择器{ ​ 声明1; ​ 声明2; ​ } Title h1{ width: 180px; color: aqua; } 我是标题 建议这种规范 …

    Java 2023年6月8日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球