原文出处

一直以来都对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反射究竟消耗多少效率的更多相关文章

  1. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  2. 如何提高使用Java反射的效率?

    前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少 ...

  3. Java——反射三种方式的效率对比

    转载自:https://blog.csdn.net/aitcax/article/details/52694423 1 使用field(效率最高)             long start = S ...

  4. Java反射在JVM的实现

    1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段.这使反射成为构建灵活应用 ...

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

    前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...

  6. Java技术——Java反射机制分析

    )生成动态代理. 2. Java反射API 反射API用来生成在当前Java虚拟机中的类.接口或者对象的信息. Class类:反射的核心类,可以获取类的属性,方法等内容信息. Field类:Java. ...

  7. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  8. 浅析Java反射机制

    目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下: 1. 按光学中的反射,可以将java中的反射理解为“镜像”.有以下用途: Java反射 ...

  9. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

随机推荐

  1. 利用js添加class

    来来来,开篇点题. 分页应用.当在当前页时,分页的数字有个框之类的. 重要代码如下 <ul class="pagination"> <li><a hr ...

  2. eclipse配置汇总

    1.背景色调节 general->editor->texteditor->选中background RGB: 85 90 205 2.java vm参数设置 VmAguments中 ...

  3. Python: 字典列表: itemgetter 函数: 根据某个或某几个字典字段来排序列表

    问题:根据某个或某几个字典字段来排序Python列表 answer: 通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构 eg: rows = [ {'fna ...

  4. windows系统bat方式启动tomcat出现java.lang.OutOfmemoryError:PermGen Space 错误

    1.问题情景: 在部署项目时,将两个应用部署到同一个tomcat下,通过startup.bat启动服务时,控制台出现出现java.lang.OutOfmemoryError:PermGen Space ...

  5. 下载及安装selenium IDE

    安装方法1:可以从官方网站下载:http://seleniumhq.org/download/,但是由于selenium服务器在美国,中美的网络经常不稳定,经常会连接失败,导致下载不了 可以找一下se ...

  6. AtCoder Beginner Contest 086 D - Checker

    Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement AtCoDeer is thinking o ...

  7. ui-grid angularjs

    <pre name="code" class="html"><!--ui-grid css--> <link rel=" ...

  8. Python学习笔记之@classmethod与@staticmethod

    Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的 类方法 ,也可以是 @staticmethod 装饰的 静态方法 ,用的最多的还是不带装饰器的 实例方法 ,如果把这 ...

  9. linux查看内存free

    free 加参数-b/k//m/g,以b.k.m.g的大小显示结果,默认以k显示 [root@oldboy ~]# free total used free shared buffers cached ...

  10. Qt Designer中文入门教程

    Qt Designer窗口布局Layouts提供了四种布局方法,他们是: Vertical Layout 纵向布局Horizontal Layout 横向布局Grid Layout  栅格布局Form ...