Создание нового класса из переменной в Java
есть ли способ создать новый класс из строковой переменной в Java?
String className = "Class1";
//pseudocode follows
Object xyz = new className(param1, param2);
кроме того, если это возможно, должен ли результирующий объект иметь тип Object?
может быть лучший способ, но я хочу иметь возможность извлекать значения из XML-файла, а затем создавать классы, названные в честь этих строк. Каждый из классов реализует один и тот же интерфейс и является производным от одного и того же родительского класса, поэтому я мог бы вызвать определенный метод в этом классе.
6 ответов:
это то, что вы хотите сделать:
String className = "Class1"; Object xyz = Class.forName(className).newInstance();
обратите внимание, что метод newInstance не позволяет использовать параметризованный конструктор. (См.класса.документация 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);
посмотреть конструктор.документация newinstance метод
Да, вы можете загрузить класс на свой путь к классу, заданный именем строки, используя отражение, используя класс.forName (имя), захватывая конструктор и вызывая его. Я приведу вам пример.
считайте, что у меня есть класс:
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's really there... System.out.println(o);
выход:
com.crossedstreams.thingy.Foo@20cf2c80
там много ресурсов, которые идут более подробно об этом, и вы должны знать, что вы вводите зависимость, которую компилятор не может проверить для вас - если вы неправильно напишете имя класса или что-то еще, это не удастся во время выполнения. Кроме того, существует довольно много различных типов исключений, которые могут быть вызваны во время этого процесса. Но это очень мощная техника.
Это должно работать:
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);
оттуда вы можете привести к известному типу.
это работало немного более чисто для меня в JDK7, в то время как ответы выше сделали вещи немного сложнее, чем они должны были быть с точки зрения новичка: (предполагается, что вы объявили 'className' как строковую переменную, переданную в качестве параметра метода или ранее в методе, использующем этот код):
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();
примеры в других ответах выше приводили к ошибкам, когда я пытался .добавьте () новый объект типа "объект" в кадр. Техника, показанная здесь, дала мне полезный объект только с этими двумя строками кода выше.
не совсем уверен, почему это было - я сам Новичок Java.
другой:
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); } }
пример программы, чтобы получить экземпляр
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