diff --git a/dex2oat/dex2oat_test.cc b/dex2oat/dex2oat_test.cc
index 1196d11..2b96684 100644
--- a/dex2oat/dex2oat_test.cc
+++ b/dex2oat/dex2oat_test.cc
@@ -33,6 +33,7 @@
 #include "dex/art_dex_file_loader.h"
 #include "dex/base64_test_util.h"
 #include "dex/bytecode_utils.h"
+#include "dex/class_accessor-inl.h"
 #include "dex/code_item_accessors-inl.h"
 #include "dex/dex_file-inl.h"
 #include "dex/dex_file_loader.h"
@@ -960,19 +961,10 @@
     // Iterate over the dex files and ensure there is no quickened instruction.
     for (const OatDexFile* oat_dex_file : odex_file->GetOatDexFiles()) {
       std::unique_ptr<const DexFile> dex_file = oat_dex_file->OpenDexFile(&error_msg);
-      for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
-        const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
-        const uint8_t* class_data = dex_file->GetClassData(class_def);
-        if (class_data != nullptr) {
-          for (ClassDataItemIterator class_it(*dex_file, class_data);
-               class_it.HasNext();
-               class_it.Next()) {
-            if (class_it.IsAtMethod() && class_it.GetMethodCodeItem() != nullptr) {
-              for (const DexInstructionPcPair& inst :
-                       CodeItemInstructionAccessor(*dex_file, class_it.GetMethodCodeItem())) {
-                ASSERT_FALSE(inst->IsQuickened()) << inst->Opcode() << " " << output_;
-              }
-            }
+      for (ClassAccessor accessor : dex_file->GetClasses()) {
+        for (const ClassAccessor::Method& method : accessor.GetMethods()) {
+          for (const DexInstructionPcPair& inst : method.GetInstructions()) {
+            ASSERT_FALSE(inst->IsQuickened()) << inst->Opcode() << " " << output_;
           }
         }
       }
@@ -1276,19 +1268,16 @@
   {
     const DexFile::TypeId* type_id = dex->FindTypeId("LManyMethods;");
     dex::TypeIndex type_idx = dex->GetIndexForTypeId(*type_id);
-    const DexFile::ClassDef* class_def = dex->FindClassDef(type_idx);
-    ClassDataItemIterator it(*dex, dex->GetClassData(*class_def));
-    it.SkipAllFields();
+    ClassAccessor accessor(*dex, *dex->FindClassDef(type_idx));
     std::set<size_t> code_item_offsets;
-    for (; it.HasNextMethod(); it.Next()) {
-      const uint16_t method_idx = it.GetMemberIndex();
-      const size_t code_item_offset = it.GetMethodCodeItemOffset();
+    for (const ClassAccessor::Method& method : accessor.GetMethods()) {
+      const uint16_t method_idx = method.GetIndex();
+      const size_t code_item_offset = method.GetCodeItemOffset();
       if (code_item_offsets.insert(code_item_offset).second) {
         // Unique code item, add the method index.
         methods.push_back(method_idx);
       }
     }
-    DCHECK(!it.HasNext());
   }
   ASSERT_GE(methods.size(), 8u);
   std::vector<uint16_t> hot_methods = {methods[1], methods[3], methods[5]};
@@ -1391,11 +1380,10 @@
     size_t unused_count = 0;
     // Visit all of the methdos of the main class and cross reference the method indices to their
     // corresponding code item offsets to verify the layout.
-    ClassDataItemIterator it(*dex_file, dex_file->GetClassData(*class_def));
-    it.SkipAllFields();
-    for (; it.HasNextMethod(); it.Next()) {
-      const size_t method_idx = it.GetMemberIndex();
-      const size_t code_item_offset = it.GetMethodCodeItemOffset();
+    ClassAccessor accessor(*dex_file, *class_def);
+    for (const ClassAccessor::Method& method : accessor.GetMethods()) {
+      const size_t method_idx = method.GetIndex();
+      const size_t code_item_offset = method.GetCodeItemOffset();
       const bool is_hot = ContainsElement(hot_methods, method_idx);
       const bool is_startup = ContainsElement(startup_methods, method_idx);
       const bool is_post_startup = ContainsElement(post_methods, method_idx);
@@ -1417,17 +1405,14 @@
           ++unused_count;
         } else {
           // or this method is part of the last code item and the end is 4 byte aligned.
-          ClassDataItemIterator it2(*dex_file, dex_file->GetClassData(*class_def));
-          it2.SkipAllFields();
-          for (; it2.HasNextMethod(); it2.Next()) {
-              EXPECT_LE(it2.GetMethodCodeItemOffset(), code_item_offset);
+          for (const ClassAccessor::Method& method2 : accessor.GetMethods()) {
+            EXPECT_LE(method2.GetCodeItemOffset(), code_item_offset);
           }
           uint32_t code_item_size = dex_file->FindCodeItemOffset(*class_def, method_idx);
           EXPECT_EQ((code_item_offset + code_item_size) % 4, 0u);
         }
       }
     }
-    DCHECK(!it.HasNext());
     EXPECT_GT(hot_count, 0u);
     EXPECT_GT(post_startup_count, 0u);
     EXPECT_GT(startup_count, 0u);
@@ -1478,14 +1463,13 @@
     EXPECT_LE(header.OwnedDataBegin(), header.OwnedDataEnd());
     EXPECT_LE(header.OwnedDataBegin(), header.data_size_);
     EXPECT_LE(header.OwnedDataEnd(), header.data_size_);
-    for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
-      const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
-      class_def.VisitMethods(dex_file.get(), [&](const ClassDataItemIterator& it) {
-        if (it.GetMethodCodeItemOffset() != 0u) {
-          ASSERT_GE(it.GetMethodCodeItemOffset(), header.OwnedDataBegin());
-          ASSERT_LT(it.GetMethodCodeItemOffset(), header.OwnedDataEnd());
+    for (ClassAccessor accessor : dex_file->GetClasses()) {
+      for (const ClassAccessor::Method& method : accessor.GetMethods()) {
+        if (method.GetCodeItemOffset() != 0u) {
+          ASSERT_GE(method.GetCodeItemOffset(), header.OwnedDataBegin());
+          ASSERT_LT(method.GetCodeItemOffset(), header.OwnedDataEnd());
         }
-      });
+      }
     }
     // Test that the owned sections don't overlap.
     for (const std::unique_ptr<const CompactDexFile>& other_dex : compact_dex_files) {
@@ -1916,26 +1900,15 @@
   MutateDexFile(temp_dex.GetFile(), GetTestDexFileName("ManyMethods"), [] (DexFile* dex) {
     bool mutated_successfully = false;
     // Change the dex instructions to make an opcode that spans past the end of the code item.
-    for (size_t i = 0; i < dex->NumClassDefs(); ++i) {
-      const DexFile::ClassDef& def = dex->GetClassDef(i);
-      const uint8_t* data = dex->GetClassData(def);
-      if (data == nullptr) {
-        continue;
-      }
-      ClassDataItemIterator it(*dex, data);
-      it.SkipAllFields();
-      while (it.HasNextMethod()) {
-        DexFile::CodeItem* item = const_cast<DexFile::CodeItem*>(it.GetMethodCodeItem());
-        if (item != nullptr) {
-          CodeItemInstructionAccessor instructions(*dex, item);
-          // Make a quickened instruction that doesn't run past the end of the code item.
-          if (instructions.InsnsSizeInCodeUnits() > 2) {
-            const_cast<Instruction&>(instructions.InstructionAt(0)).SetOpcode(
-                Instruction::IGET_BYTE_QUICK);
-            mutated_successfully = true;
-          }
+    for (ClassAccessor accessor : dex->GetClasses()) {
+      for (const ClassAccessor::Method& method : accessor.GetMethods()) {
+        CodeItemInstructionAccessor instructions = method.GetInstructions();
+        // Make a quickened instruction that doesn't run past the end of the code item.
+        if (instructions.InsnsSizeInCodeUnits() > 2) {
+          const_cast<Instruction&>(instructions.InstructionAt(0)).SetOpcode(
+              Instruction::IGET_BYTE_QUICK);
+          mutated_successfully = true;
         }
-        it.Next();
       }
     }
     CHECK(mutated_successfully)
