Создать новый объект из строки в Java

Есть ли способ создать новый класс из переменной String в Java?

String className = "Class1";
//pseudocode follows
Object xyz = new className(param1, param2);

Кроме того, если возможно, должен ли результирующий объект иметь тип Object?

Возможно, есть лучший способ, но я хочу иметь возможность получать значения из файла XML, а затем создавать экземпляры классов, названных в честь этих строк. Каждый из этих классов реализует один и тот же интерфейс и является производным от одного и того же родительского класса, поэтому я мог бы вызывать определенный метод в этом классе.

Ответы

Ответ 1

Это то, что вы хотите сделать:

String className = "Class1";
Object xyz = Class.forName(className).newInstance();

Обратите внимание, что метод newInstance не позволяет использовать параметризованный конструктор. (См. Документация Class.newInstance)

Если вам нужно использовать параметризованный конструктор, это то, что вам нужно сделать:

import java.lang.reflect.*;

Param1Type param1;
Param2Type param2;
String className = "Class1";
Class cl = Class.forName(className);
Constructor con = cl.getConstructor(Param1Type.class, Param2Type.class);
Object xyz = con.newInstance(param1, param2);

См. Документация Constructor.newInstance

Ответ 2

Да, вы можете загрузить класс на пути к классу, используя имя String, используя отражение, используя Class.forName(name), захватив конструктор и вызывая его. Я приведу вам пример.

У меня есть класс:

com.crossedstreams.thingy.Foo

У кого есть конструктор с сигнатурой:

Foo(String a, String b);

Я бы создавал экземпляр класса на основе этих двух фактов следующим образом:

// Load the Class. Must use fully qualified name here!
Class clazz = Class.forName("com.crossedstreams.thingy.Foo");

// I need an array as follows to describe the signature
Class[] parameters = new Class[] {String.class, String.class};

// Now I can get a reference to the right constructor
Constructor constructor = clazz.getConstructor(parameters);

// And I can use that Constructor to instantiate the class
Object o = constructor.newInstance(new Object[] {"one", "two"});

// To prove it really there...
System.out.println(o);

Вывод:

[email protected]

Там много ресурсов, которые более подробно описывают это, и вы должны знать, что вы вводите зависимость, которую компилятор не может проверить для вас - если вы пропустили имя класса или что-то еще, оно будет сбой во время выполнения. Кроме того, существует довольно много разных типов исключений, которые могут быть выбрасываться во время этого процесса. Это очень мощный метод.

Ответ 3

Это должно работать:

import java.lang.reflect.*;

FirstArgType arg1;
SecondArgType arg2;
Class cl = Class.forName("TheClassName");
Constructor con = cl.getConstructor(FirstArgType.class, SecondArgType.class);
Object obj = con.newInstance(arg1, arg2);

Оттуда вы можете применить к известному типу.

Ответ 4

Это работало немного более чисто для меня в JDK7, в то время как ответы выше делали вещи немного сложнее, чем они должны были быть с точки зрения новичков: (предполагается, что вы объявили "className" как переменную String, переданную как метод метода или ранее в методе, используя этот код):

Class<?> panel = Class.forName( className );
JPanel newScreen = (JPanel) panel.newInstance();

С этого момента вы можете использовать свойства/методы из своего динамически названного класса точно так же, как вы ожидали бы, чтобы использовать их:

JFrame frame = new JFrame(); // <<< Just so no-one gets lost here
frame.getContentPane().removeAll();
frame.getContentPane().add( newScreen );
frame.validate();
frame.repaint();

В приведенных выше примерах приводились ошибки, когда я попытался создать .add() новый объект типа Object для фрейма. Представленная здесь техника дала мне полезный объект с этими двумя строками кода выше.

Не совсем точно, почему это было - я сам новичок Java.

Ответ 5

Другой:

import java.lang.reflect.Constructor;

public class Test {

 public Test(String name) {
    this.name = name;
 }

 public String getName() {
    return name;
 }

 public String toString() {
    return this.name;
 }

 private String name;

 public static void main(String[] args) throws Exception {
    String className = "Test";
    Class clazz = Class.forName(className);
    Constructor tc = clazz.getConstructor(String.class);
    Object t = tc.newInstance("John");
    System.out.println(t);
 }
}

Ответ 6

Пример программы для получения экземпляра class с использованием объекта String.

public class GetStudentObjectFromString
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String className = "Student"; //Passed the Class Name in String Object.

         //A Object of Student will made by Invoking its Default Constructor.
        Object o = Class.forName(className).newInstance(); 
        if(o instanceof Student) // Verify Your Instance that Is it Student Type or not?
        System.out.println("Hurrey You Got The Instance of " + className);
    }
}
class Student{
    public Student(){
        System.out.println("Constructor Invoked");
    }

}

Выход: -

 Constructor Invoked
 Hurrey You Got The Instance of Student