5

リフレクションを使用して別のメインメソッドからJavaクラスのメインメソッドを呼び出す場合、

Class thisClass = loader.loadClass(packClassName);
Method thisMethod = thisClass.getDeclaredMethod("main",String[].class);

thisMethod.invoke(null, new String[0]);

newInstance()を作成するか、静的であるため単にmain()を呼び出す必要があります。

4

2 に答える 2

9

あなたが述べた要件のために(ランダムクラスのメインメソッドを動的に呼び出します。リフレクションを使用すると、不要なコードがたくさんあります。

  • クラスのコンストラクターを呼び出す必要はありません
  • クラスフィールドをイントロスペクトする必要はありません
  • 静的メソッドを呼び出しているため、メソッドを呼び出すために実際のオブジェクトさえ必要ありません

ニーズに合わせて次のコードを変更できます。

try {
    final Class<?> clazz = Class.forName("blue.RandomClass");
    final Method method = clazz.getMethod("main", String[].class);

    final Object[] args = new Object[1];
    args[0] = new String[] { "1", "2"};
    method.invoke(null, args);
} catch (final Exception e) {
    e.printStackTrace();
}
于 2013-03-23T01:58:40.200 に答える
1

知覚の答えは正しいようです。クラスパスにないJarからロードする必要がある場合は、URLクラスローダーを使用できます

     try {
        URL[] urls;
        URLClassLoader urlLoader;

        urls = ...;

        urlLoader = new URLClassLoader(urls);

        @SuppressWarnings("rawtypes")
        Class runClass = urlLoader.loadClass(classToRun);

        Object[] arguments = new Object[]{args};
        Method mainMethod = runClass.getMethod("main", String[].class);
        mainMethod.invoke(null, arguments);
      } catch (Exception e) {
        e.printStackTrace();
      }
于 2013-03-23T02:13:00.173 に答える