Динамическая загрузка класса в Java - PullRequest
18 голосов
/ 06 апреля 2011

Я посмотрел синтаксис и искал API, но все еще запутался в процессе. Я также искал Stackoverflow. Как правильно загрузить класс и динамически создать из него объект? Другими словами, я хочу, чтобы пользователь указал, какой тип объекта он хочет создать, а затем создал этот тип объекта. Мне не нужно меню, потому что я хочу, чтобы они могли выбирать любой класс в текущем каталоге.

Ответы [ 3 ]

18 голосов
/ 06 апреля 2011

Предполагая, что класс имеет конструктор без аргументов, самый простой способ -

Object newObject = Class.forName(strFullyQualifiedClassName).newInstance();

Ссылка - java.lang.Class

7 голосов
/ 06 апреля 2011

ClassLoader.loadClass загрузит класс.Вы получаете загрузчик классов на myClass.getClassLoader() и должны возвращаться к ClassLoader.getSystemClassLoader(), если это значение равно нулю.

Получив экземпляр класса, вы можете получить его конструкторы с помощью getDeclaredConstructor(...).Так что если у вас есть public class MyClass с конструктором, подобным public MyClass(String) { ... }, тогда

Class<MyClass> clazz = MyClass.class;
Constructor<MyClass> ctor = clazz.getDeclaredConstructor(String.class);
MyClass instance = ctor.newInstance("foo");

Вышеприведенное игнорирует кучу возможных исключений.

4 голосов
/ 07 апреля 2011

Вот что у меня получилось.Это не законченный продукт, а всего лишь тест, чтобы увидеть, смогу ли я заставить его работать.Спасибо всем, кто ответил на задание: -).

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");  
  }  
}  
...