Создать новый объект из строки в 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