C’è un modo per istanziare una class per nome in Java?

Stavo guardando come la domanda: Istanziare una class dal suo nome di stringa che descrive come istanziare una class quando ha il suo nome. C’è un modo per farlo in Java? Avrò il nome del pacchetto e il nome della class e devo essere in grado di creare un object con quel nome particolare.

Due strade:

Metodo 1 – solo per le classi che hanno un costruttore no-arg

Se la tua class ha un costruttore no-arg, puoi ottenere un object Class usando Class.forName() e usare il metodo newInstance() per creare un’istanza (attenzione però che questo metodo è spesso considerato malvagio perché può sconfiggere le eccezioni controllate di Java ).

Per esempio:

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

Metodo 2

Un approccio alternativo più sicuro che funziona anche se la class non ha costruttori no-arg è di interrogare l’object class per ottenere il suo object Constructor e chiamare un metodo newInstance() su questo object:

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

Entrambi i metodi sono noti come riflessione . In genere devi rilevare le varie eccezioni che possono verificarsi, incluse cose come:

  • la JVM non può trovare o non può caricare la tua class
  • la class che stai cercando di creare un’istanza non ha il giusto tipo di costruttori
  • il costruttore stesso ha lanciato un’eccezione
  • il costruttore che stai tentando di invocare non è pubblico
  • un gestore della sicurezza è stato installato e impedisce la riflessione
 MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance(); 

usa Class.forName (“Nome stringa della class”). newInstance ();

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

Ciò causerà la class A inizializzata.

Per rendere più semplice ottenere il nome completo di una class per creare un’istanza utilizzando Class.forName(...) , è ansible utilizzare il metodo Class.getName() . Qualcosa di simile a:

 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; } } 

Quindi puoi lanciare l’object che torni a qualunque class passi a makeObject(...) :

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

Usa la riflessione java

Creare nuovi oggetti Non c’è equivalente alla chiamata al metodo per i costruttori, perché invocare un costruttore è equivalente alla creazione di un nuovo object (per essere il più preciso, la creazione di un nuovo object implica sia l’allocazione della memoria sia la costruzione dell’object). Quindi l’equivalente più vicino all’esempio precedente è quello di dire:

 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); } } } 

che trova un costruttore che gestisce i tipi di parametri specificati e lo invoca, per creare una nuova istanza dell’object. Il valore di questo approccio è che è puramente dinamico, con la ricerca del costruttore e l’invocazione al momento dell’esecuzione, piuttosto che al momento della compilazione.

Class.forName (“ClassName”) risolverà il tuo scopo.

 Class class1 = Class.forName(ClassName); Object object1 = class1.newInstance(); 
 String str = (String)Class.forName("java.lang.String").newInstance(); 

qualcosa del genere dovrebbe funzionare …

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