我们的日常使用中,Java new是用的最多的,但是有些框架往往会使用Java反射来实现灵活性,那么它们之间的效率有什么区别呢?
你有没有想过,什么时候应该该用new来创建对象,什么时候该使用反射呢?
两者之间创建对象的效率如何?
ReflectDemo reflectDemo = new ReflectDemo();
ClassreflectDemoClass = ReflectDemo.class;
Class> aClass = Class.forName ("com.jason.sample.ReflectDemo");
Class extends Class> aClass = reflectDemoClass.getClass ();
public class ReflectDemo {
public static void main (String[] args) throws IllegalAccessException, InstantiationException {
proxyObject();
newObject();
}
public static void newObject(){
long startTime = System.currentTimeMillis ();
int i;
for (i = 0; i < 100000000; i++) {
ReflectDemo reflectDemo = new ReflectDemo ();
}
if (i == 100000000) {
long endTime = System.currentTimeMillis ();
System.out.println ("new time:" + (endTime - startTime));
}
}
public static void proxyObject() throws IllegalAccessException, InstantiationException {
long startTime = System.currentTimeMillis ();
ClassreflectDemoClass = ReflectDemo.class;
int i;
for (i = 0; i < 100000000; i++) {
ReflectDemo reflectDemo = reflectDemoClass.newInstance ();
}
if (i == 100000000) {
long endTime = System.currentTimeMillis ();
System.out.println ("reflection time:" + (endTime - startTime));
}
}
}
new time:3
reflection time:230
最后我们发现新建1亿个对象和反射创建1亿个对象的效率相差很多倍。
那么让我们来探讨一下为什么会有如此大的差异。
一般来说,我们的Java代码需要在虚拟机上编译运行。
一般通过前端编辑器将java文件转换成class文件,比如javac.
接下来,在程序执行期间,JIT(即时编译器)可以将字节码文件转换为计算机可识别的机器码文件。另一种方式是通过 AOT 编译器直接将 java 文件编译成本地机器码文件。其中JIT会在程序运行时对程序进行优化,但是反射是通过动态分析的,所以可能无法对Java虚拟机进行一些优化。
总结起来有以下几个原因:
综上所述,Java反射比使用new关键字创建对象的性能差,因为反射需要在运行时进行更多的操作,包括动态解析类信息、查找并调用构造函数、进行安全性检查和进行额外的初始化工作等。在性能要求较高的场景中,应该尽可能地避免使用反射创建对象,而尽量使用new关键字进行对象创建。
反射的一些使用场景
网站标题:Java反射和Javanew的效率有什么区别,亲测相差100倍
网站URL:http://www.csdahua.cn/qtweb/news49/326749.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网