Refleksi Java enum ketika enum ada di dalam kelas

Saya memiliki beberapa contoh kelas yang memiliki satu enum yang bersarang di dalamnya. Berikut adalah versi sederhana dari kelas tersebut:

public class FirstClass extends BaseClass {

  public enum EnumGroup {
      ONE("one"),
      TWO("two");

      private String mName;

      EnumGroup(String name) {
        this.mName = name;
      }

      public String getName() {
        return mName;
      }  
  }

  // FirstClass methods
}

Tujuan saya adalah mengulangi kelas-kelas ini secara terprogram (yaitu Kelas Satu, Kelas Kedua, dll.) dan menarik enum (selalu disebut "EnumGroup") dan memanggil metode getName() pada setiap nilai enum.

Saya telah melihat postingan StackOverflow ini pada refleksi dan enum Java, tetapi ketika saya mencoba mengambil enum saya dengan menentukan jalur (com.package.FirstClass.EnumGroup) saya mendapatkan ClassNotFoundException. Saya kira memasukkan enum ke dalam kelas akan mengacaukan sesuatu.

Class<?> clz = Class.forName("com.package.FirstClass.EnumGroup");

Saya tidak memerlukan pengaturan ini, tetapi tujuan akhirnya adalah tidak memiliki kode yang sama di setiap kelas yang mengulangi enum.


person Mark    schedule 19.10.2015    source sumber
comment
Hai @JBNizet - menambahkan baris yang menampilkan ClassNotFoundException.   -  person Mark    schedule 19.10.2015
comment
Mengapa menggunakan Class.forName()? Mengapa tidak menggunakan kelas literal com.package.FirstClass.EnumGroup.class saja? Anda tidak akan mendapatkan pengecualian, kompiler akan memeriksa apakah Anda menggunakan nama kelas yang valid, dan pemfaktoran ulang akan secara otomatis membuat kode Anda benar.   -  person JB Nizet    schedule 19.10.2015
comment
Bisakah para pemilih yang tidak setuju menjelaskan mengapa pertanyaan ini tidak bagus atau tidak memenuhi standar mereka? Terima kasih!   -  person Mark    schedule 20.10.2015


Jawaban (1)


Karena Anda menggunakan Class.forName Anda perlu menggunakan nama kelas, dan dalam nama kelas, tipe dalam dipisahkan dari tipe luar dengan $.

Jadi gunakan

Class<?> clz = Class.forName("com.package.FirstClass$EnumGroup");
//                                                  ^
person Pshemo    schedule 19.10.2015
comment
Jawaban yang luar biasa cepat dan benar. Terima kasih @Pshemo! :) - person Mark; 19.10.2015