`
chong_zh
  • 浏览: 72291 次
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Java反射的性能问题及其常见的处理方法

 
阅读更多
调用Java的反射API是有较高的性能开销的,这方面的性能比较文章较多,在此不赘述。

原因
纠其原因,性能的开销主要在两方面:
1.产生了Dynamic Resolve
无论是通过字符串获取Class、Method还是Field,都需要JVM的动态链接机制动态的进行解析和匹配,势必造成性能开销。

2.安全性验证
每一次的反射调用都会造成Java安全机制进行额外的安全性验证,造成性能开销。

3.影响运行时优化
反射代码使得许多JVM的运行时优化无法进行。


处理方法
针对此,常见的处理方法主要有以下几种:

1.使用Cache
针对上述原因1: 对通过反射调用获得的Class、Method、Field实例进行缓存,避免多次Dynamic Resolve。


2.使用MethodHandle类
针对上述原因2:Java 7开始提供了java.lang.invoke.MethodHandle类,MethodHandle类的安全性验证在获取实例时进行而不是每次调用时都要进行验证,减小开销。

3.使用Runtime创建的类
该方法最为强大,可以针对上述原因1、2、3进行全面优化。具体做法为:
  • 在编译时设计好一个接口,由该接口封装所有的反射调用。
  • 在运行时动态生成一个类实现该接口,该动态生成的类一旦完成define就和普通类没有区别,不需要后续的Dynamic Resolve,没有额外的安全性验证,也不会影响JVM的运行时优化。

该方法不能覆盖反射API的所有Use case,例如某个反射调用需要修改某实例的private字段,是无法动态生成一个合法的类这样去做的。

关于具体如何动态生成符合条件的类可以参考Javassit,本质上还是用到了Classloader截获技术,这种技术是有限制的,例如在安全性级别较高的Applet运行环境中就有很多使用限制。
分享到:
评论

相关推荐

    java反射机制文档及代码

    在本资料"java反射机制文档及代码"中,详细介绍了Java反射的基础知识和常见应用。 首先,反射的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的名称、包名、属性、构造器、...

    JAVA反射机制

    ### JAVA反射机制详解 #### 一、JAVA反射机制概述 **反射**是在1982年由Smith首次提出的概念,指的是程序有能力访问、检测并修改其自身的状态或行为。这一概念一经提出,便迅速引起了计算机科学领域的关注,并在多...

    java反射机制案例及源码

    `java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口可以让我们创建一个代理类,动态地实现接口并在运行时决定如何处理方法调用。例如,`Proxy.newProxyInstance()`方法可以创建代理对象,`...

    使用java反射机制实现java的深拷贝

    首先,我们需要了解Java反射的基本概念。反射是Java提供的一种动态类型能力,允许程序在运行时检查类、接口、字段和方法的信息,并能直接操作这些对象。通过`Class`类和`java.lang.reflect`包中的API,我们可以动态...

    Java中的反射

    Class类是Java反射的入口,每个类在内存中都有一个对应的Class对象。通过Class对象,我们可以获取到类的信息,如类名、包名、父类、接口、构造器、方法和字段等。常见的Class对象获取方式有:`Class.forName("全...

    Java反射相关学习

    下面将详细介绍Java反射的概念、作用及其常见用法。 ### 1. 反射概念 Java反射是指在运行时,程序能够获取自身的信息(如类名、方法名、参数类型等)并能够动态调用对象的方法或访问其属性。这种能力使得Java具有...

    java反射规范--java资源

    Java反射提供了一种强大的机制来处理类和对象,使得程序能够在运行时动态地获取类的信息并对其进行操作。虽然反射提供了一些非常有用的特性,但也存在一些潜在的问题,比如性能开销较大、安全性问题等。因此,在使用...

    Java反射机制测试Demo

    下面我们将深入探讨Java反射机制及其在实际开发中的应用。 首先,`Class`对象是反射的基础,每个类在内存中都有一个对应的`Class`对象,通过这个对象我们可以获取到类的所有信息,包括类名、访问修饰符、父类、接口...

    java常见问题 .

    Java概述及应用领域 - Java是一种广泛使用的面向对象编程语言,由Sun Microsystems(现为Oracle公司的一部分)在1995年发布。 - Java在企业级应用开发、移动应用开发(特别是Android应用)、桌面应用以及嵌入式系统...

    java性能优化集锦

    内存泄漏是性能优化的重要部分,文件可能列举了常见的内存泄漏原因及解决办法,如: 1. **静态集合类引用导致的内存泄漏**:确保不再使用的对象从静态集合中移除。 2. **单例模式中的资源未正确关闭**:确保单例模式...

    Java反射与内省-PPT

    Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...

    Java面试题大全(整理版)1000+面试题 (面试准备+Java基础+高级特性+常见问题+答案解析)

    这份全面的面试题资源包含了Java的各个方面,包括但不限于基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、反射、设计模式、JVM优化等。面试准备时,这些知识点都是不可或缺的。 对于MyBatis的...

    Java常见问题集锦 _Java常见问题集锦_

    Java是一种广泛使用的面向对象的编程...这个Java常见问题集锦包含了众多在编程实践中可能遇到的问题及其解决方案,无论你是初学者还是经验丰富的开发者,都可以从中受益。持续学习和实践,是成为Java大师的必经之路。

    java反射知识总结

    ### Java反射知识总结 #### 一、反射的概念与意义 反射是Java中一项非常重要的特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象、调用方法等。这种能力使得Java程序具有了极大的灵活性,特别...

    常见的Java面试问题及其答案

    ### 常见的Java面试问题及其答案 #### 1. Java的主要特性 Java作为一种广泛使用的编程语言,具有以下几个核心特性: - **面向对象**:Java支持面向对象编程的三大特性——封装、继承和多态。面向对象的思想有助于...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    通过深入学习和熟练掌握Java反射机制,开发者能够更好地应对复杂的需求,提升代码的灵活性,同时也为解决某些特定问题提供了可能。本教程提供的内容只是一个起点,学习反射还需要实践和经验积累。希望这个教程能帮助...

    Java常见笔试、面试题目深度剖析

    3. **异常处理**:Java的异常处理机制是面试中常见的考察点,包括try-catch-finally语句块,throw和throws关键字,自定义异常等。 4. **集合框架**:Java集合框架包括List、Set、Queue、Map等接口和实现类,如...

    Java面试重点详解及常见难题

    内容概要:本文档详细梳理了Java面试中常见和技术难度较高的题目,涵盖Java基础知识(如封装、继承、反射)、集合框架区别比较、并发编程机制、JVM性能优化、Spring框架核心概念以及数据库操作等相关知识点。...

Global site tag (gtag.js) - Google Analytics