web-dev-qa-db-ja.com

Javaでクラスを動的にロードする

構文を調べてAPIを検索しましたが、それでもプロセスについて混乱しています。 Stackoverflowも検索しました。クラスをロードして動的にクラスからオブジェクトを作成する適切な方法は何ですか?つまり、ユーザーが作成するオブジェクトのタイプを指定してから、そのタイプのオブジェクトを作成します。現在のディレクトリ内の任意のクラスを選択できるようにしたいので、メニューは必要ありません。

18
rubixibuc

クラスに引数のないコンストラクタがあると仮定すると、最も簡単な方法は-

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

リファレンス- Java.lang.Class

18
Amol Katdare

_ClassLoader.loadClass_ はクラスをロードします。 myClass.getClassLoader()によってクラスローダーを取得し、それがnullの場合はClassLoader.getSystemClassLoader()にフォールバックする必要があります。

クラスインスタンスを取得したら、そのコンストラクタを getDeclaredConstructor(...) で取得できます。したがって、public MyClass(String) { ... }のようなコンストラクタを持つ_public class MyClass_がある場合、

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

上記は可能な例外の束を無視しています。

7
Mike Samuel

これが私が働いたものです。これは完成品ではなく、動作するかどうかをテストするだけです。質問に答えてくださった皆さん、ありがとうございました:-)。

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