Создание нового класса из переменной в Java


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

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

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

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

6 57

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