ReflectASM-invoke,高效率java反射机制原理

前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制。反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多。但是在很多地方,作为未知通用判断的时候,不得不调用反射类型来保障代码的复用性和框架的扩展性。所以我们只能想办法优化反射,而不能抵制反射,那么优化方案,这里给大家推荐了ReflectASM。

一、性能对比

我们先通过简单的代码来看看,各种调用方式之间的性能差距。

ReflectASM-invoke,高效率java反射机制原理

ReflectASM-invoke,高效率java反射机制原理

public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"spring-common.xml"}); new InitMothods().initApplicationContext(ac); long now; HttpRouteClassAndMethod route = InitMothods.getTaskHandler("GET:/login/getSession"); Map map = new HashMap(); //-----------------------最粗暴的直接调用 now = System.currentTimeMillis(); for(int i = 0; i<5000000; ++i){ new LoginController().getSession(map); } System.out.println("get耗时"+(System.currentTimeMillis() - now) + "ms); //---------------------常规的invoke now = System.currentTimeMillis(); for(int i = 0; i<5000000; ++i){ Class<?> c = Class.forName("com.business.controller.LoginController"); Method m = c.getMethod("getSession",Map.class); m.invoke(SpringApplicationContextHolder.getSpringBeanForClass(route.getClazz()), map); } System.out.println("标准反射耗时"+(System.currentTimeMillis() - now) + "ms); //---------------------缓存class的invoke now = System.currentTimeMillis(); for(int i = 0; i<5000000; ++i){ try { route.getMethod().invoke(SpringApplicationContextHolder.getSpringBeanForClass(route.getClazz()), new Object[]{map}); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } System.out.println("缓存反射耗时"+(System.currentTimeMillis() - now) + "ms秒); //---------------------reflectasm的invoke MethodAccess ma = MethodAccess.get(route.getClazz()); int index = ma.getIndex("getSession"); now = System.currentTimeMillis(); for(int i = 0; i<5000000; ++i){ ma.invoke(SpringApplicationContextHolder.getSpringBeanForClass(route.getClazz()), index, map); } System.out.println("reflectasm反射耗时"+(System.currentTimeMillis() - now) + "ms); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpddpj.html