javaの反射速度を上げる方法method.setAccess ible(true)

4460 ワード

転載:http://huoyanyanyi10.iteye.com/blog/1317614
 
javaの反射速度を上げる方法method.setAccess ible(true) 
package com.chenshuyi.test;

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 setAccess ible(true):250 明らかにAccess ibleは標識方法で訪問できるものではないです。publicの方法Access ibleはfalseです。 
method.setAccess ibleを使って性能を20倍に向上させました。 Access able属性はAccess ible Objectクラスから継承されます。機能はセキュリティチェックを有効または無効にします。 
JDK APIにおける解釈 
Access ible Object類はField、Method、およびContstructオブジェクトのベースクラスです。反射されたオブジェクトを使用時にデフォルトのJava言語アクセス制御チェックをキャンセルする能力を提供します。パブリックメンバ、デフォルト(パッケージ)アクセスメンバー、保護されたメンバ、およびプライベートメンバについては、それぞれField、MethodまたはContstructorオブジェクトを使用してフィールド、呼び出し方法を設定または取得したり、またはクラスの新しいインスタンスを作成したり、初期化したりするときにアクセスチェックを実行します。 反射対象にaccessibleフラグを設定すると、Java Object Serializationや他の耐久性機構などの十分な特権を持つ複雑なアプリケーションが、ある種の通常禁止された方法でオブジェクトを操作することができる。 setAccess ible public void setAccess ible throws Security Exception このオブジェクトのaccessibleフラグを示すブール値に設定します。値がtrueであれば、反射対象はJava言語のアクセスチェックをキャンセルするべきです。値がfalseであれば、反射の対象がJava言語アクセス検査を実施すべきであることを示している。 実際にsetAccess ibleは、アクセスセキュリティチェックを有効または無効にするスイッチです。trueのためにfalseにアクセスできるわけではありません。 JDKの安全検査は時間がかかりますので、setAccess ibleで安全検査をオフにすれば反射速度を上げることができます。 
転載先:https://www.cnblogs.com/fanguangdexiaoyuer/p/6548171.html