hotspot/src/share/vm/prims/jvm.cpp
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
{
{- -------------------------------------------
(1) (トレース出力) (See: JVMWrapper)
---------------------------------------- -}
JVMWrapper("JVM_GetClassDeclaredMethods");
{- -------------------------------------------
(1) (JVMTI のフック点) (See: VMObjectAlloc イベント)
---------------------------------------- -}
JvmtiVMObjectAllocEventCollector oam;
{- -------------------------------------------
(1) プリミティブ型用のクラスや配列クラスの場合は,
(メソッドは存在しないので) 空の配列をリターン.
---------------------------------------- -}
// Exclude primitive types and array types
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
|| Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
// Return empty array
oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res);
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
{- -------------------------------------------
(1) instanceKlass::link_class() を呼んで, (もし処理対象のクラスが link されていなければ) link しておく.
---------------------------------------- -}
// Ensure class is linked
k->link_class(CHECK_NULL);
{- -------------------------------------------
(1) メソッドの個数を数える (結果は num_methods 変数に格納).
(なお <init> は除く. また publicOnly 引数が true の場合には, public でないメソッドも除く)
---------------------------------------- -}
objArrayHandle methods (THREAD, k->methods());
int methods_length = methods->length();
int num_methods = 0;
int i;
for (i = 0; i < methods_length; i++) {
methodHandle method(THREAD, (methodOop) methods->obj_at(i));
if (!method->is_initializer()) {
if (!publicOnly || method->is_public()) {
++num_methods;
}
}
}
{- -------------------------------------------
(1) oopFactory::new_objArray() を呼んで, 返値としてリターンするための objArray を確保する.
---------------------------------------- -}
// Allocate result
objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), num_methods, CHECK_NULL);
objArrayHandle result (THREAD, r);
{- -------------------------------------------
(1) 処理対象のクラスのメソッドを示す java.lang.reflect.Method オブジェクトを作成し,
確保した objArray の中に格納していく.
---------------------------------------- -}
int out_idx = 0;
for (i = 0; i < methods_length; i++) {
methodHandle method(THREAD, (methodOop) methods->obj_at(i));
if (!method->is_initializer()) {
if (!publicOnly || method->is_public()) {
oop m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
result->obj_at_put(out_idx, m);
++out_idx;
}
}
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(out_idx == num_methods, "just checking");
{- -------------------------------------------
(1) 結果をリターン
---------------------------------------- -}
return (jobjectArray) JNIHandles::make_local(env, result());
}
JVM_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.