`
Leon.Wood
  • 浏览: 288217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]提高Java反射速度的方法以及对setAccessable的误解

阅读更多

mercyblitz 写道

ouchxp 写道

 

再就是在执行反射之前执行field.setAccessible(true); 也可以提高JDK反射效率

 

这样可以提高效率?这个方法仅仅设置访问标识,让不能访问的成员可以访问。

 

 

keating 写道

ouchxp 写道

再就是在执行反射之前执行field.setAccessible(true); 也可以提高JDK反射效率

 

正如楼上mercyblitz所说,如private变量...

 

 

 

在此澄清一下对于setAccessable的误解 

先看一个例子 

Java代码  

import java.lang.reflect.InvocationTargetException;   
import java.lang.reflect.Method;   
  
public class Main {   
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {   
        Method m = A.class.getDeclaredMethod("getName", new Class[]{});   
        System.out.println(m.isAccessible());   
                //getName是public的,猜猜输出是true还是false   
           
        A a = new A();   
        a.setName("Mr Lee");   
        long start = System.currentTimeMillis();   
        for(int i=0;i<10000000;i++){   
            m.invoke(a, new Object[]{});   
        }   
        System.out.println( "Simple              :" +(System.currentTimeMillis() - start));   
           
        m.setAccessible(true);//注意此处不同   
        long start1 = System.currentTimeMillis();   
        for(int i=0;i<10000000;i++){   
            m.invoke(a, new Object[]{});   
        }   
        System.out.println("setAccessible(true) :"+( System.currentTimeMillis() - start1));   
    }   
}   
class A{   
    private String name;   
    public String getName() {   
        return name;   
    }   
    public void setName(String name) {   
        this.name = name;   
    }   
} 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
 public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  Method m = A.class.getDeclaredMethod("getName", new Class[]{});
  System.out.println(m.isAccessible());
                //getName是public的,猜猜输出是true还是false
  
  A a = new A();
  a.setName("Mr Lee");
  long start = System.currentTimeMillis();
  for(int i=0;i<10000000;i++){
   m.invoke(a, new Object[]{});
  }
  System.out.println( "Simple              :" +(System.currentTimeMillis() - start));
  
  m.setAccessible(true);//注意此处不同
  long start1 = System.currentTimeMillis();
  for(int i=0;i<10000000;i++){
   m.invoke(a, new Object[]{});
  }
  System.out.println("setAccessible(true) :"+( System.currentTimeMillis() - start1));
 }
}
class A{
 private String name;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

 
 

 

测试结果

 

引用

 

false 

Simple              :4969 

setAccessible(true) :250

 

 

 

明显 Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false 

使用了method.setAccessible(true)后 性能有了20倍的提升

 

Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查

 

JDK API中的解释

 

引用

 

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。

 

在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。

 

setAccessible 

public void setAccessible(boolean flag) 

                   throws SecurityException 

将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

 

 

 

实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问

 

由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的

 

Over

分享到:
评论

相关推荐

    Java 反射创建get set方法及反射方法的调用

    ### Java反射创建get set方法及反射方法的调用 #### 概述 在Java编程语言中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。本文将...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    JAVA提高反射效率,Java代码精粹,高手实现,反射高效代码

    JAVA提高反射效率,Java代码精粹,高手实现,反射高效代码

    JAVA设计模式提高反射效率,Java代码精粹,高手实现,高效java代码,反射高效代码,绝对受益

    JAVA设计模式提高反射效率,Java代码精粹,高手实现,高效java代码,反射高效代码,绝对受益 JAVA设计模式提高反射效率,Java代码精粹,高手实现,高效java代码,反射高效代码,绝对受益 JAVA设计模式提高反射效率,...

    java转js工具

    - 单页应用(SPA)开发:利用Java代码的转换,可以将后端业务逻辑部分迁移到前端,提高交互性和响应速度。 - GWT(Google Web Toolkit):这是一个著名的Java到JavaScript转换框架,允许开发者用Java编写客户端...

    任意XML转实体类 实体类 转XML 方法 JAVA

    总结一下,XML转实体类和实体类转XML涉及的主要知识点有:Java反射API、XML解析(DOM、SAX、StAX、JAXB),以及对象的序列化和反序列化。在实际开发中,我们需要根据项目需求选择合适的工具和方法,确保数据的准确...

    java版amr文件转mp3

    Java版的AMR文件转MP3工具是一种编程解决方案,它利用特定的类库,如JAVE(Java Audio Video Encoder),将AMR编码的音频文件转换为MP3格式,以便于在Web上直接播放。AMR(Adaptive Multi-Rate)是主要用于语音编码...

    把wsdl文件转换成java类 使用wsdl2Java工具

    这个命令将根据WSDL文件生成一系列的Java类,包括服务接口、消息实体、异常类以及客户端代理类。你可以通过添加不同的选项来定制生成的代码,例如指定包名、启用抽象模式等。 4. **理解生成的代码**: 生成的Java类...

    Class文件转JAVA

    轻松方便的把class文件转化为java文件

    在java程序中实现wav文件转MP3

    在Java中调用这个外部工具,我们可以使用`Runtime.getRuntime().exec()`方法。 以下是`Wav2mp3.java`文件的主要代码逻辑: ```java import java.io.File; import java.io.FileInputStream; import java.io....

    Java 反射机制 - v1.0.pdf

    Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信 息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。

    音频格式转换(Java源码)

    这是一个用Java语言编写的音频转换源码。ConvertAudioFileFormat_Code.rar内是Myeclipse工程文件,导入Myeclipse即可调试使用。代码只演示了从wav转到Mp3,需要其他的类型的转换,请参考JAVE-Manual。

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java中main方法发送httpPost请求

    这里我们将深入探讨如何在Java的main方法中实现这个功能,以及相关的HTTP请求和响应处理。 首先,Java中发送HTTP POST请求通常会用到`HttpURLConnection`类或者第三方库如Apache HttpClient或OkHttp。下面我们将...

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    .net 与Java间RSA加密的转换

    1. 生成RSA密钥对:在.NET和Java中都应提供生成公钥和私钥的方法。 2. 导出和导入密钥:将密钥从.NET的XML格式转换为Java可读的DER或PEM格式,反之亦然。 3. 加密和解密:根据平台提供加密和解密的功能,确保在.NET...

    json转对象数组与对象数组转json --Java

    ### JSON转对象数组与对象数组转JSON(Java) 在Java编程语言中,处理JSON数据时经常需要进行JSON字符串与Java对象之间的转换。特别是在涉及到数组或集合的场景下,这种转换显得尤为重要。本文将详细介绍如何使用...

    java实现图片转换为视频

    总的来说,通过Java实现图片到视频的转换,开发者需要理解多媒体处理的基本原理,掌握相关库的使用,以及处理可能遇到的各种兼容性和性能问题。这个过程既锻炼了编程技能,也加深了对多媒体处理的理解。

    java 将amr转换为MP3文件

    amr MP3文件java 将amr转换为MP3文件

    java利用openoffice,把word,execl,ppt转成图片,

    Entry.java这个类的原理是先通过OfficeToPDF.java把文档转成pdf,然后再通过Pdf2Jpg.java这个类把PDF转成JPG或者PNG,想转成什么格式图片在Pdf2Jpg.java这个类当中设置一下,代码经过测试,完全没有问题,如果碰到...

Global site tag (gtag.js) - Google Analytics