Top


定義場所(file name)

jdk/src/share/classes/sun/launcher/LauncherHelper.java

説明(description)

    /**
     * This method does the following:
     * 1. gets the classname from a Jar's manifest, if necessary
     * 2. loads the class using the System ClassLoader
     * 3. ensures the availability and accessibility of the main method,
     *    using signatureDiagnostic method.
     *    a. does the class exist
     *    b. is there a main
     *    c. is the main public
     *    d. is the main static
     *    c. does the main take a String array for args
     * 4. and off we go......
     *
     * @param printToStderr
     * @param isJar
     * @param name
     * @return
     */

名前(function name)

    public static Class<?> checkAndLoadMain(boolean printToStderr,
                                            int mode,
                                            String what) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

            final PrintStream ostream = (printToStderr) ? System.err : System.out;

  {- -------------------------------------------
  (1) java.lang.ClassLoader.getSystemClassLoader() を呼んで, システムクラスローダを取得する.
      ---------------------------------------- -}

            final ClassLoader ld = ClassLoader.getSystemClassLoader();

  {- -------------------------------------------
  (1) メインクラス名を取得する. 引数に応じて 2通りある.

      * mode 引数が LM_CLASS の場合 (= 指定されたクラスファイルをロードする場合): 
        what 引数の値をそのまま使用.

      * mode 引数が LM_JAR の場合 (= 指定された JAR ファイル内からメインクラスをロードする場合): 
        getMainClassFromJar() で JAR 内の manifest ファイルから取得する.
      ---------------------------------------- -}

            // get the class name
            String cn = null;
            switch (mode) {
                case LM_CLASS:
                    cn = what;
                    break;
                case LM_JAR:
                    cn = getMainClassFromJar(ostream, what);
                    break;
                default:
                    // should never happen
                    throw new InternalError("" + mode + ": Unknown launch mode");
            }
            cn = cn.replace('/', '.');

  {- -------------------------------------------
  (1) システムクラスローダの loadClass() メソッド (= sun.misc.Launcher$AppClassLoader.loadClass()) を呼んで, 
      メインクラスをロードする.
      もし ClassNotFoundException が出たら, ここで abort.
      ---------------------------------------- -}

            Class<?> c = null;
            try {
                c = ld.loadClass(cn);
            } catch (ClassNotFoundException cnfe) {
                abort(ostream, cnfe, "java.launcher.cls.error1", cn);
            }

  {- -------------------------------------------
  (1) sun.launcher.LauncherHelper.getMainMethod() を呼んで, 
      ロードしたクラスに main() メソッドが存在し, 
      static メソッドでかつ返値が void であることを確認.
      ---------------------------------------- -}

            getMainMethod(ostream, c);

  {- -------------------------------------------
  (1) 結果をリターン
      ---------------------------------------- -}

            return c;
        }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.