Existe uma maneira de instanciar uma class pelo nome em Java?

Eu estava procurando como a pergunta: instanciar uma class de seu nome de seqüência de caracteres que descreve como instanciar uma class ao ter seu nome. Existe uma maneira de fazer isso em Java? Eu terei o nome do pacote e o nome da class e preciso poder criar um object com esse nome específico.

   

Dois caminhos:

Método 1 – somente para classs que possuem um construtor no-arg

Se sua class tiver um construtor no-arg, você poderá obter um object Class usando Class.forName() e usar o newInstance() Class.forName() para criar uma instância (embora tenha cuidado com o fato de esse método ser considerado ruim porque pode derrotar as exceções verificadas do Java ).

Por exemplo:

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

Método 2

Uma abordagem alternativa mais segura que também funciona se a class não tiver nenhum construtor no-arg é consultar seu object de class para obter seu object Constructor e chamar um newInstance() neste object:

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

Ambos os methods são conhecidos como reflection . Você normalmente terá que pegar as várias exceções que podem ocorrer, incluindo coisas como:

  • a JVM não pode encontrar ou não pode carregar sua class
  • a class que você está tentando instanciar não tem o tipo certo de construtores
  • o próprio construtor lançou uma exceção
  • o construtor que você está tentando invocar não é público
  • um gerenciador de segurança foi instalado e está impedindo que a reflection ocorra
 MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance(); 

use Class.forName (“String nome da class”). newInstance ();

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

Isso fará com que a class chamada A seja inicializada.

Para tornar mais fácil obter o nome totalmente qualificado de uma class para criar uma instância usando Class.forName(...) , pode-se usar o método Class.getName() . Algo como:

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

Então você pode converter o object que você recebe de volta para qualquer class que você passar para makeObject(...) :

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

Use a reflection java

Criando Novos Objetos Não há equivalente a invocação de método para construtores, porque invocar um construtor é equivalente a criar um novo object (para ser o mais preciso, criar um novo object envolve tanto alocação de memory quanto construção de object). Então, o equivalente mais próximo do exemplo anterior é dizer:

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

que encontra um construtor que manipula os tipos de parâmetros especificados e os invoca para criar uma nova instância do object. O valor dessa abordagem é que ela é puramente dinâmica, com pesquisa de construtor e chamada em tempo de execução, em vez de no tempo de compilation.

Class.forName (“ClassName”) resolverá seu propósito.

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

algo assim deveria funcionar …

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