我需要给100w个对象使用反射来进行赋值操作,发现占用时间有1分多,怎么可以提高呢?
反射本身速度是jvm决定的,没有办法,优化,但是为什么你要100万个对象,这个设计是可以优化的。
首先,你不一定真的需要那么多对象,其次你不一定需要调用那么多次反射。
你可以看到java自己的设计,有很多办法可以减少对象的使用,比如说“常量池”,将那些值相同的字符串共享唯一的对象实例。
如果你的对象是不可变的(immutable),你完全可以借鉴这个思路,相同的对象,只引用同一个实例。如果需要修改对象,因为是不可变的,所以它只能指向新的对象,而不会改变它,因此不会破坏共享的其它对象的状态。
如果你想设计不可变的对象,只要封闭所有的set方法,而只能在构造函数中初始化对象就可以了。
另一个是懒惰加载(lazy load),也就是说,你用不着一次性创建全部的对象,比如你100万个对象代表一个地图上100万个坐标或者形状,那么实际上你只要加载显示区域内的那些就可以了。在用户滚动的时候再加载别的。
还有,你可以通过对象的序列化和反序列化以及内存拷贝代替反射。
1分多应该不是反射引起的吧? 是否中间有循环操作数据库,或者其他算法导致?
这个例子很快的参考下:https://www.zhihu.com/question/30097357
反射由于jvm的编译器没有办法对代码进行优化,所以天然的速度就是慢,并且也没有看到你的代码的信息,无法提出改进意见。
如果有大量的相同的类型,可以缓存Field对象,不用每次都去取,可以节省很多时间
jdk1.8对反射做了优化,反射已经很快了。需要1分钟是100W数据赋值的时间吧,可以考虑100W对象异步赋值
可以考虑多线程,并且把反射的结果作为静态变量缓存,
100W的对象通过反射赋值,我猜测你可能数据源是json或者Map或者别的结构化数据。如果反射慢,你还不如new对象,通过if else来给字段赋值。毕竟程序性能的优先级要大于代码优雅的优先级(观感上的优雅)
我做过测试当循环调用1亿次invoke方法也不过才耗时2秒左右,因为你的代码应该需要从其他方面进行优化,如果说非要对反射做优化的话,你可以将反射对象做下缓存,不过相比你耗时几分钟来说这只是微乎其微