我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java Runtime的使用方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java Runtime的使用方法是什么

这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

    前言

    最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分框架运行lock文件,这里就想到了shutdownhook,顺便学了学Runtime的使用

    1. shutdownhook

    demo示例,证明在程序正常结束的时候会调用,如果kill -9 那肯定就不会调用了

    public class ShutdownHookTest {     public static void main(String[] args) {        System.out.println("==============application start================");         Runtime.getRuntime().addShutdownHook(new Thread(()->{            System.out.println("--------------hook 1----------------");        }));        Runtime.getRuntime().addShutdownHook(new Thread(()->{            System.out.println("--------------hook 2----------------");        }));         System.out.println("==============application end================");    }}

    正常运行结束,结果如下

    ==============application start================
    ==============application end================
    --------------hook 1----------------
    --------------hook 2----------------

    Process finished with exit code 0

    如果暂停,点击下图左下角的正方形红图标,停止正在运行的应用

    Java Runtime的使用方法是什么

    结果如下,shutdownhook已执行。

    Java Runtime的使用方法是什么

    shutdownhook可以处理程序正常结束的时候,删除文件,关闭连接等

    2. exec执行

    2.1 常规命令执行

    demo示例如下,比如ls

    public class ShutdownHookTest {     public static void main(String[] args) throws InterruptedException, IOException {        Process process = Runtime.getRuntime().exec("ls");         try (InputStream fis = process.getInputStream();             InputStreamReader isr = new InputStreamReader(fis);             BufferedReader br = new BufferedReader(isr)) {            String line;            while ((line = br.readLine()) != null) {                System.out.println(line);            }        }    }}

    结果如下

    Java Runtime的使用方法是什么

    而正常执行结果

    Java Runtime的使用方法是什么

    但是这个方法有远程执行风险,即在浏览器端通过这个方法执行特定指令,比如执行rm -rf *,结果就很……

    2.2 管道符

    但是遇见管道符之后就会失效,什么办法解决,sh -c,但是不能直接用,否则获取到的是TTY窗口信息

    public static void main(String[] args) throws IOException {        Process process = Runtime.getRuntime().exec("sh -c ps aux|grep java");         try (InputStream fis = process.getInputStream();             InputStreamReader isr = new InputStreamReader(fis);             BufferedReader br = new BufferedReader(isr)) {            String line;            while ((line = br.readLine()) != null) {                System.out.println(line);            }        }    }

    结果????

    Java Runtime的使用方法是什么

    sh -c的参数要分离,不然runtime会认为是一个参数

    Java Runtime的使用方法是什么

    2.3源码分析

    跟踪代码,使用ProcessImpl来执行指令

    public Process exec(String[] cmdarray, String[] envp, File dir)        throws IOException {        return new ProcessBuilder(cmdarray)            .environment(envp)            .directory(dir)            .start();    }

    ProcessBuilder

    // Only for use by ProcessBuilder.start()    static Process start(String[] cmdarray,                         java.util.Map<String,String> environment,                         String dir,                         ProcessBuilder.Redirect[] redirects,                         boolean redirectErrorStream)        throws IOException    {        assert cmdarray != null && cmdarray.length > 0;         // Convert arguments to a contiguous block; it's easier to do        // memory management in Java than in C.        byte[][] args = new byte[cmdarray.length-1][];        int size = args.length; // For added NUL bytes        for (int i = 0; i < args.length; i++) {            args[i] = cmdarray[i+1].getBytes();            size += args[i].length;        }        byte[] argBlock = new byte[size];        int i = 0;        for (byte[] arg : args) {            System.arraycopy(arg, 0, argBlock, i, arg.length);            i += arg.length + 1;            // No need to write NUL bytes explicitly        }         int[] envc = new int[1];        byte[] envBlock = ProcessEnvironment.toEnvironmentBlock(environment, envc);         int[] std_fds;         FileInputStream  f0 = null;        FileOutputStream f1 = null;        FileOutputStream f2 = null;         try {            if (redirects == null) {                std_fds = new int[] { -1, -1, -1 };            } else {                std_fds = new int[3];                 if (redirects[0] == Redirect.PIPE)                    std_fds[0] = -1;                else if (redirects[0] == Redirect.INHERIT)                    std_fds[0] = 0;                else {                    f0 = new FileInputStream(redirects[0].file());                    std_fds[0] = fdAccess.get(f0.getFD());                }                 if (redirects[1] == Redirect.PIPE)                    std_fds[1] = -1;                else if (redirects[1] == Redirect.INHERIT)                    std_fds[1] = 1;                else {                    f1 = new FileOutputStream(redirects[1].file(),                                              redirects[1].append());                    std_fds[1] = fdAccess.get(f1.getFD());                }                 if (redirects[2] == Redirect.PIPE)                    std_fds[2] = -1;                else if (redirects[2] == Redirect.INHERIT)                    std_fds[2] = 2;                else {                    f2 = new FileOutputStream(redirects[2].file(),                                              redirects[2].append());                    std_fds[2] = fdAccess.get(f2.getFD());                }            }         return new UNIXProcess            (toCString(cmdarray[0]),             argBlock, args.length,             envBlock, envc[0],             toCString(dir),                 std_fds,             redirectErrorStream);        } finally {            // In theory, close() can throw IOException            // (although it is rather unlikely to happen here)            try { if (f0 != null) f0.close(); }            finally {                try { if (f1 != null) f1.close(); }                finally { if (f2 != null) f2.close(); }            }        }    }

    new UNIXProcess 环境

     final class UNIXProcess extends Process {

    3. 总结

    Runtime用处非常多,偏底层

    比如gc调用

    Java Runtime的使用方法是什么

    加载jar文件

    Java Runtime的使用方法是什么

    Runtime功能强大,但需要合理利用,很多攻击是通过Runtime执行的漏洞

    但是使用shutdownhook还是很方便的,用来做停止任务的后续处理。

    关于Java Runtime的使用方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java Runtime的使用方法是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java Runtime的使用方法是什么

    这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分框架运行l
    2023-06-22

    Java 中 contains 方法的使用方法究竟是什么?(java中contains的使用方法是什么)

    在Java编程中,contains方法是一个非常常用且重要的方法,它主要用于判断一个集合(如List、Set等)中是否包含特定的元素。下面我们将详细介绍contains方法在Jav
    Java 中 contains 方法的使用方法究竟是什么?(java中contains的使用方法是什么)
    Java2024-12-18

    Java 中 mono 的使用方法究竟是什么?(java中mono的使用方法是什么)

    在Java编程中,mono是一个相对较新的概念,但它在异步编程和响应式编程中扮演着重要的角色。本文将详细介绍Java中mono的使用方法,帮助你更好地理解和应用这一特性。一、什么是mono?
    Java 中 mono 的使用方法究竟是什么?(java中mono的使用方法是什么)
    Java2024-12-21

    Java 中 xfire 的使用方法究竟是什么?(java中xfire的使用方法是什么)

    在Java开发中,xfire是一个非常实用的Web服务框架,它提供了一种简单而有效的方式来创建和使用Web服务。本文将详细介绍Java中xfire的使用方法,帮助你更好地理解和应用这个框架。一、xfire简介xfire是一个基于Java的开源W
    Java 中 xfire 的使用方法究竟是什么?(java中xfire的使用方法是什么)
    Java2024-12-16

    Java ldap 的使用方法究竟是什么?(Java ldap的用法是什么)

    在Java开发中,LDAP(LightweightDirectoryAccessProtocol)是一种用于访问和操作目录服务的协议。它提供了一种方式来存储和管理分布式的信息,如用户、组、组织单元等。以下是关于JavaLDAP的用法的详细介绍。一
    Java ldap 的使用方法究竟是什么?(Java ldap的用法是什么)
    Java2024-12-20

    java callable使用的方法是什么

    在Java中,`Callable`接口是用于创建可返回结果并可能抛出异常的任务的一种方式。要使用`Callable`接口,您需要遵循以下步骤:1. 创建一个实现`Callable`接口的类,并实现`call()`方法。`call()`方法是
    2023-10-25

    java classloader的使用方法是什么

    Java类加载器使用方法Java类加载器负责加载、链接和初始化类,确保应用程序加载正确的类并防止冲突。使用步骤:加载:从存储库读取类二进制表示。链接:连接类和解析符号引用。初始化:调用静态初始化程序。类型:引导类加载器:加载核心类库。扩展类加载器:加载扩展类路径中的类。系统类加载器:加载系统类路径中的类。自定义类加载器:由开发人员创建。使用:使用默认类加载器。创建自定义类加载器。设置类加载器。最佳实践:使用默认类加载器。仅在需要时创建自定义类加载器。考虑类加载委托的性能影响。测试自定义类加载器的行为。
    java classloader的使用方法是什么
    2024-04-12

    java classloader的使用方法是什么

    Java ClassLoader是Java虚拟机(JVM)的一个重要组成部分,用于加载Java类文件。ClassLoader负责将编译后的Java类文件加载到内存中,并在运行时实例化这些类。使用ClassLoader可以实现动态加载类、实现
    java classloader的使用方法是什么
    2024-04-09

    java pattern的使用方法是什么

    Java中的Pattern类是用于定义正则表达式模式的对象。它提供了一些方法来匹配、查找和替换字符串中的文本。使用Pattern类的一般步骤如下:1. 创建一个Pattern对象:使用Pattern类的`compile()`方法,将正则表达
    2023-09-27

    Java 中 case 的具体使用方法究竟是什么?(java中case的使用方法是什么)

    在Java编程中,case语句主要用于switch语句中,用于根据不同的条件执行不同的代码块。以下是关于Java中case使用方法的详细介绍。一、基本语法
    Java 中 case 的具体使用方法究竟是什么?(java中case的使用方法是什么)
    Java2024-12-22

    Java 枚举类的使用方法究竟是什么?(java枚举类的使用方法是什么)

    在Java编程中,枚举类(EnumerationClass)是一种特殊的类,它用于定义一组常量。枚举类提供了一种更安全、更易于维护的方式来表示一组相关的常量。本文将详细介绍Java枚举类的使用方法,包括定义枚举类、使用枚举类常量、实现枚举类的方法等方面。
    Java 枚举类的使用方法究竟是什么?(java枚举类的使用方法是什么)
    Java2024-12-15

    Java 中 Math.abs 的具体使用方法究竟是什么?(java中math.abs的使用方法是什么)

    在Java编程中,Math.abs是一个非常常用的方法,用于获取一个数值的绝对值。绝对值在数学中表示一个数在数轴上离原点的距离,而在编程中,它常用于处理各种需要考虑数值正负性的情况。一、Math.abs的基本语法
    Java 中 Math.abs 的具体使用方法究竟是什么?(java中math.abs的使用方法是什么)
    Java2024-12-16

    Java 中 mat 的具体使用方法究竟是什么?(java中mat的使用方法是什么)

    在Java编程中,mat(可能是指特定的库、工具或自定义类)的使用方法对于开发者来说是非常重要的。以下是关于Java中mat的使用方法的详细介绍。一、导入相关库和包在使
    Java 中 mat 的具体使用方法究竟是什么?(java中mat的使用方法是什么)
    Java2024-12-15

    java中string的使用方法是什么

    在Java中,String是一个类,用于表示字符串。String类提供了丰富的方法来处理字符串,包括以下常用方法:创建字符串:可以使用双引号(“”)来创建字符串,也可以使用String类的构造方法来创建字符串对象。连接字符串:可以使用"+"
    java中string的使用方法是什么
    2024-04-08

    Java中JMH使用的方法是什么

    在Java中,JMH是一个用于进行Java微基准测试的工具。JMH是Java Microbenchmark Harness的缩写。它提供了一种简单且可靠的方法来测量和评估Java代码的性能。JMH使用的方法包括:1. @Benchmark注
    2023-10-12

    Java多态的使用方法是什么

    本篇内容主要讲解“Java多态的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多态的使用方法是什么”吧!一.再探向上转型(upcasting) 将某个object ref
    2023-06-03

    java中TagSupport使用的方法是什么

    在Java中,TagSupport类是一个抽象类,用于支持自定义标签的开发。它提供了一些方法用于处理自定义标签的各种操作。TagSupport类中常用的方法包括:doStartTag():用于处理标签开始的操作。在此方法中,可以执行一些初
    2023-10-24

    java中try的使用方法是什么

    在Java中,try关键字用于启动异常处理机制,通常与catch和finally关键字一起使用。try块用于封装可能会抛出异常的代码块,如果try块中的代码抛出了异常,程序会跳转到与异常匹配的catch块进行异常处理。finally块用于执
    java中try的使用方法是什么
    2024-03-05

    java中mono的使用方法是什么

    在Java中,可以通过使用Mono类来创建一个只包含一个元素的Mono流。Mono类是Project Reactor库中的一部分,它是一种响应式编程的概念,用于处理异步操作。下面是一个简单的示例,演示了如何在Java中使用Mono:Mo
    java中mono的使用方法是什么
    2024-03-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录