jdk/src/share/classes/sun/launcher/LauncherHelper.java
/**
* 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
*/
public static Class<?> checkAndLoadMain(boolean printToStderr,
int mode,
String what) {
{- -------------------------------------------
(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.