反射操作数组---反序列化小知识

Posted ggwow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射操作数组---反序列化小知识相关的知识,希望对你有一定的参考价值。

Object[]  为 数据源

model 中有一个属性为xxx[] 未知,在java中,object[] 无法强制转化成xxx[],如果上文中的f.set(obj,fieldObj );方法反射写入值,会报错。

具体方法:

 

 

//obj为对象
//classKey 为数组的那个成员变量名称
java.lang.reflect.Field f = obj.getClass().getDeclaredField(classKey);

//获得数组类型
Class fieldClazz = f.getType();

if (fieldClazz.isArray()) {
    Object[] arrayObjs = (Object[]) value;//反序列化生产的object[]
    
    //fieldClazz.getComponentType();获得数组的成员类型
    //Array.newInstance(clazz,length) 相当于 Clazz[] array = new Clazz[length]; 但是clazz 未知时候,无法用后者
    Object fieldObj = Array.newInstance(fieldClazz.getComponentType(), arrayObjs.length);
    
    for(int j = 0 ; j < arrayObjs.length; j++) {
        //写入值的方法
        Array.set(fieldObj, j, arrayObjs[j]);
    }
     f.set(obj,fieldObj );
}

 

以上是关于反射操作数组---反序列化小知识的主要内容,如果未能解决你的问题,请参考以下文章

android小知识点代码片段

(单例设计模式之一)饿汉式的反射与反序列化漏洞

Xml 反序列化到对象,反射到类型

单例模式防止反射和反序列化

浅谈java反序列化工具ysoserial

PHP数组序列化和反序列化