Java 反射源码学习之旅( 三 )


this.asm = new ClassFileAssembler(var10);
var10.trim();
//拿出构造好的字节数组(就是字节码文件的格式)
final byte[] var17 = var10.getData();
return (MagicAccessorImpl)AccessController.doPrivileged(new PrivilegedAction<MagicAccessorImpl>() {
public MagicAccessorImpl run() {
try {
//调用native方法 , 创建ConstructorAccessorImpl类的实例
//最后ConstructorAccessorImpl实例还是会被传给newInstance0()这个native方法 , 以此来构造最终的目标类实例
return (MagicAccessorImpl)ClassDefiner.defineClass(var13, var17, 0, var17.length, var1.getClassLoader()).newInstance();
} catch (IllegalAccessException | InstantiationException var2) {
throw new InternalError(var2);
}
}
});
}
}
4 小结
最后根据上述学习思考下 Java 反射到底慢不慢这个问题 。首先可以看到 JDK 为 “反射时创建对象的过程” 提供了两套实现 , native 版本更快但是也使得 JVM 无法对其进行一些优化(譬如 JIT 的方法内联) , 当方法成为热点时 , 转用 Java 版本来进行实现则优化了这个问题 。但 Java 版本的实现过程中需要动态生成字节码 , 还要加载一些额外的类 , 造成了内存的消耗 , 所以使用反射的时候还是应当注意一些是否会因为使用过多而造成内存溢出 。
一次不成熟的源码学习历程 , 如有错误还请指正 。
参考资料:
https://rednaxelafx.iteye.com/blog/548536
 

作者:京东物流 秦曌怡
来源:京东云开发者社区




推荐阅读