如果我实现一个java类';使用反射的访问器?

如果我实现一个java类';使用反射的访问器?,java,reflection,Java,Reflection,不管在类中提供访问器是好是坏的OO实践,我想知道通过反射执行对对象特定属性的访问是否会降低性能(内存消耗或cpu时间) 您是否实现了这一点并执行了基准测试? 你知道有谁做过这样的基准测试吗 编辑: 由于一些评论表明性能下降是明显的,我修改了问题的标题,以表明我想知道使用反射实现访问器的影响有多大 编辑: 谢谢你的评论和回答。根据@Peter Lawrey的回答和@EJP的善意评论,这就是我的意思,我想知道你们中是否有人在我的问题之前实施了: package co.com.prueba.refle

不管在类中提供访问器是好是坏的OO实践,我想知道通过反射执行对对象特定属性的访问是否会降低性能(内存消耗或cpu时间)

您是否实现了这一点并执行了基准测试? 你知道有谁做过这样的基准测试吗

编辑:

由于一些评论表明性能下降是明显的,我修改了问题的标题,以表明我想知道使用反射实现访问器的影响有多大

编辑:

谢谢你的评论和回答。根据@Peter Lawrey的回答和@EJP的善意评论,这就是我的意思,我想知道你们中是否有人在我的问题之前实施了:

package co.com.prueba.reflection;

import java.lang.reflect.Field;

public class A {

private String s;


public void setS(String s){
    this.s=s;
}

public String getS(){
    return this.s;
}

public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {

    System.out.println("Invoking .setAccesible(true) ...");
    A secondA = new A();
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        Field f = secondA.getClass().getDeclaredField("s");
        f.setAccessible(true);
        f.get(secondA);
        long end = System.nanoTime();
        System.out.println((end - start));
    }

    System.out.println("Without invoking .setAccesible(true) ...");
    A firstA = new A();     
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        Field f = firstA.getClass().getDeclaredField("s");          
        f.get(firstA);
        long end = System.nanoTime();
        System.out.println((end - start));
    }

    System.out.println("Invoking the getter ...");
    A thirdA = new A();
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        thirdA.getS();
        long end = System.nanoTime();
        System.out.println((end - start));
    }


}
package co.com.prueba.reflection;
导入java.lang.reflect.Field;
公共A类{
私有字符串;
公共无效集(字符串s){
这个.s=s;
}
公共字符串get(){
归还这个.s;
}
公共静态void main(字符串[]args)引发IllegalAccessException,NoSuchFieldException{
System.out.println(“Invoking.setAccessible(true)…”;
第二个A=新的A();
对于(int i=0;i我认为这基本上回答了您关于性能的问题。希望这能帮助您获得一些关于基准值的信息。它有一些外部链接,如IBM-,其中讨论了基准值。

它比以前更好了(我认为是在1.4之前),但仍然比直接访问变量慢。我相信这是因为必须将类和所有属性加载到内存中,然后在列表中搜索所需的属性


建议直接访问变量(或至少是was)谷歌在进行android开发时减少了虚拟方法调用。

在一台典型的机器上,通过反射调用getter的成本约为3纳秒。setter基本相同。由于getter可以内联,甚至可以在没有反射的情况下删除,因此相对差异很大

3个ns对你有多大影响


我在昨天的回答中提供了一个代码示例和结果

为了获得其他人谈论的最小性能影响,请务必了解这只涉及对已存在的
方法
对象的反射调用。如果在每次调用中都进行查找,则性能影响是巨大的

反射总是很慢的。当然,反射总是很慢的d不仅仅是访问变量。它还带来了许多其他问题,比如编译时没有验证访问的一致性。访问器(getter和setter)到底是什么意思不是反射。请向我们展示一些示例代码,以便我们确切了解您的意思。使用反射的两个基本法则:1.程序员总是认为它很酷。2.我几乎总是一个坏主意。@assylias Allot,但直接调用的程度不同。在代码预热之前,如果使用setAccessib,成本接近500纳秒le(对)和1500纳秒(如果你不知道的话)@PeterLawrey这是我实现的基础。