很久以前,我正在使用反射创建一个迷你ORM.
在阅读反思时,我得到了类似的答案:
Java反射性能
这是完全有意义的,我退出我的迷你orm并锐化我的CTRL + C,CTRL + V键(lib旨在避免不得不一次又一次地重写我正在处理的Web应用程序中不同表的相同片段)
多年后由于某种原因,我现在不记得(也不想记得)我正在阅读(或试图...)Hibernate源代码,因为我想知道他们是否使用AOP动态生成代码并避免反思惩罚,但令我惊讶的是,我所看到的只是纯粹的反思.
这是否意味着最受欢迎的ORM框架,确切地说是几年前我不鼓励我继续我的天真努力?:")
我的问题是:有人可以确认我对Hibernate实现的理解吗?他们是否会动态生成字节码以提高性能?或者我们(当我们使用它时)总是支付反射惩罚(顺便说一句,如果差异是在某些ms,我们没有人注意到或抱怨)
我们是否支付反思罚款?如果我们是,我认为这是值得的!
问候.
我认为重要的是要记住整个应用程序的相对成本.反射比普通对象创建慢吗?是.反射变得越来越快了吗?是.但是,在比较反射成本与线路上的成本并对数据库做一些事情时,这些点并不是非常重要,这就是hibernate的作用 - 成本完全可以忽略不计,我说我们不付出代价.
Hibernate使您的模型具有休眠意识.
使用Reflection有不同程度的成本.不断地查找特定类的方法特别昂贵.使用缓存副本通过反射执行方法并不是那么慢.如果考虑到反射api必须完成的任务来调用方法,那么每个部分都很慢并且消耗cpu周期都是有意义的.
访问特定课程的每个方法
测试每个方法可见性,方法签名等.
为找到的方法生成字节码.
典型类中的方法数量中的一个因素并且这些操作中的一些不是微不足道的,显然这可能是昂贵的.
每个反射方法都相当于一些字节代码,它使用一些样板来调用目标方法以匹配反射接口.在它可以做到这一点之前,它必须执行一些健全性检查,以便它可以抱怨好消息,而不是让运行时抛出ClassCastException和类似的异常.
如果实例方法检查传入的实例是否为null并且是正确的类型.
检查参数参数包括正确的参数数量和类型.
在try catch中执行该方法.在投掷ITE等
所有这些额外的东西增加了一些成本 - 不是很多,但它确实使事情变得更慢.
在一般的缓存方法和调用不成本,但有点慢.反射api本身会尝试缓存方法和类,但找到正确的方法等仍然是一个缓慢的操作.