Implement Class.getDeclared(Constructors|Fields|Methods).

This required making sure that a Method* that represents a constructor
has java.lang.reflect.Constructor as its class.

Change-Id: I25908845a2b8d686d5404ac584693db0edd5853c
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index c3b063c..ba67402 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -298,9 +298,9 @@
   CheckOffset(size_t c, const char* j) : cpp_offset(c), java_name(j) {}
 };
 
+template <typename T>
 struct CheckOffsets {
   bool instance;
-  size_t size;
   std::string class_descriptor;
   std::vector<CheckOffset> offsets;
 
@@ -312,11 +312,11 @@
 
     if (!klass->IsClassClass() && instance) {
       size_t expected_size = instance ? klass->GetObjectSize() : klass->GetClassSize();
-      if (size != expected_size) {
+      if (sizeof(T) != expected_size) {
         LG << "Class size mismatch:"
            << " class=" << class_descriptor
-           << " Java=" << klass->GetObjectSize()
-           << " C++=" << expected_size;
+           << " Java=" << expected_size
+           << " C++=" << sizeof(T);
         error = true;
       }
     }
@@ -376,10 +376,9 @@
 // Note that ClassLinkerTest.ValidateFieldOrderOfJavaCppUnionClasses
 // is first since if it is failing, others are unlikely to succeed.
 
-struct ObjectOffsets : public CheckOffsets {
+struct ObjectOffsets : public CheckOffsets<Object> {
   ObjectOffsets() {
     instance = true;
-    size = sizeof(Object);
     class_descriptor = "Ljava/lang/Object;";
 
     // alphabetical references
@@ -390,19 +389,17 @@
   };
 };
 
-struct AccessibleObjectOffsets : public CheckOffsets {
+struct AccessibleObjectOffsets : public CheckOffsets<AccessibleObject> {
   AccessibleObjectOffsets() {
     instance = true;
-    size = sizeof(AccessibleObject);
     class_descriptor = "Ljava/lang/reflect/AccessibleObject;";
     offsets.push_back(CheckOffset(OFFSETOF_MEMBER(AccessibleObject, java_flag_), "flag"));
   };
 };
 
-struct FieldOffsets : public CheckOffsets {
+struct FieldOffsets : public CheckOffsets<Field> {
   FieldOffsets() {
     instance = true;
-    size = sizeof(Field);
     class_descriptor = "Ljava/lang/reflect/Field;";
 
     // alphabetical references
@@ -420,10 +417,9 @@
   };
 };
 
-struct MethodOffsets : public CheckOffsets {
+struct MethodOffsets : public CheckOffsets<Method> {
   MethodOffsets() {
     instance = true;
-    size = sizeof(Method);
     class_descriptor = "Ljava/lang/reflect/Method;";
 
     // alphabetical references
@@ -472,10 +468,16 @@
   };
 };
 
-struct ClassOffsets : public CheckOffsets {
+struct ConstructorOffsets : public MethodOffsets {
+  ConstructorOffsets() : MethodOffsets() {
+    // We use Method* for both java.lang.reflect.Constructor and java.lang.reflect.Method.
+    class_descriptor = "Ljava/lang/reflect/Constructor;";
+  }
+};
+
+struct ClassOffsets : public CheckOffsets<Class> {
   ClassOffsets() {
     instance = true;
-    size = sizeof(Class);
     class_descriptor = "Ljava/lang/Class;";
 
     // alphabetical references
@@ -511,10 +513,9 @@
   };
 };
 
-struct StringOffsets : public CheckOffsets {
+struct StringOffsets : public CheckOffsets<String> {
   StringOffsets() {
     instance = true;
-    size = sizeof(String);
     class_descriptor = "Ljava/lang/String;";
 
     // alphabetical references
@@ -527,10 +528,9 @@
   };
 };
 
-struct ThrowableOffsets : public CheckOffsets {
+struct ThrowableOffsets : public CheckOffsets<Throwable> {
   ThrowableOffsets() {
     instance = true;
-    size = sizeof(Throwable);
     class_descriptor = "Ljava/lang/Throwable;";
 
     // alphabetical references
@@ -542,10 +542,9 @@
   };
 };
 
-struct StackTraceElementOffsets : public CheckOffsets {
+struct StackTraceElementOffsets : public CheckOffsets<StackTraceElement> {
   StackTraceElementOffsets() {
     instance = true;
-    size = sizeof(StackTraceElement);
     class_descriptor = "Ljava/lang/StackTraceElement;";
 
     // alphabetical references
@@ -556,10 +555,9 @@
   };
 };
 
-struct ClassLoaderOffsets : public CheckOffsets {
+struct ClassLoaderOffsets : public CheckOffsets<ClassLoader> {
   ClassLoaderOffsets() {
     instance = true;
-    size = sizeof(ClassLoader);
     class_descriptor = "Ljava/lang/ClassLoader;";
 
     // alphabetical references
@@ -568,10 +566,9 @@
   };
 };
 
-struct BaseDexClassLoaderOffsets : public CheckOffsets {
+struct BaseDexClassLoaderOffsets : public CheckOffsets<BaseDexClassLoader> {
   BaseDexClassLoaderOffsets() {
     instance = true;
-    size = sizeof(BaseDexClassLoader);
     class_descriptor = "Ldalvik/system/BaseDexClassLoader;";
 
     // alphabetical references
@@ -580,18 +577,16 @@
   };
 };
 
-struct PathClassLoaderOffsets : public CheckOffsets {
+struct PathClassLoaderOffsets : public CheckOffsets<PathClassLoader> {
   PathClassLoaderOffsets() {
     instance = true;
-    size = sizeof(PathClassLoader);
     class_descriptor = "Ldalvik/system/PathClassLoader;";
   };
 };
 
-struct ClassClassOffsets : public CheckOffsets {
+struct ClassClassOffsets : public CheckOffsets<ClassClass> {
   ClassClassOffsets() {
     instance = false;
-    size = sizeof(ClassClass);
     class_descriptor = "Ljava/lang/Class;";
 
     // padding 32-bit
@@ -603,10 +598,9 @@
   };
 };
 
-struct StringClassOffsets : public CheckOffsets {
+struct StringClassOffsets : public CheckOffsets<StringClass> {
   StringClassOffsets() {
     instance = false;
-    size = sizeof(StringClass);
     class_descriptor = "Ljava/lang/String;";
 
     // alphabetical references
@@ -621,10 +615,9 @@
   };
 };
 
-struct FieldClassOffsets : public CheckOffsets {
+struct FieldClassOffsets : public CheckOffsets<FieldClass> {
   FieldClassOffsets() {
     instance = false;
-    size = sizeof(FieldClass);
     class_descriptor = "Ljava/lang/reflect/Field;";
 
     // alphabetical references
@@ -642,10 +635,9 @@
   };
 };
 
-struct MethodClassOffsets : public CheckOffsets {
+struct MethodClassOffsets : public CheckOffsets<MethodClass> {
   MethodClassOffsets() {
     instance = false;
-    size = sizeof(MethodClass);
     class_descriptor = "Ljava/lang/reflect/Method;";
 
     // alphabetical references
@@ -660,6 +652,7 @@
 TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaCppUnionClasses) {
   EXPECT_TRUE(ObjectOffsets().Check());
   EXPECT_TRUE(AccessibleObjectOffsets().Check());
+  EXPECT_TRUE(ConstructorOffsets().Check());
   EXPECT_TRUE(FieldOffsets().Check());
   EXPECT_TRUE(MethodOffsets().Check());
   EXPECT_TRUE(ClassOffsets().Check());