使用反射而不是调用类构造函数创建对象是否会导致任何显著的性能差异?

推荐答案

Yes - absolutely.通过反射查找一个类要比by magnitude更昂贵.

引用Java's documentation on reflection:

由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化.因此,与非反射操作相比,反射操作的性能较低,应该避免在对性能敏感的应用程序中频繁调用的代码段中使用反射操作.

下面是一个简单的测试,我用5分钟在我的机器上运行Sun JRE 6u10:

public class Main {

    public static void main(String[] args) throws Exception
    {
        doRegular();
        doReflection();
    }

    public static void doRegular() throws Exception
    {
        long start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++)
        {
            A a = new A();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public static void doReflection() throws Exception
    {
        long start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++)
        {
            A a = (A) Class.forName("misc.A").newInstance();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}

根据这些结果:

35 // no reflection
465 // using reflection

请记住,查找和实例化是一起完成的,在某些情况下可以重构查找,但这只是一个基本示例.

即使只是实例化,您仍然会受到性能的影响:

30 // no reflection
47 // reflection using one lookup, only instantiating

再说一遍,YMMV.

Java相关问答推荐

Java FFM,如何将Java对象与C struct 链接起来?

让两个方法来回调用有缺点吗?

在Keycloak测试容器中的测试之间清理数据库

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

为什么Java中的两个日期有差异?

springboot start loge change

这是什么Java构造`(InputStream Is)->;()->;{}`

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

为什么Collectors.toList()不能保证易变性

基于配置switch 的@Controller的条件摄取

为什么在下面的Java泛型方法中没有类型限制?

try 在两个不同数组的数字之间求平均值

记录是类的语法糖吗?

Java HashMap保留所有时间复杂性

如何在Java中的重写方法参数中强制(Enum)接口实现?

Kotlin-仅替换字符串中最后一个给定的字符串

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

Java中的一个错误';s stdlib SocksSocketImpl?

如何判断元素计数并在流的中间抛出异常?

Java泛型方法重载