Add AbstractMethod, Constructor, Method

Moves functionality to ART from libcore. Precursor to moving
ArtMethods to native. Mostly performance improvements.

N5 perf before (irrelevant results removed):
            Class_getConstructor  962.87 ===========
         Class_getDeclaredMethod 2394.37 ============================
                 Class_getMethod 2509.20 ==============================
               Class_newInstance 1999.81 =======================
                  Method_invokeI 1439.02 =================
          Method_invokePreBoxedI 1415.82 ================
            Method_invokeStaticI 1456.24 =================
    Method_invokeStaticPreBoxedI 1427.32 =================
            Method_invokeStaticV  814.47 =========
                  Method_invokeV  816.56 =========
After:
                       benchmark      ns linear runtime
            Class_getConstructor 1302.04 ================
         Class_getDeclaredMethod 1459.01 ==================
                 Class_getMethod 1560.40 ===================
               Class_newInstance 2029.94 =========================
                  Method_invokeI 1312.89 ================
          Method_invokePreBoxedI 1255.01 ===============
            Method_invokeStaticI 1289.13 ===============
    Method_invokeStaticPreBoxedI 1196.52 ==============
            Method_invokeStaticV  790.82 =========
                  Method_invokeV  791.73 =========

Performance improvements are more than just fixing regressions introduced
in: http://android-review.googlesource.com/#/c/146069/

Bug: 19264997

Change-Id: Ife79c469fdb09f30e3aefcfc3e0ce5ed32303fce
diff --git a/runtime/proxy_test.cc b/runtime/proxy_test.cc
index 6061f73..b471293 100644
--- a/runtime/proxy_test.cc
+++ b/runtime/proxy_test.cc
@@ -20,6 +20,7 @@
 #include "art_field-inl.h"
 #include "class_linker-inl.h"
 #include "common_compiler_test.h"
+#include "mirror/method.h"
 #include "scoped_thread_state_change.h"
 
 namespace art {
@@ -53,41 +54,34 @@
       mirror::ObjectArray<mirror::ArtMethod>* virtual_methods = interface->GetVirtualMethods();
       methods_count += (virtual_methods == nullptr) ? 0 : virtual_methods->GetLength();
     }
-    jclass javaLangReflectArtMethod =
-        soa.AddLocalReference<jclass>(mirror::ArtMethod::GetJavaLangReflectArtMethod());
-    jobjectArray proxyClassMethods = soa.Env()->NewObjectArray(methods_count,
-                                                               javaLangReflectArtMethod, nullptr);
+    jobjectArray proxyClassMethods = soa.Env()->NewObjectArray(
+        methods_count, soa.AddLocalReference<jclass>(mirror::Method::StaticClass()), nullptr);
     soa.Self()->AssertNoPendingException();
 
-    // Fill the method array
-    mirror::ArtMethod* equalsMethod = javaLangObject->FindDeclaredVirtualMethod("equals",
-                                                                                "(Ljava/lang/Object;)Z");
-    mirror::ArtMethod* hashCodeMethod = javaLangObject->FindDeclaredVirtualMethod("hashCode",
-                                                                                  "()I");
-    mirror::ArtMethod* toStringMethod = javaLangObject->FindDeclaredVirtualMethod("toString",
-                                                                                  "()Ljava/lang/String;");
-    CHECK(equalsMethod != nullptr);
-    CHECK(hashCodeMethod != nullptr);
-    CHECK(toStringMethod != nullptr);
-
     jsize array_index = 0;
-    // Adds Object methods.
-    soa.Env()->SetObjectArrayElement(proxyClassMethods, array_index++,
-                                     soa.AddLocalReference<jobject>(equalsMethod));
-    soa.Env()->SetObjectArrayElement(proxyClassMethods, array_index++,
-                                     soa.AddLocalReference<jobject>(hashCodeMethod));
-    soa.Env()->SetObjectArrayElement(proxyClassMethods, array_index++,
-                                     soa.AddLocalReference<jobject>(toStringMethod));
-
+    // Fill the method array
+    mirror::ArtMethod* method = javaLangObject->FindDeclaredVirtualMethod(
+        "equals", "(Ljava/lang/Object;)Z");
+    CHECK(method != nullptr);
+    soa.Env()->SetObjectArrayElement(
+        proxyClassMethods, array_index++, soa.AddLocalReference<jobject>(
+            mirror::Method::CreateFromArtMethod(soa.Self(), method)));
+    method = javaLangObject->FindDeclaredVirtualMethod("hashCode", "()I");
+    CHECK(method != nullptr);
+    soa.Env()->SetObjectArrayElement(
+        proxyClassMethods, array_index++, soa.AddLocalReference<jobject>(
+            mirror::Method::CreateFromArtMethod(soa.Self(), method)));
+    method = javaLangObject->FindDeclaredVirtualMethod("toString", "()Ljava/lang/String;");
+    CHECK(method != nullptr);
+    soa.Env()->SetObjectArrayElement(
+        proxyClassMethods, array_index++, soa.AddLocalReference<jobject>(
+            mirror::Method::CreateFromArtMethod(soa.Self(), method)));
     // Now adds all interfaces virtual methods.
     for (mirror::Class* interface : interfaces) {
-      mirror::ObjectArray<mirror::ArtMethod>* virtual_methods = interface->GetVirtualMethods();
-      if (virtual_methods != nullptr) {
-        for (int32_t mth_index = 0; mth_index < virtual_methods->GetLength(); ++mth_index) {
-          mirror::ArtMethod* method = virtual_methods->Get(mth_index);
-          soa.Env()->SetObjectArrayElement(proxyClassMethods, array_index++,
-                                           soa.AddLocalReference<jobject>(method));
-        }
+      for (int32_t i = 0, count = interface->NumVirtualMethods(); i < count; ++i) {
+        soa.Env()->SetObjectArrayElement(
+            proxyClassMethods, array_index++, soa.AddLocalReference<jobject>(
+                mirror::Method::CreateFromArtMethod(soa.Self(), interface->GetVirtualMethod(i))));
       }
     }
     CHECK_EQ(array_index, methods_count);
@@ -96,10 +90,9 @@
     jobjectArray proxyClassThrows = soa.Env()->NewObjectArray(0, javaLangClass, nullptr);
     soa.Self()->AssertNoPendingException();
 
-    mirror::Class* proxyClass = class_linker_->CreateProxyClass(soa,
-                                                                soa.Env()->NewStringUTF(className),
-                                                                proxyClassInterfaces, jclass_loader,
-                                                                proxyClassMethods, proxyClassThrows);
+    mirror::Class* proxyClass = class_linker_->CreateProxyClass(
+        soa, soa.Env()->NewStringUTF(className), proxyClassInterfaces, jclass_loader,
+        proxyClassMethods, proxyClassThrows);
     soa.Self()->AssertNoPendingException();
     return proxyClass;
   }