Ответ 1
Предполагая, что класс имеет конструктор no-arg, самым простым способом было бы -
Object newObject = Class.forName(strFullyQualifiedClassName).newInstance();
Ссылка - java.lang.Class
Я искал синтаксис и искал api, но я все еще запутался в этом процессе. Я также искал Stackoverflow. Каков правильный способ загрузки класса и создания объекта из него динамически? В других словах я хочу, чтобы пользователь указал, какой тип объекта они хотят создать, а затем создать этот тип объекта. Мне не нужно меню, потому что я хочу, чтобы они могли выбирать любой класс в текущем каталоге.
Предполагая, что класс имеет конструктор no-arg, самым простым способом было бы -
Object newObject = Class.forName(strFullyQualifiedClassName).newInstance();
Ссылка - java.lang.Class
ClassLoader.loadClass
загрузит класс. Вы получаете загрузчик классов myClass.getClassLoader()
, и вы должны вернуться к ClassLoader.getSystemClassLoader()
, если это значение равно null.
Как только у вас есть экземпляр класса, вы можете получить его конструкторы через getDeclaredConstructor(...)
.
Поэтому, если у вас есть public class MyClass
с конструктором типа public MyClass(String) { ... }
, то
Class<MyClass> clazz = MyClass.class;
Constructor<MyClass> ctor = clazz.getDeclaredConstructor(String.class);
MyClass instance = ctor.newInstance("foo");
Вышеупомянутое игнорирует кучу возможных исключений.
Вот что я получил. Это не конечный продукт, а просто тест, чтобы увидеть, могу ли я заставить его работать. Спасибо всем, кто ответил на запрос: -).
public class SimLoader {
public static void main(String[] args)
{
try
{
Object simulator = Class.forName("SimX").newInstance();
((SimInterface)simulator).run();
}
catch(ClassNotFoundException e) {}
catch(InstantiationException e) {}
catch(IllegalAccessException e) {}
}
}
interface SimInterface {
void run();
}
class SimX implements SimInterface
{
public void run() {
System.out.println("Success");
}
}