Top


定義場所(file name)

hotspot/src/share/vm/prims/jvm.cpp

名前(function name)

JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
{

本体部(body)

  {- -------------------------------------------
  (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.