`
tangxiucai2
  • 浏览: 4075 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

Java中main函数的执行过程以及在程序中开启断言

 
阅读更多

%JAVA_HOME%/lib 中存在 tools.jar,无意中发现其中的 javac的代码实现如下:

package com.sun.tools.javac;

import com.sun.tools.javac.util.Version;
import java.io.PrintWriter;
import java.lang.reflect.Method;

@Version("@(#)Main.java\t1.25 06/04/30")
public class Main
{
  public static void main(String[] paramArrayOfString)
    throws Exception
  {
    if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equals("-Xjdb"))) {
      String[] arrayOfString = new String[paramArrayOfString.length + 2];
      Class localClass = Class.forName("com.sun.tools.example.debug.tty.TTY");
      Method localMethod = localClass.getDeclaredMethod("main", new Class[] { paramArrayOfString.getClass() });
      localMethod.setAccessible(true);
      System.arraycopy(paramArrayOfString, 1, arrayOfString, 3, paramArrayOfString.length - 1);
      arrayOfString[0] = "-connect";
      arrayOfString[1] = "com.sun.jdi.CommandLineLaunch:options=-esa -ea:com.sun.tools...";
      arrayOfString[2] = "com.sun.tools.javac.Main";
      localMethod.invoke(null, new Object[] { arrayOfString });
    } else {
      System.exit(compile(paramArrayOfString));
    }
  }

  public static int compile(String[] paramArrayOfString)
  {
    com.sun.tools.javac.main.Main localMain = new com.sun.tools.javac.main.Main("javac");

    return localMain.compile(paramArrayOfString);
  }

  public static int compile(String[] paramArrayOfString, PrintWriter paramPrintWriter)
  {
    com.sun.tools.javac.main.Main localMain = new com.sun.tools.javac.main.Main("javac", paramPrintWriter);

    return localMain.compile(paramArrayOfString);
  }

  static
  {
    ClassLoader localClassLoader = Main.class.getClassLoader();
    if (localClassLoader != null)
      localClassLoader.setPackageAssertionStatus("com.sun.tools.javac", true);
  }
}


其中通过获取当前类加载器的实例进行指定断言开启

ClassLoader localClassLoader = Main.class.getClassLoader();

if (localClassLoader != null)

localClassLoader.setPackageAssertionStatus("com.sun.tools.javac", true);

并且通过该类的main方法中调用另外一个可以作为入口类的main方法的过程,可以猜想jvm在启动的时候通过指定入口类其调用方式应该也是一致的

Class localClass = Class.forName("com.sun.tools.example.debug.tty.TTY");

Method localMethod = localClass.getDeclaredMethod("main", new Class[] { paramArrayOfString.getClass() });

...

分享到:
评论

相关推荐

    获取(设置)应用程序返回值

    获取这些参数通常在程序启动时进行,可以通过解析命令行字符串或使用专门的函数来实现,如C/C++的`main`函数的`argv`参数,Python的`sys.argv`,或Java的`String[] args`。 总结来说,程序返回值是衡量程序执行状态...

    java基础学习词汇

    在Java中,程序的执行通常是从main方法开始的。 #### Exhibit (展示) 虽然“exhibit”这个词在Java中没有直接的应用,但在描述程序界面如何展示信息时可能会用到。 #### Exists (存在) 在SQL查询中,`EXISTS`是...

    java学习的500个实例

    例如,Java程序始于`public class`关键字,主方法(main method)是程序执行的入口点。你需要熟悉IDE(集成开发环境),如Eclipse或IntelliJ IDEA,它们提供了编写、运行和调试Java代码的便利工具。 在实例中,你会...

    winrar java代码

    然而,如果你需要在Java程序中集成文件压缩功能,那么理解并使用Java版的WinRAR源代码就显得尤为重要。本文将深入探讨如何在Java中实现WinRAR的功能,并基于提供的"WinRAR.java"和"Test.java"文件来讲解相关知识点。...

    Assertions-in-java.rar_REvision_site:www.pudn.com

    在本复习资料中,我们将深入探讨Java断言的概念、用法以及其在软件开发过程中的重要性。 1. **断言概念** 断言是一种编程语句,用于声明某个点上的程序状态。它包含一个布尔表达式,该表达式预期为真。如果表达式...

    全国计算机等级考试二级Java语言程序设计考试大纲

    程序通常从`main`方法开始执行。 2. **Java类库结构**:Java类库包含了丰富的API,用于支持各种功能,如图形用户界面、网络通信、数据库访问等。 3. **Java程序开发环境结构**:Java开发工具包(JDK)提供了编译器、...

    java_编程常用英语单词_解释.pdf

    在Java中,通过调用main方法来启动程序的执行。 #### 32. Exhibit (显示, 陈列) - **拼音**: [ig'zibit] - **解释**: “Exhibit”在编程中通常指展示或呈现某种信息的行为。例如,可以使用GUI组件来展示用户界面。 ...

    Java & Android

    同时,Java程序的入口点是`public static void main(String[] args)`方法,而非C语言中的`void main()`或`int main()`函数。 #### Java的简单性与面向对象 Java通过**剔除复杂的特性**(如头文件、指针运算、多重...

    java 常用英语单词

    在Java编程语言中,了解相关的英语词汇是提升编程能力的关键。以下是一些Java中常见的英语单词及其含义: 1. `abstract` - 抽象的,用于标记类或方法,表示它们是未完成的,需要子类来具体实现。 2. `access` - ...

    Java_为LLD面试做好准备,并在面试中取得好成绩.zip

    8. **反射机制**:理解Java反射的用途,包括在运行时动态创建对象、获取类信息、调用私有方法等,以及其在设计模式中的应用。 9. **JVM优化**:探讨JVM的运行参数设置,包括堆内存大小调整、垃圾回收策略选择、类...

    新手入门写Java程序的三十个基本规则

    - 每个Java程序至少有一个`main()`方法作为程序入口。 - 删除主方法将导致程序无法运行。 ### 5. 错误处理 - 必须妥善处理异常,尤其是用户输入错误等情况。 - 使用异常处理机制来提高程序的健壮性。 ### 6. 类的...

    Java 全栈知识点问题汇总(6).pdf

    在Java全栈开发中,掌握Java新版本的特性是非常重要的,尤其是Java 8及其后续版本。Java 8引入了许多创新特性,其中最具革命性的是函数式编程的支持。函数式编程是一种编程范式,它强调将计算视为函数的组合,而不是...

    Java学习面试指南,java核心知识点总结

    14. **单元测试**:JUnit是Java中最常用的单元测试框架,掌握如何编写测试用例,使用断言进行验证,以及Mockito等工具进行模拟对象的测试。 15. **编程规范与代码质量**:理解SOLID原则,了解代码重构的方法,以及...

    java代码-java函数式编程

    在`main.java`文件中,很可能包含了使用这些函数式编程特性的示例代码,通过阅读和理解这些代码,你可以进一步巩固对Java函数式编程的理解。而`README.txt`文件可能提供了关于如何运行和测试这些代码的说明。

    117道JAVA面试题

    4. **Assertion (断言)**:Assertion是用于调试的工具,它允许程序员声明在程序执行过程中应该始终为真的条件。如果这些条件变为假,那么系统通常会抛出AssertionError,表明程序可能有错误。在开发和测试阶段启用...

    java自动录频自动操作浏览器小demo

    在这个小demo中,应该有一个包含主函数(`main`方法)的类,该函数执行整个自动化流程。脚本可能包括登录、浏览特定页面、填写表单等步骤,每一步都对应Selenium的API调用。 6. **运行与调试**: 由于项目可以...

    Idea 构建Maven 项目,AES ECB 加解密,二次开发Jmeter

    通过IDEA创建Maven项目,可以方便地管理项目结构、依赖、构建过程以及执行Maven命令。首先,你需要在IDEA中选择“New Project”,然后选择“Maven”选项,配置相关的pom.xml文件,这是Maven项目的配置中心,包含了...

    2016年10月亚信集团的java开发笔试题

    - **断言**:在 Java 中,断言语句(通过 `assert` 关键字声明)会在运行时检查某个条件是否为真。如果条件不满足,则会抛出 `AssertionError` 异常。 以上是对给定文件中提到的 Java 笔试题目的知识点总结。这些...

    Oracle认证Java SE 8程序员考纲(中文版)

    - **创建可执行Java应用**:了解如何编写带有`main`方法的Java程序。 - **命令行运行Java程序**:熟悉编译和运行Java程序的过程。 - **控制台输出**:学会使用`System.out.println()`等方法输出信息。 - **导入Java...

Global site tag (gtag.js) - Google Analytics