Pertanyaan Apakah ada cara untuk menginstansi kelas berdasarkan nama di Java?


Saya mencari pertanyaannya: Instantiasikan kelas dari nama string-nya yang menggambarkan cara instantiate kelas ketika memiliki nama. Apakah ada cara untuk melakukannya di Jawa? Saya akan memiliki nama paket dan nama kelas dan saya harus bisa membuat objek yang memiliki nama itu.


75
2018-03-27 08:58


asal


Jawaban:


Dua arah:

Metode 1 - hanya untuk kelas yang memiliki konstruktor no-arg

Jika kelas Anda memiliki konstruktor no-arg, Anda bisa mendapatkan Class objek menggunakan Class.forName() dan gunakan newInstance() metode untuk membuat instance (meskipun hati-hati bahwa metode ini sering dianggap jahat karena dapat mengalahkan pengecualian yang diperiksa Java).

Sebagai contoh:

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();

Metode 2

Pendekatan alternatif yang lebih aman yang juga bekerja jika kelas tidak memiliki konstruktor no-arg adalah untuk meminta objek kelas Anda untuk mendapatkannya Constructor objek dan memanggil newInstance() metode pada objek ini:

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

Kedua metode ini dikenal sebagai refleksi. Anda biasanya harus menangkap berbagai pengecualian yang dapat terjadi, termasuk hal-hal seperti:

  • JVM tidak dapat menemukan atau tidak dapat memuat kelas Anda
  • kelas yang Anda coba instantiate tidak memiliki konstruktor yang tepat
  • konstruktor itu sendiri melemparkan pengecualian
  • konstruktor yang Anda coba gunakan tidak bersifat publik
  • manajer keamanan telah dipasang dan mencegah refleksi terjadi

194
2018-03-27 09:02



MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();

12
2018-03-27 09:01



menggunakan Class.forName ("String name of class"). NewInstance ();

Class.forName("A").newInstance();

Ini akan menyebabkan kelas bernama A diinisialisasi.


3
2018-03-27 08:59



Untuk membuatnya lebih mudah untuk mendapatkan nama kelas yang memenuhi syarat untuk membuat instance menggunakan Class.forName(...), seseorang bisa menggunakan Class.getName() metode. Sesuatu seperti:

class ObjectMaker {
    // Constructor, fields, initialization, etc...
    public Object makeObject(Class<?> clazz) {
        Object o = null;

        try {
            o = Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            // There may be other exceptions to throw here, 
            // but I'm writing this from memory.
            e.printStackTrace();
        }

        return o;
    }
}

Kemudian Anda dapat mentransmisikan objek yang Anda dapatkan kembali ke kelas apa pun yang Anda lewati makeObject(...):

Data d = (Data) objectMaker.makeObject(Data.class);

2
2017-12-31 18:27



Gunakan refleksi java

Membuat Objek Baru Tidak ada yang setara dengan pemanggilan metode untuk konstruktor, karena menerapkan konstruktor sama dengan membuat objek baru (menjadi yang paling tepat, membuat objek baru melibatkan alokasi memori dan konstruksi objek). Jadi, padanan terdekat dari contoh sebelumnya adalah mengatakan:

import java.lang.reflect.*;

   public class constructor2 {
      public constructor2()
      {
      }

      public constructor2(int a, int b)
      {
         System.out.println(
           "a = " + a + " b = " + b);
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("constructor2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Constructor ct 
              = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = ct.newInstance(arglist);
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

yang menemukan konstruktor yang menangani jenis parameter yang ditentukan dan memanggilnya, untuk membuat contoh baru dari objek. Nilai dari pendekatan ini adalah bahwa itu murni dinamis, dengan pencarian konstruktor dan permintaan pada waktu eksekusi, bukan pada waktu kompilasi.


1
2018-03-27 09:03



Class.forName ("ClassName") akan menyelesaikan tujuan Anda.

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();

1
2018-03-27 09:05



String str = (String)Class.forName("java.lang.String").newInstance();

0
2018-03-27 09:01



sesuatu seperti ini seharusnya bekerja ...

String name = "Test2";//Name of the class
        Class myClass = Class.forName(name);
        Object o = myClass.newInstance();

0
2018-03-27 09:03