Java反射获取实例的速度对比分析
之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里。代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(className).getDeclaredConstructor().newInstance()获取实例对象。
后来同事看到了代码,对这个HashMap里存储方式提出了建议,之前的Map是
后来我测试了一下两者实例化一个对象的速度:
publicstaticvoidmain(String[]args){ try{ intMAX=100000; for(intcount=0;count<50;count++){ System.out.println("====第"+count+"次"); longs1=System.currentTimeMillis(); for(inti=0;i输出:
====第39次1_duration:722_duration:3====第40次1_duration:792_duration:12====第41次1_duration:922_duration:8====第42次1_duration:802_duration:5
结论:
Map的value不存储全路径名,在初始化的时候Map的value直接存储Class对象,在反射过程中速度提升很大。
补充知识:java反射获取类实例并调用私有方法
我就废话不多说了,大家还是直接看代码吧~
publicclassTestReflect{//测试类 publicvoidmPublic(){//访问权限最大 System.out.println("publicrun"); } protectedvoidmProtected(){//同包下才能访问(实验对象) System.out.println("protectedrun"); } privatevoidmPrivate(){//只有本类中才能访问(实验对象) System.out.println("privaterun"); } }publicstaticvoidmain(String[]args)throwsException{ Class>class1=null; //反射获取类实例,用的最多的就是jdbc获取驱动的时候就是用Class.forName("xxx"); //一般采用这种形式 class1=Class.forName("com.xxx.TestReflect"); //class1=newTestReflect().getClass(); //class1=TestReflect.class; //类实例化,到这里就可以访问TestReflect类的public属性的成员方法和成员变量了 TestReflecttr=(TestReflect)class1.newInstance(); //通过java.lang.Class类得到一个Method对象 //api中java.lang.Class.getDeclaredMethod方法介绍 //返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。 Methodmethod=class1.getDeclaredMethod("mPrivate"); Methodmethod1=class1.getDeclaredMethod("mProtected"); //将此对象的accessible标志设置为指示的布尔值。 //值为true则指示反射的对象在使用时应该取消Java语言访问检查。 //值为false则指示反射的对象应该实施Java语言访问检查。 method.setAccessible(true); method1.setAccessible(true); //调用该方法 method.invoke(tr); method1.invoke(tr); }以上这篇Java反射获取实例的速度对比分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。