JVM入门之main方式详解
main方法:(固定写法(但是 throws抛出异常可以不同)一个static静态特殊方法,程序的入口,JVM开始执行的地方)
public static void main(String[ ] args){ //main函数执行代码 }
main方法与普通static方法的区别:
共同点: 调用方式都是 类名.函数名调用 在子父类继承体系中,子类能够继承父类静态方法,重/复写时,多态调用时,根据容器决定调用的static方法,与实际对象无关?在static随笔中就解释
不同点:main方式在JVM执行字节码文件时会自动调用,而普通static方法不会直接调用
JVM执行main函数顺序:
类加载器ClassLoad加载类(初始化父类/子类 )-->类/成员变量-->static静态代码块-->main函数-->main函数执行完-->卸载类
扩展一:java 执行jar包中的main方法 (暂未发布)生成runable可运行jar包的方式
核心指令:java -jar ****.jar 执行jar运行默认的main主方法(本质:直接运行 MANIFEST.MF 中指定的 main 方法 Main-Class:cn.jartest.jartestDemo)
示例:java -jar jartestDemo.jar
运行指定的main方法
java -classpath ****.jar 类的全限定名[传入参数args]
示例:java -cp jartestDemo.jar cn.jartest.jartestDemo
扩展二: 一个类能否调用另一个类的main方式?
方式一:与类中(暂未发布)static静态方法调用方式一致 类名.函数名(...)
public class MainTest { public static int count =0; public static void main(String[] args) { if(count<5){ System.out.println(count); test(); } } public static void test() { count++; MainTest .main(null); } } 输出: 0 1 2 3 4
方式二:利用 (暂未发布)反射的ClassLoader的Method实现
package test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MainTest { public static void main(String[] args) { System.out.println("maintest"); ClassLoader classLoader = MainTest.class.getClassLoader(); try { //利用类加载器通过反射获得main主函数的程序函数,执行即可 Class<?> loadClass = classLoader.loadClass("test.MainDemo"); Method method = loadClass.getMethod("main", String[].class); method.invoke(null, new Object[] { new String[] {} }); } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } } package test; public class MainDemo { public static void main(String[] args) { System.out.println("maindemo"); } } 输出结果: maintest maindemo