jvm 为什么使用本地代码实现java中的反射

5lhxktic  于 2022-11-07  发布在  Java
关注(0)|答案(1)|浏览(139)

最近我在阅读JDK 19(JDK 8,11,12的反射代码好像没变,所以任何版本都可以)关于反射的源代码.关键要像这样在C++类reflection.cpp中得到类Reflection::invoke_method的方法:

oop mirror             = java_lang_reflect_Method::clazz(method_mirror);

获取类示例,如下所示:

InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));

我发现本地代码通过使用JNI来调用java类来获得类。为什么要使用本地代码来实现反射?本地代码实现反射的优势是什么?我在谷歌上搜索了一下,发现没有人谈论这个。
PS:我也读过反射可以用bytecode通过Java实现。

v440hwme

v440hwme1#

其实JVM团队已经告诉你答案了,从ReflectionFactory.java里的注解中,这个注解是这样的:

//
    // "Inflation" mechanism. Loading bytecodes to implement
    // Method.invoke() and Constructor.newInstance() currently costs
    // 3-4x more than an invocation via native code for the first
    // invocation (though subsequent invocations have been benchmarked
    // to be over 20x faster). Unfortunately this cost increases
    // startup time for certain applications that use reflection
    // intensively (but only once per class) to bootstrap themselves.
    // To avoid this penalty we reuse the existing JVM entry points
    // for the first few invocations of Methods and Constructors and
    // then switch to the bytecode-based implementations.
    //
    // Package-private to be accessible to NativeMethodAccessorImpl
    // and NativeConstructorAccessorImpl

这就是为什么我们需要本机反射。

相关问题