反射小工具

一、类的复制

  copyProperties(Object sourceObject,Object targetObject);

  ps:时间不够了,这个很糙,很多情况都还没有考虑。下次有时间了再好好写一个

  

public void copyProperties(Object sourceObject,Object targetObject){
  /*
  * 首先获取到传递过来的两个类的Class对象
  */
  Class sourceClass = sourceObject.getClass();
  Class targetClass = targetObject.getClass();

  /*
  * 获取到对象中的所有属性
  * getFields()获得某个类的所有的公共(public)的字段,包括父类。
  *  
  * getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段
  *
  * 在类中设置属性的时候一般都是设置为private,所以这里使用getDeclaredFields()方法
  */
  Field[] sourceFields = sourceClass.getDeclaredFields(); //注意,这个地方需要引入反射的包
  Field[] targetFields = targetClass.getDeclaredFields();

  /*
  * 获取到类中的所有属性时,就有两种处理方法
  * 一、嵌套循环
  * 二、单个循环
  */
  boolean flag = true;
  if(flag) {
  //嵌套循环
  if(sourceFields != null && sourceFields.length >0){
    if(targetFields != null && targetFields.length > 0) {
      //如果类中有属性,那么嵌套循环
      for(Field sourceField : sourceFields) {
        for(Field targetField : targetFields) {
          //获取到初始类的属性名称
          String sourceFieldName = sourceField.getName();
          Class sourceFieldType = sourceField.getType();
          //获取到目标类的属性名称
          String targetFieldName = targetField.getName();
          Class targetFieldType = targetField.getType();
          //判断类名是否一样
          if(sourceFieldName.equals(targetFieldName) && sourceFieldType.equals(targetFieldType)) {
            //如果一样,那么就执行复制

            /**
            * 在复制这个地方,还有一个问题
            * 如果说目标的对象该属性有值,那么要不要重新赋值
            * 这个地方加一个判断即可
            */
            String getMethodName = "get" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右
            String setMethodName = "set" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右

            try {
              //通过方法名称获取到类中的方法
              Method getMethod = sourceClass.getMethod(getMethodName);
              /*
              * 获取到方法之后,直接执行
              * method.invoke(Object,args);
              * Object : 需要执行这个方法的对象
              * args : 参数
              */
              Object getMethodValue = getMethod.invoke(sourceObject);

              Method setMethod = targetClass.getMethod(setMethodName, targetFieldType);
              setMethod.invoke(targetObject, getMethodValue);
            } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
              } //因为是getXxx()所以不需要
      }else {

  

      }
}
}
}else {
//如果该类中没有属性,那么这个方法就没有意义,直接返回
return;
}
}else {
//如果该类中没有属性,那么这个方法就没有意义,直接返回
return;
}
}else {
//单个循环
}
}

时间: 2024-10-13 20:19:20

反射小工具的相关文章

自定义水波球清理内存的悬浮窗小工具

一.概述 现在一些手机管家都会有一个用来清理内存的悬浮窗小工具,感觉挺实用的,就自己做了一个.首先介绍一下这个工具的功能,除了可以清理内存,还有调节手机屏幕亮度.手电筒.无线网.移动数据.蓝牙.GPS开关的功能.先上图,感受一波: 清理手机内存     一些常用功能的开关 二.功能实现 1.悬浮窗     MainActivity只有两个按钮,控制悬浮窗的打开和关闭.这里我是用Service去控制的.下面我把FloatWindowService的代码贴出来: public class Float

三个 DAL 相关的Java代码小工具

最近在做 DAL (Data Access Layer 数据访问层) 的服务化,发现有不少地方是人工编写比较繁琐的,因此写了几个小工具来完成. 1.  从 DAO 类自动生成 CoreService 类, CoreService 直接调用 DAO 类 思路: 通过正则表达式解析方法参数, 使用正则替换及源 DAO 文件来生成 CoreService 源文件. package zzz.study.utils; import cc.lovesq.dao.CreativeDAO; import jav

C# 接口开发小工具 笔记

做了2年的接口开发,主要给移动端提供接口,整理了一套小工具,在这里记录一下. 1.非空字段检测 接口某些字段不能为空,最开始进行空值检测是在方法里面,一个参数一个参数手动的检测是否为空,某些方法非空字段十几个的时候,代码臃肿,看着恶心,写着也烦,于是就利用特性和反射实现了自动空值检测. //特性声明 [AttributeUsage(AttributeTargets.Property)] public class NotNull : Attribute { } //使用方式 public clas

搬单查询小工具总结

搬单查询小工具总结 需求:页面输入团单号,从数据库中查询搬单错误的数据,以excel形式导出. 前端页面放在ts-settle-tools-web项目中,后端查询数据库的部分写在ts-tg-settle中,以API形式提供给ts-settle-tools使用,其实是通过webservice调用的. java public interface TSSettleService {     /**     * 查询搬单错误数据     * @param dealGroupIds     * @retu

大有学问的刷漆小工具

在进行装修过程中占有相当重要的一部分--刷漆,因为墙面粉刷的结果会直接影响着整个家装的质量.要做到完美粉刷墙面当然少不了我们刷漆小工具,这些工具都有哪些呢?让我们一起来看看吧. 工具之一--需用滚筒刷墙面 又称滚筒,需搭配漆盘使用的滚筒刷,由于滚面范围广,所以是最省力.省时的刷具,尤其是接上延长杆后,可轻易粉刷墙面高处或天花板,但缺点是容易产生漆料喷溅的状况,所以滚筒刷的毛不要太短,但一定要细,这样刷出来的漆膜才会手感细腻. 滚筒刷分长毛,中毛.短毛三种,其表现为滚筒刷毛的长短,而不是滚筒本身的

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

这些小工具让你的Android 开发更高效

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

原创SQlServer数据库生成简单的说明文档小工具(附源码)

这是一款简单的数据库文档生成工具,主要实现了SQlServer生成说明文档的小工具,目前不够完善,主要可以把数据库的表以及表的详细字段信息,导出到 Word中,可以方便开发人员了解数据库的信息或写技术说明文档. 技术上主要采用的 C#+Dapper+Npod ,开发工具为Vs2015,基于Net4.5框架. 实现思路: 1.首先获取数据库的字符串,测试链接是否成功, 2.通过脚本获取该服务器的数据库列表. 3.根据数据库找到该数据库的所有数据表 4.通过脚本找到该数据表所有的字段信息 5.使用N

Java正则表达式——测试正则表达式的一个小工具

正则表达式是一种强大而灵活的文本处理工具.使用它我们能以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理. 关于正则表达式的语法,网上对此有介绍的文章实在是多不胜数,实在找不到,还可以查看Java的API文档,就不多介绍了.这里主要介绍一个可以测试正则表达式的小工具.直接上代码: 1 package com.test.stringregex; 2 //{Args: abcabcabcdefabc "abc+" &q