Java 反射性能

Java 反射性能,java,reflection,Java,Reflection,我有一个集合,其中有一到100个特定类型的对象。这些对象具有100多个属性。我必须遍历集合中的所有对象,并检查特定的属性,以便对它们进行处理。实际的方法取决于属性文件,因此我无法事先知道必须调用哪一个。我是这样反省的: for (MyObject mo : myObjectList){ for (PropertyDescriptor propertyDescriptor : Introspector .getBeanInfo(mo.get

我有一个集合,其中有一到100个特定类型的对象。这些对象具有100多个属性。我必须遍历集合中的所有对象,并检查特定的属性,以便对它们进行处理。实际的方法取决于属性文件,因此我无法事先知道必须调用哪一个。我是这样反省的:

for (MyObject mo : myObjectList){

    for (PropertyDescriptor propertyDescriptor : Introspector
                        .getBeanInfo(mo.getClass())
                        .getPropertyDescriptors()) {

        method = propertyDescriptor.getWriteMethod();

        if (method != null){
            //Here I check if the attribute is in the properties file and do the job
        }

    }
}
这是在由多个应用程序调用的Web服务中实现的,理论上负载可能很高

反射方法在计算机上很昂贵,但如果明天任务处理了一个新属性,那么它是唯一一种不改变代码就能完成任务的方法

我已经读到(不记得源代码)反射最昂贵的部分是寻找方法而不是调用方法,所以我一直在想,也许反转循环(即寻找方法,然后对每个对象通过反射调用方法)是一种性能方面的改变。大概是这样的:

for (PropertyDescriptor propertyDescriptor : Introspector
                        .getBeanInfo(MyObject.getClass())
                        .getPropertyDescriptors()) {

    if (method != null){
       for (MyObject mo : myObjectList){
         //Do the job here
       }
    }

}
是否有任何理由可以反转回路?

您是否实际测量了该回路的性能?我怀疑与Web服务的网络和编组开销相比,这种影响可以忽略不计


如果您真的认为这是一个问题,您是否可以提前为对象检索
方法
对象(或者至少在需要时以惰性方式执行此操作并缓存以供以后使用。我注意到Sotirios在上面的评论,如果是这样,缓存可能是多余的)

请注意,
Method
Field
实例通常是缓存的,因此只有第一次检索是昂贵的。经过测试,我认为您是对的。更改循环顺序对webservice响应时间的影响最小。通过测试,在最坏的情况下,反向循环似乎更具时间效率,但时间非常相似,需要进行更深入的测试来验证。谢谢:)