用Java动态加载类

rub*_*buc 18 java dynamic

我查了一下语法并搜索了api,但仍然对这个过程感到困惑.我还搜索了Stackoverflow.加载类并动态创建对象的正确方法是什么?换句话说,我希望用户指定他们想要创建的对象类型,然后创建该类型的对象.我不想要菜单,因为我希望他们能够选择当前目录中的任何类.

Amo*_*are 18

假设该类具有无参数构造函数,最简单的方法是 -

Object newObject = Class.forName(strFullyQualifiedClassName).newInstance();
Run Code Online (Sandbox Code Playgroud)

参考 - java.lang.Class

  • 如果在编译时不知道类的类型,则必须使用反射来查找和调用方法.如果构造函数有一个参数,你在`Class.forName`返回的类上使用`getDeclaredConstructor()`,如Mike Samuel的回答所示 (2认同)

Mik*_*uel 7

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");
Run Code Online (Sandbox Code Playgroud)

以上忽略了一堆可能的异常.


rub*_*buc 5

这就是我的工作内容。这不是成品,只是测试一下我是否可以让它工作。感谢所有回答这个问题的人:-)。

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");  
  }  
}  
Run Code Online (Sandbox Code Playgroud)