利用Java反射机制将Json格式字符串反射为 Bean List

若依框架定时任务RCE漏洞深度剖析:从反射机制到安全加固 在Java Web应用开发中,反射机制是一项强大的核心技术,它允许程序在运行时动态加载类、调用方法和访问属性,为框架的灵活性和扩展性提供了基础。然而,这种动态性若缺乏严格的安全边界,便会成为严重的安全隐患,尤其是在后台管理功能中。定时任务作为常见的系统调度功能,其动态任务调度的实现往往依赖反射来执行用户定义的任务逻辑。若开发者未对可调用的类和方法实施白名单限制,攻击者便可能通过后台权限注入恶意调用目标,利用反射机制执行任意系统命令,实现从后台权限到服务器命令执行的越权攻击,即远程代码执行漏洞。本文以广泛应用 阅读详情

前面提到过Strtus2在2.1.6以后就将Json格式整合到Strtus中了,可见到struts-json-plugin,在Struts的文档里面有下面一段例子:

Example

Setup Action

This simple action has some fields:

Example:

import java.util.HashMap;
import java.util.Map;

import com.opensymphony.xwork2.Action;

public class JSONExample {
    private String field1 = "str";
    private int[] ints = {10, 20};
    private Map map = new HashMap();
    private String customName = "custom";

    //'transient' fields are not serialized
    private transient String field2;

    //fields without getter method are not serialized
    private String field3;

    public String execute() {
        map.put("John", "Galt");
        return Action.SUCCESS;
    }

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public int[] getInts() {
        return ints;
    }

