Class cls = Class.forName(classPath); Object o = cls.newInstance(); System.out.println(cls);
//获取到无参构造器 Constructor constructor01 = cls.getConstructor(); System.out.println(constructor01); // public com.yang.reflection.Hero()
//获取到有参构造器 Constructor constructor02 = cls.getConstructor(String.class); System.out.println(constructor02); // public com.yang.reflection.Hero(java.lang.String) }
3. 反射调用优化
传统方式与反射的用时比较
传统方式:
1 2 3 4 5 6 7 8 9
publicstaticvoidm1(){ Hero hero = new Hero(); long start = System.currentTimeMillis(); for (int i=0;i<90000000;i++){ hero.playHero(); } long end = System.currentTimeMillis(); System.out.println("m1()耗时:" + (end-start)); // m1()耗时:5 }
反射:
1 2 3 4 5 6 7 8 9 10 11
publicstaticvoidm2()throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class cls = Class.forName("com.yang.reflection.Hero"); Object o = cls.newInstance(); long start = System.currentTimeMillis(); for (int i=0;i<90000000;i++){ Method playHero = cls.getMethod("playHero"); playHero.invoke(o); } long end = System.currentTimeMillis(); System.out.println("m2()耗时:" + (end-start)); // m2()耗时:12364 }
根据两个方法执行的结果可以看出,通过反射的方式调用方法是非常耗时的!
反射调用的优化
关闭访问检查
1 2 3 4 5 6 7 8 9 10 11 12 13
publicstaticvoidm3()throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class cls = Class.forName("com.yang.reflection.Hero"); Object o = cls.newInstance(); long start = System.currentTimeMillis(); for (int i=0;i<90000000;i++){ Method playHero = cls.getMethod("playHero"); //关闭访问检查 设为true playHero.setAccessible(true); playHero.invoke(o); } long end = System.currentTimeMillis(); System.out.println("m3()耗时:" + (end-start)); // m3()耗时:11708 }