java反射究竟消耗多少效率
一直以来都对Java反射究竟消耗了多少效率很感兴趣,今晚总算有空进行了一下测试
测试被调用的类和方法
package com.spring.scran;
public class TestMethod {
public void test() {
for(int i = 0 ; i < 10; i ++) {
System.out.print("");
}
}
/**
* 下面几个方法没什么用的,就放着模拟几个类
*/
public void test2() {
for(int i = 0 ; i < 10000; i ++) {
System.out.print("");
}
}
public void test3() {
for(int i = 0 ; i < 10000; i ++) {
System.out.print("");
}
}
public void test4() {
for(int i = 0 ; i < 10000; i ++) {
System.out.print("");
}
}
}
测试方法的类
package com.spring.aop.test;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.spring.scran.TestMethod;
public class TestXiao {
private long start;
private int methodCount = 10000000;
private static Map<String, Method> map = new HashMap<>();
@Before
public void before(){
start = System.currentTimeMillis();
}
@After
public void after() {
System.out.println(System.currentTimeMillis() - start);
}
/**
* 普通方法
*/
@Test
public void test1() {
TestMethod method = new TestMethod();
for(int i = 0 ; i < methodCount ; i ++) {
method.test();
}
}
/**
* 反射执行方法
* @throws Exception
*/
@Test
public void test2() throws Exception{
TestMethod method = new TestMethod();
for(int i = 0 ; i < methodCount ; i ++) {
method.getClass().getMethod("test").invoke(method);
}
}
/**
* 模拟将反射得到的 Method 方法放到缓存中
* @throws Exception
*/
@Test
public void test3() throws Exception{
TestMethod testMethod = new TestMethod();
for(int i = 0 ; i < methodCount ; i ++) {
Method method = map.get("test");
if(method != null) {
method.invoke(testMethod);
} else {
method = testMethod.getClass().getMethod("test");
map.put("test", method);
method.invoke(testMethod);
}
}
}
}
测试结果
普通方法 反射方法 反射加模拟缓存
第一次 8730 10368 9111
第二次 8833 10402 9184
第三次 8893 10290 9057
根据测试结果来看,可以看出普通执行的方法确实是比反射快点,当然,这真是一个简单的测试,当反射次数越多,消耗的性能肯定就越大
同时可以看到如果把反射得到的 method 放到缓存中,那么反射执行就和普通方法差不多了,所以尽可能的把Method 放到缓存中。
总结:
反射多少会有性能损耗,但一般可以忽略,而java对javabean方面的反射支持,java底层都有PropertyDescriptor和MethodDescriptor支持,可以一定程度的减少反射消耗。 AOP方面,cglib是通过类的字节码生成其子类去操作的,一旦子类生成就是纯粹的反射调用,不再操作字节码了,而一般AOP调用是在单例上,不会频繁的去用cglib生成子类。
反射用得最多的应该就是赋值注入,像数据库表映射为JavaBean等。
反射多少会有性能损耗,但一般可以忽略,而java对javabean方面的反射支持,java底层都有PropertyDescriptor和MethodDescriptor支持,可以一定程度的减少反射消耗。 AOP方面,cglib是通过类的字节码生成其子类去操作的,一旦子类生成就是纯粹的反射调用,不再操作字节码了,而一般AOP调用是在单例上,不会频繁的去用cglib生成子类。
反射用得最多的应该就是赋值注入,像数据库表映射为JavaBean等。
绝大部分系统的性能瓶颈还远远没有到需要考虑反射这里,逻辑层和数据层上的优化对性能的提升比优化反射高n个数量级。
框架的设计是性能、标准和开发效率等多个方面的权衡。
java反射究竟消耗多少效率的更多相关文章
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
- 如何提高使用Java反射的效率?
前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少 ...
- Java——反射三种方式的效率对比
转载自:https://blog.csdn.net/aitcax/article/details/52694423 1 使用field(效率最高) long start = S ...
- Java反射在JVM的实现
1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段.这使反射成为构建灵活应用 ...
- ReflectASM-invoke,高效率java反射机制原理
前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...
- Java技术——Java反射机制分析
)生成动态代理. 2. Java反射API 反射API用来生成在当前Java虚拟机中的类.接口或者对象的信息. Class类:反射的核心类,可以获取类的属性,方法等内容信息. Field类:Java. ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- 浅析Java反射机制
目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下: 1. 按光学中的反射,可以将java中的反射理解为“镜像”.有以下用途: Java反射 ...
- java反射机制浅谈
一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
随机推荐
- SSRS创建复合型图表
SSRS创建复合型图表 1.添加报表数据对应代码: if object_id('tb') is not null drop table tb; go CREATE TABLE tb(yearid in ...
- mysql事务(二)——控制语句使用
事务控制 一般来说,mysql默认开启了事务自动提交功能,每条sql执行都会提交事务.可以使用如下语句关闭事务自动提交功能. show session variables like 'autocomm ...
- 每天一个Linux命令(1)ls命令
ls是list的缩写,ls命令是Linux系统下最常用的命令之一. ls命令用于打印当前目录的清单,如果指定其它目录,那么就会显示其他目录的文件及文件夹的清单. 通过ls 命令还可以查看文件其它的详细 ...
- js 变量 作用域及内存
由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...
- 使用Astah画UML类图经验总结
从学习需求工程与UML开始,就开始接触到Astah这款软件,但是当时完全是为了对UML各种图的了解加深才使用了这款软件.当时画图,都是完全凭借自己想,并没有考虑实际情况,而且画的图都是很简单的,甚至有 ...
- 关于Spring中,定时任务执行两次的解决办法
原因:如果spring-quartz.xml文件,在Spring的配置文件spring-config.xml中被加载,那么定时任务会被Spring和SpringMVC扫描两次,所以会被执行两次. 解决 ...
- PowerDesigner 教程
摘自:http://www.cnblogs.com/advocate/p/3730027.html 目标:本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 ...
- SNMP学习笔记之SNMPWALK 安装与使用详解
0x00 简介 snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户.通过snmpwalk也可以查看支 ...
- django multidb --- router
之前一篇随笔, 提到了django中怎么使用多数据库, 但是在实际工程中遇到了一个问题,就是admin指定了使用某库, 在测试环境上没问题, 当部署后(库也变动了位置), 修改一个admin的mode ...
- 20145216史婧瑶《网络对抗》Web安全基础实践
20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些 ...