    public void setInts(int[] ints) {
        this.ints = ints;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    @JSON(name="newName")
    public String getCustomName() {
        return this.customName;
    }

Write the mapping for the action

  1. Add the map inside a package that extends "json-default"
  2. Add a result of type "json"

Example:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

  <package name="example"  extends="json-default">
     <action name="JSONExample" class="example.JSONExample">
        <result type="json"/>
     </action>
  </package>

</struts>

JSON example output
{  
   "field1" : "str", 
   "ints": [10, 20],
   "map": {
       "John":"Galt"
   },
   "newName": "custom"
}

如例子中所示,根据配置Strtus会通过JsonUtil将对象转换为Json格式的字符串,然后通过流返回给客户端,但当Ext返回Json对象的时候,JsonUtil的反序列化功能似乎逊色了许多,大概看了一下源代码JsonUtil中能将Json格式的对象集合转为List<Map<Objcet,Object>>这种格式,而不能映射到实体类,现实中Json的工具还有许多,例如google的Json工具就提供了fromJson的方法,在这里我只是利用Java反射写了一个对简单类型反射的工具类,说了这么多废话,切入正题:

public static <T> List<T> fromJson(String json, Class<T> cls,
			SimpleDateFormat sdf) {
		List<T> result = new ArrayList<T>();
		try {
			Map<String, Method> methodMap = new HashMap<String, Method>();
			Method[] methods = cls.getMethods();
			for (Method m : methods) {
				String name = m.getName().toUpperCase();
				if (name.startsWith("SET") || name.startsWith("IS")) {
					methodMap.put(name.substring(3), m);
				}
			}
			List<Map<Object, Object>> list = (List<Map<Object, Object>>) JSONUtil
					.deserialize(json);
			for (Map<Object, Object> map : list) {
				Object o = cls.newInstance();
				Iterator<Entry<Object, Object>> itr = map.entrySet().iterator();
				while (itr.hasNext()) {
					Entry<Object, Object> entry = itr.next();
					String key = entry.getKey().toString().toUpperCase();
					if (methodMap.containsKey(key)) {
						Method _m = methodMap.get(key);
						Class<?> c = _m.getParameterTypes()[0];

						if (c.getName().equals("int")) {
							_m.invoke(o, Integer.parseInt(entry.getValue()
									.toString()));
						} else if (c.getName().equals("long")) {
							_m.invoke(o,
									Long.parseLong(entry.getValue().toString()));
						} else if (c == Integer.class) {
							_m.invoke(o, (Integer) Integer.parseInt(entry
									.getValue().toString()));
						} else if (c == Long.class) {
							_m.invoke(o, (Long) Long.parseLong(entry.getValue()
									.toString()));
						} else if (c == String.class) {
							_m.invoke(o, entry.getValue().toString());
						} else if (c == Date.class) {
							String date = entry.getValue().toString();
							date = date.replaceFirst("T", " ");
							_m.invoke(o, sdf.parse(date));
						}
					}
				}
				if (o != null) {
					System.out.println("sss");
					result.add((T) o);
				}
			}
		} catch (JSONException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return result;

	}

主要是找到SET方法然后将对应的属性设置进去,而对应的属性则是根据判断参数类型来进行的,再看下面这一句
String date = entry.getValue().toString();
date = date.replaceFirst("T", " ");

Strtus2的Json Plugin似乎有一个问题目前还没有搞清楚,Strtus在将java.util.Date类型时间格式
2011-07-13 14:24:31
转换为Json字符串的时候变成了这个样子

2011-07-13T14:24:31
所以当提交回来的时候如果是这种时间格式是不能转换的,于是有了上面把T替换为“ ”的操作。

明天再研究一下到底是什么原因导致时间类型转换的异常。

使用反射将json自动装配到javaBean中 立即下载

相关推荐

通过java反射实现map与bean之间互转

NULL 博文链接:https://xingguangsixian.iteye.com/blog/2041531

Java中将JSON格式的数据转换成对应的Bean、Map、List数据

简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json、xml等传给客户端,客户端也可以重新组织数据传回服务器端。JSON和XML提供了一套比较方便的数据组织形式。。并且有很多现成的类库用于解析这些数据。。 本文是对net.sf.json使用后的总结。。目前官方开源的对json进行处理的项目很多,fastjson还有其它等等。。视自己处理问

不积跬步无以至千里,不积小流无以成江海。 5万+

从隐私保护到生命守护:CPD技术中的传感器选择与权衡

本文探讨了智能座舱中儿童存在检测(CPD)技术的传感器选择与隐私保护平衡策略。通过分析毫米波雷达、UWB等先进技术的性能与隐私风险,揭示了如何在确保儿童安全的同时保护用户隐私。文章还展望了CPD技术与座舱生态系统的未来融合趋势,为汽车安全领域提供了重要参考。

weixin_29159441的博客 301

转:json和list、bean之间转换总结

转至元数据起始 //方法一,将json解析后赋给单独的元素 String jstr="{'json':'jsonvalue','bool':true,'int':1,'double':'20.5'}";JSONObject json=JSONObject.fromObject(jst...

普元开发者乐园 3497

Win10管理员权限的‘暗门’:从mmc.exe被阻止,聊聊UAC与自动提权那些事儿

本文深入解析Windows 10中UAC(用户账户控制)与自动提权机制,探讨mmc.exe被阻止的深层原因及解决方案。从UAC工作原理到自动提权机制,再到具体诊断与修复步骤,帮助用户理解并解决权限管理问题,同时平衡安全性与便利性。

weixin_30521161的博客 419

太空安全卫士:基于YOLOv5的空间态势感知系统(实现轨道碰撞预警与太空环境保护)

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_71589036的博客 90

java后台:JSONObject调取List值使用方法 @Mappings

JSONObject调取List值使用方法 JSONObject 获取json后无法转换成Bean所以选择用JSONArray接受值 具体用法如下 //用来接收json的值 JSONArray jsonArray = new JSONArray(); //urlString 是你要调用的地址 (填上你要调取的地址) JSONObject json = restTemplate.getFor...

小小的开发者 1万+

企业级托管钱包架构设计与MPC密钥管理:基于Go语言的生产级实践

本文探讨了2026年Web3生态中企业级托管钱包的技术架构与实现方案。文章指出,传统私钥管理模式已无法满足机构级资产管理需求,而基于多方安全计算(MPC)和门限签名(TSS)的技术方案成为主流选择。研究分析了托管钱包的四层架构设计,详细解读了MPC的核心技术原理,包括分布式密钥生成(DKG)和签名协议演进。通过Go语言实现案例,展示了密钥分片管理、DKG流程和交易签名等核心模块的代码实现。文章还提出了生产部署的安全原则、容灾设计和监控体系,并讨论了密钥撤销等现存挑战及TEE融合等未来趋势。研究为构建安全、高

分享AI、区块链技术及应用,未来已来 81

java中的bean、list、map和JSON的互转

JSON两种格式:1、对象格式,2、数组对象 在前端和后端进行数据传输的时候,后端返回json格式的字符串,前台使用js中的JSON.parse()方法把JSON字符串解析为json对象,然后进行遍历,供前端使用。 //JSON的对象格式的字符串 {"name":"JSON","address":"北京市西城区","age":25} //数据对象格式 [{"name":"JSON","ad...

小石头 582

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

rk3568 rk628桥片 rgb2hdmi

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 451

java-利用反射做一个将javabean对象转为json的小工具(v1)

java-利用反射做一个将javabean对象转为json字符串的小工具(v1) 解决思路 1 利用反射机制获取对象的所有字段 2 遍历,将字段名和值按照一定格式添加到字符串中 所需知识 1 反射基础知识 代码实现 package com.woniu.ClassDemoHomeWork; import java.lang.reflect.Field; import java.text.Simpl...

xiaobozhi1993的博客 450

第1章 机器人SLAM算法工程师主要做什么的?(附SLAM学习路线及资料推荐)

对于想从事机器人与自动驾驶领域的在校大学生、研究生来说,建图定位算法工程师是一个极具发展潜力的岗位,而SLAM知识体系则是胜任该岗位的核心支撑。从基础的计算机工具、C++语言,到核心的开源框架、数学知识,再到硬件衔接与项目实践,每一个环节都不可或缺。建议大家结合自身兴趣确定侧重方向(如激光SLAM、融合定位),先通过开源项目建立实践认知,再补全理论知识,同时积极参与社区交流。

行知SLAM 953

Java中对象转JSON工具类(反射机制的应用)

通过使用java反射机制,实现通用的对象和集合转json字符串办法。

雾林小妖的博客 617

⚡【C++要笑着学】(13) STL介绍:什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷

再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。

有道无术, 术尚可求。有术无道, 止于术。 3034

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Gson在java对象和json字符串之间转换

Gson相比org.json最大的好处是从json字符串转向java实例时候少了依据每个实例自己赋值的过程,比如在org.json的时候,我们先从json字符串构建一个jsonobject,然后用各种的json get方法获取到每个字段的值,这是一个体力活。而gson依据反射机制我们只要传递我们要实例化的类型class进去返回就是创建好的实例。大大减少了代码量。 先从java实例到json这个方...

Eddie-Wang的博客 517

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java中json重复数据结构_JAVA把各种数据结构转换为JSON格式

Java代码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.Iterator;im...

weixin_32187691的博客 110

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java反射机制深度解析:从核心原理到框架应用与面试实战

反射是Java语言中实现动态性的核心技术,它允许程序在运行时获取类的元数据并操作类或对象。其原理基于JVM的类加载机制,每个被加载的类在堆内存中都有唯一的Class对象作为其元数据蓝图。这项技术的核心价值在于提供了极高的灵活性,使得代码能够动态加载和调用类,从而支撑了众多高级特性与框架的实现。在工程实践中,反射是Spring框架实现控制反转(IoC)和依赖注入(DI)的基石,例如@Autowired注解的自动装配就是通过反射扫描字段并注入完成的。同时,它也是实现插件化架构、动态代理以及对象序列化/反序列化(

weixin_30292843的博客 405

json转java object list

前台表单提交可以用json方式提交list

gergerman的专栏 1082

Java反射机制深度解析:从Class对象到动态编程实战

在Java编程中,动态编程能力是构建灵活、可扩展系统的关键技术之一。其核心原理在于允许程序在运行时检视和操作自身的结构,打破了编译期的静态限制。这项技术的核心价值在于实现运行时的动态行为,极大地提升了代码的灵活性和框架的通用性。它广泛应用于框架开发、测试工具、序列化/反序列化以及动态代理等场景。通过反射,开发者可以动态创建对象、调用方法、访问和修改字段,甚至处理注解和泛型信息。例如,在实现一个通用的数据导出工具时,结合**注解处理**和**动态方法调用**,可以自动根据模型生成报表,避免硬编码,显著提升开发

weixin_34178244的博客 508

java 支持json jar包_java转化json方式2,(需要json官方jar包支持)

import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.util.List;public class JsonUtil {public static String objectToJson(Object objec...

weixin_42502040的博客 171

Json字符串处理

工作中碰到一个Json对象转List不成功的问题,记录下 public static void main(String[] args) { String keywordUpdate = "{\"keywordTypes\":[{\"adgroupId\":10394588,\"keyword\":\"测试1\"},{\"adgroupId\":10394588,\"keyword

q979392157的博客 546

Java将List/JavaBean转成Json

importjava.beans.Introspector; importjava.beans.PropertyDescriptor; importjava.util.List; /** *json的操作类 * *@authorwsz *@createTime2012-4-12 *@version1.0 */ publicclassJs...

weixin_30886233的博客 109

获取json文件未更新_更新啦!

一个小小的工具类很久没有更新公众号了,差点忘记我是一个粉丝过二十的公众号号主,今天来更新一下,顺手抽个奖,评论区抽三个,一人奖20万。今天主要写一个自己做的工具类,就是json转bean的工具类,思路很简单,json字符串转bean,实际上就是通过反射获取实体类的结构,然后根据json字符串的结构进行实例化并赋值就行了。反过来bean转json字符串也是一样的,获取类结构,使用JSON的...

weixin_39875832的博客 243
上一篇: 利用Java反射机制将Json格式字符串反射为 Bean List
下一篇: 盘点JDK1.5的新特性(一)——静态导入功能
G_beginner
博客等级 码龄16年 45粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值