Java反射在Android中的应用,以及注意事项_DylanAndroid的博客-程序员宝宝

技术标签: java  android  javabean  反射  Android  应用  

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53402586
本文出自【DylanAndroid的博客】


Java反射在Android中的应用,以及注意事项

【玩转SQLite系列】(七)打造轻量级ORM工具类SQLiteDbUtil操作数据库
这篇文章当中,我封装了一个轻量级的数据库ORM工具类,其中我们发现,不管是建表、查询数据、插入数据、都只需要一个简单的javabean对象,这正是这个
轻量级的工具类的强大之处,那么强大的背后到底是如何通过数据库中的字段和javabean对象之间去互转呢?这就牵扯到一个java的基础只是:java的反射。

1.Java反射工具类

package cn.bluemobi.dylan.sqlitelibrary;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static android.R.attr.value;

/**
 * Created by yuandl on 2016-11-21.
 */a
public class JavaReflectUtil {
    
    /**
     * 获取类的简名,不包含包名
     *
     * @param c 类
     * @return 类名
     */
    public static String getClassName(Class c) {
        if (c == null) {
            return null;
        }
        return c.getSimpleName();
    }

    /**
     * 获取类的属性名
     *
     * @param c 类
     * @return 所有属性的数组
     */
    public static String[] getAttributeNames(Class c) {
        if (c == null) {
            return null;
        }
        Field[] declaredFields = new Field[0];
        try {
            declaredFields = c.getDeclaredFields();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        List<String> names = new ArrayList<>();
        for (int i = 0; i < declaredFields.length; i++) {
            /**忽略编译产生的属性**/
            if (declaredFields[i].isSynthetic()) {
                continue;
            }
            /**忽略serialVersionUID**/
            if (declaredFields[i].getName().equals("serialVersionUID")) {
                continue;
            }
            names.add(declaredFields[i].getName());
        }
        return names.toArray(new String[names.size()]);
    }

    /**
     * 获取类的属性类型
     *
     * @param c 类
     * @return 所有属性类型的数组
     */
    public static Class[] getAttributeType(Class c) {
        if (c == null) {
            return null;
        }
        Field[] declaredFields = new Field[0];
        try {
            declaredFields = c.getDeclaredFields();
        } catch (SecurityException e) {
            e.printStackTrace();
        }

        List<Object> types = new ArrayList<>();
        for (int i = 0; i < declaredFields.length; i++) {
            if (declaredFields[i].isSynthetic()) {
                continue;
            }
            if (declaredFields[i].getName().equals("serialVersionUID")) {
                continue;
            }
            types.add(declaredFields[i].getType());
        }
        return types.toArray(new Class[types.size()]);
    }

    /**
     * 获取类的属性名获取属性值
     *
     * @param o         类对象
     * @param attribute 属性名称
     * @return 所对应的属性值
     */
    public static Object getValueByAttribute(Object o, String attribute) {
        if (o == null) {
            return null;
        }
        if (attribute == null || attribute.isEmpty()) {
            return null;
        }
        try {
            String getMethodName = "get" + attribute.substring(0, 1).toUpperCase() + attribute.substring(1);
            Method method = o.getClass().getMethod(getMethodName, new Class[]{});
            Object value = method.invoke(o, new Object[]{});
            return value;
        } catch (NoSuchMethodException e) {
            String getMethodName = "is" + attribute.substring(0, 1).toUpperCase() + attribute.substring(1);
            try {
                Method method = o.getClass().getMethod(getMethodName, new Class[]{});
                Object value = method.invoke(o, new Object[]{});
                return value;
            } catch (NoSuchMethodException e1) {
                e1.printStackTrace();
            } catch (InvocationTargetException e1) {
                e1.printStackTrace();
            } catch (IllegalAccessException e1) {
                e1.printStackTrace();
            }
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取类的属性名获取属性值
     *
     * @param o 类对象
     * @return 所对应的属性值
     */
    public static List<Map<String, Object>> getAllFiledInfo(Object o) {
        if (o == null) {
            return null;
        }
        String[] attributes = getAttributeNames(o.getClass());
        Object[] attributeTypes = getAttributeType(o.getClass());
        List<Map<String, Object>> allFiledInfos = new ArrayList<>();
        for (int i = 0; i < attributes.length; i++) {
            Map<String, Object> allFiledInfo = new HashMap<>();
            allFiledInfo.put("name", attributes[i]);
            allFiledInfo.put("type", attributeTypes[i]);
            allFiledInfo.put("value", getValueByAttribute(o, attributes[i]));
            allFiledInfos.add(allFiledInfo);
        }
        return allFiledInfos;
    }

}

2.在Android中需要注意的事项

我们在遍历循环一个类中的属性还是属性名的时候一定要注意:Android studio2.2之后的Instant Run功能的使用会导致JavaBean对象在编译之后
多产生两个属性。所以,我们在获取的时候一定要记得忽略。

  for (int i = 0; i < declaredFields.length; i++) {
            /**忽略编译产生的属性**/
            if (declaredFields[i].isSynthetic()) {
                continue;
            }
            /**忽略serialVersionUID**/
            if (declaredFields[i].getName().equals("serialVersionUID")) {
                continue;
            }
            names.add(declaredFields[i].getName());
        }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010785585/article/details/53402586

智能推荐

IDEA—右边maven模块不见了_普通网友的博客-程序员宝宝_idea导入项目没有pom文件

每个项目的文件结构可能不同,打开项目用打开文件夹的形式时,可能会出现打开之后右边没有maven的情况。导入的文件夹下没有pom文件,IDEA不能识别当前的项目为maven项目,需要打开有pom文件的文件夹。或用直接打开pom文件的形式打开项目。..._1671465600

大道至简之二十:寻找资金密码_leanrning的博客-程序员宝宝

寻找资金密码——大道至简之二十   时寒冰    在我此前有关趋势的表述中,多次强调资金的重要性。    资金犹如水流,犹如血液,是资本市场的灵魂和力量的源泉。    在《大道至简之十七:参照物中找趋势》中,我提及了两个参照指标:A股中的水泥股和期货中的螺纹钢。这些天来的对照说明,紧跟螺纹钢期货和水泥股这两大指标走,相对是比较安全的。    这两大指标能够提前警示风

我的世界 服务器物品代码错乱,我的世界MCPC++服务端bat开服器编码错误,求解。..._kid22333的博客-程序员宝宝

We appear to be missing one or more essential library files.You will need to add them to your server before FML and Forge will run successfully.java.lang.ClassNotFoundException: net.minecraft.launchwr...

MySQL slave相关参数_遇星的博客-程序员宝宝

init_slave设定每次SQL thread启动时执行的语句。log_slave_updates是否将复制线程执行的内容记录到binlog。log_slow_slave_statements如果从库开启慢日志,是否将复制线程执行的慢SQL记录到慢日志。注意如果master的binlog格式是row,则无论log_slow_slave_statements是否开启都不会记录复制相关的慢..._1671465600

mi面试题_bit小兵的博客-程序员宝宝

http://www.importnew.com/27326.html转载于:https://www.cnblogs.com/wuer888/p/7837902.html

随便推点

解读SDWebImage图片缓存_Mars_iOS的博客-程序员宝宝_sdwebimage缓存机制

SDWebImage是一个功能强大的图片缓存框架,可以实现网络图片加载和缓存。那么SDWebImage的缓存机制是如何实现的呢?缓存时间是多久?清除缓存的策略是怎样的?让我们带着这些问题,走进源码,解读SDWebImage。SDWebImage提供一个UIImageView的分类 UIImageView+WebCache,用来加载和缓存来通关HTTP传输的图片资源。提供了缓存管理、异步下载、缓...

制作一个简单HTML传统端午节日网页(HTML+CSS)_IT晓峰的博客-程序员宝宝

传统春节网页设计、圣诞节节日发展、中秋、端午传统节日习俗庆祝、地区特色,网站模板 、等网站的设计与制作。️ 大学生传统节日网页作业成品采用DIV CSS布局制作,主要内容包括等内容,作品共多个页面,学生HTML静态网页基础水平制作,页面排版干净简洁。网页技术方面应用包括网页背景颜色、字号字体设置、超链接、图文页面、菜单栏、顶部大图等网页基础知识点 一套优质的网页设计应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网

opencv学习笔记16:梯度运算之scharr算子及其函数使用_总裁余(余登武)的博客-程序员宝宝_scharr

前文介绍了sobel算子opencv学习笔记14:sobel算子及其函数使用scharr算子理论系数和sobel不一样,其他一样。scharr函数使用dst=cv2.Scharr(src,ddpetph,dx,dy)dst:处理结果src:源图像ddpetph:图像深度dx:x轴方向,dy:y轴方向实际操作中,计算梯度值可能会出现负值而被截断。通常处理的图像类型为np.unit8,处理后的结果也是该类型,所有负数截断为0,发生信息丢失。所以,在计算时,使用更高的数据类型cv2.C

景点旅游信息系统——C/C++程序设计、Qt图形化界面_一支王同学的博客-程序员宝宝_c++景点

关键字:Qt、C/C++、新增/删除/编辑 结点和边、判断创建的导游线路图有无回路的算法——拓扑图、输出给定入口景点的导游线路图的算法——DFS、求两个景点间的最短路径的算法——Floyd、给出道路建设(最小生成树)的算法——Kruskal、自定义文件的写入与读出

评论设计实现,完全模范bilibili实现评论功能,表的设计、sql如何查找,以及前端的一些设计_黄金贼贼的博客-程序员宝宝

如图,bilibili的评论主要分为根评论(顶级评论)和子评论(回复评论),名称我乱说的哈哈,这里的顶级评论就是最顶级的意思,他不是任何评论的回复评论,bilibili前端显示也没有那种层层递进,但我相信表的结构设计肯定是有所体现的红色为顶级评论,蓝色为子评论1.表结构设计废话不多说,首先是表结构的设计,一般评论应该有的属性字段我就不说了,这里主要考虑说明的是根评论与子评论(回复评论)是一个表还是两个表的问题,考虑到如果是两张表话,那就必须得为子评论再加一张子评论点赞表以及子评论又有子评论呢,

编曲鼓音源推荐 编曲怎么编鼓_Tilling231的博客-程序员宝宝

现代音乐打击乐中鼓点的应用所占的比重非常大,无论是流行乐,摇滚乐,还是EMD几乎都有大量的鼓元素的使用。在编曲的时候,好的鼓音源能让编曲增色不少,那么有哪些鼓音源推荐呢?编曲怎么编鼓呢?下面一起来看一下。下载链接:souurl.cn/w2qu8v在编曲时鼓音源的选择至关重要,并没有说哪一款鼓音源更好,需要根据编曲的风格进行选择,以下给大推荐几款常用的鼓音源:1、FL Studio 这款编曲软件自带808 鼓机音源,808鼓在EDM ,Trap ,Hiphop等风格的音乐中应用非常广泛,底鼓类似心跳的感觉常

推荐文章

热门文章

相关标签