java 反射原理写了一个赋值和取值通用类
首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行时才得到所需类的内部信息。反射能够构建灵活的应用的程序。
使用反射为bean 赋值 ,主要表现在几点,一:利用反射查找出bean类所有public方法,类定义的属性。二:如果是赋值,必须先判断属性类型,再逐个赋值,
三:调用method 类的invoke方法访问bean 的set 、get 方法设值、取值。
看下面代码:
- package com.reflect;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Locale;
- import java.util.Map;
- public class ReflectGetValue {
- /**
- * 取出bean 属性和值
- * @param obj
- * @return
- * @throws Exception
- */
- public static Map<Object,Object> getFileValue(Object obj) throws Exception{
- Map<Object, Object> map = new HashMap<Object, Object>();
- Class<?> cls = obj.getClass();
- Method methods[] = cls.getDeclaredMethods();
- Field fields[] = cls.getDeclaredFields();
- for(Field field:fields){
- String fldtype = field.getType().getSimpleName();
- String getMetName = pareGetName(field.getName());
- String result ="";
- if(!checkMethod(methods,getMetName)){
- continue;
- }
- Method method = cls.getMethod(getMetName, null);
- Object object = method.invoke(obj, new Object[]{});
- if(null != object){
- if(fldtype.equals("Date")){
- result = fmlDate((Date)object);
- }
- result = String.valueOf(object);
- }
- map.put(field.getName(), result);
- }
- return map;
- }
- /**
- * 设置bean 属性值
- * @param map
- * @param bean
- * @throws Exception
- */
- public static void setFieldValue(Map<Object, Object> map, Object bean) throws Exception{
- Class<?> cls = bean.getClass();
- Method methods[] = cls.getDeclaredMethods();
- Field fields[] = cls.getDeclaredFields();
- for(Field field:fields){
- String fldtype = field.getType().getSimpleName();
- String fldSetName = field.getName();
- String setMethod = pareSetName(fldSetName);
- if(!checkMethod(methods, setMethod)){
- continue;
- }
- Object value = map.get(fldSetName);
- System.out.println(value.toString());
- Method method = cls.getMethod(setMethod, field.getType());
- System.out.println(method.getName());
- if(null != value){
- if("String".equals(fldtype)){
- method.invoke(bean, (String)value);
- }else if("Double".equals(fldtype)){
- method.invoke(bean, (Double)value);
- }else if("int".equals(fldtype)){
- int val = Integer.valueOf((String)value);
- method.invoke(bean, val);
- }
- }
- }
- }
- /**
- * 拼接某属性get 方法
- * @param fldname
- * @return
- */
- public static String pareGetName(String fldname){
- if(null == fldname || "".equals(fldname)){
- return null;
- }
- String pro = "get"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
- return pro;
- }
- /**
- * 拼接某属性set 方法
- * @param fldname
- * @return
- */
- public static String pareSetName(String fldname){
- if(null == fldname || "".equals(fldname)){
- return null;
- }
- String pro = "set"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
- return pro;
- }
- /**
- * 判断该方法是否存在
- * @param methods
- * @param met
- * @return
- */
- public static boolean checkMethod(Method methods[],String met){
- if(null != methods ){
- for(Method method:methods){
- if(met.equals(method.getName())){
- return true;
- }
- }
- }
- return false;
- }
- /**
- * 把date 类转换成string
- * @param date
- * @return
- */
- public static String fmlDate(Date date){
- if(null != date){
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US);
- return sdf.format(date);
- }
- return null;
- }
- }
- ----------------------------------
- 测试方法
- public static void main(String[] args) {
- try {
- Map<Object, Object> map = new HashMap<Object, Object>();
- map.put("yi", "reyo");
- map.put("san", "27");
- map.put("er", "2010-10-24");
- Bean bean = new Bean();
- ReflectGetValue.setFieldValue(map, bean);
- Map<Object, Object> m= ReflectGetValue.getFileValue(bean);
- System.out.println(m.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
java 反射原理写了一个赋值和取值通用类的更多相关文章
- Java反射 - 简单的给Bean赋值和取值
由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子. 工具类BeanRefUtil: package c ...
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
- jquery input 赋值和取值
记录一下: 在写一个input赋值,二话不说就直接利用了$('#xx').val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在html上并没有正确的显示出来,后来改为使用如下代码 ...
- js实现hashtable的赋值、取值、遍历
哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值.取值.遍历.排序操作提高效率.想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面 ...
- 实用ExtJS教程100例-011:ExtJS Form 使用JSON数据赋值和取值
上一节中我们演示了ExtJS Form的异步加载和提交数据,本节中我们将演示如何使用JSON数据为ExtJS Form中的字段赋值和取值. 系列ExtJS教程持续更新中,点击查看>>最新E ...
- 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 关于ligerform中select与text的赋值与取值
如有下ligerform表单: var formData = [ { display: "区域", name: "QYYJ", newline: true, l ...
- Jquery实现数据双向绑定(赋值和取值),类似AngularJS
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- java map添加另一个map时候 键值对的类型要一致
java map添加另一个map时候 键值对的类型要一致
随机推荐
- intellij 出现“Usage of API documented as @since 1.8+”的解决办法
intellij 出现“Usage of API documented as @since 1.8+”的解决办法 Usage of API documented as @since 1.8+ This ...
- mac zsh环境配置java_home环境变量
用zsh,修改-/.zshrc 修改这些文件之后,重修打开terminal,配置不会丢 首先确保已经安装了jdk: ## check the present running java which ja ...
- LeetCode(14):最长公共前缀
Easy! 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&qu ...
- Java编程的逻辑 (21) - 内部类的本质
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 使用nginx统一代理dashboard,grafana,Prometheus二级目录访问
k8s上的这些管理工具必不可少,可以统一在nginx下的二级目录下. ingress是好,但我们不方便使用内部域名,相信么...:) 一,prometheus改造 在prometheus的deploy ...
- 【LOJ】#2533. 「CQOI2018」交错序列
题解 有毒吧 这题\(O(n)\)过不去 非得写\(O((a + b)^3\log n)\)的矩乘,同样很卡常 把\(x\)换成\(n - y\) 我们拆完式子发现是这样的 \(\sum_{i = 0 ...
- 按行拆分文本文件与合并文本文件---I/O流---java
背景 在进行自然语言处理的中文词性标注时 进行测试时由于测试数据文本行数较多 而且测试每次标注一行的用时稍长 如果一次将文件读进来测试机器运行时间要连续不能中断 而且 只能一台机器进行工作 于 ...
- 支付宝app支付服务端流程
支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...
- python基础下的数据结构与算法之链表
一.链表的定义 用链接关系显式表示元素之间顺序关系的线性表称为链接表或链表. 二.单链表的python实现 class Node(object): """定义节点&quo ...
- odoo导入功能二开
原来有的导入功能相信很多小伙伴对其功能不是很满意,不过没关系,我们可以二开啊,把它的功能改造成你想要的样子,接下来让我们看看怎么办吧 例如我想把员工导入功能中添加上用户同步注册功能 首先,我要找到原模 ...