返回顶部
首页 > 资讯 > 精选 >Java Runtime的使用方法是什么
  • 236
分享到

Java Runtime的使用方法是什么

2023-06-22 02:06:59 236人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关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的使用方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    --结束END--

    本文标题: Java Runtime的使用方法是什么

    本文链接: https://lsjlt.com/news/301987.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Java Runtime的使用方法是什么
      这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分...
      99+
      2023-06-22
    • Java Runtime的使用详解
      目录前言1. shutdownhook2. exec执行2.1 常规命令执行2.2 管道符2.3源码分析3. 总结前言 最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分...
      99+
      2024-04-02
    • java pattern的使用方法是什么
      Java中的Pattern类是用于定义正则表达式模式的对象。它提供了一些方法来匹配、查找和替换字符串中的文本。使用Pattern类的...
      99+
      2023-09-27
      java
    • java callable使用的方法是什么
      在Java中,`Callable`接口是用于创建可返回结果并可能抛出异常的任务的一种方式。要使用`Callable`接口,您需要遵循...
      99+
      2023-10-25
      java
    • java classloader的使用方法是什么
      Java ClassLoader是Java虚拟机(JVM)的一个重要组成部分,用于加载Java类文件。ClassLoader负责将编...
      99+
      2024-04-09
      java
    • java中TagSupport使用的方法是什么
      在Java中,TagSupport类是一个抽象类,用于支持自定义标签的开发。它提供了一些方法用于处理自定义标签的各种操作。 TagS...
      99+
      2023-10-24
      java TagSupport
    • Java中JMH使用的方法是什么
      在Java中,JMH是一个用于进行Java微基准测试的工具。JMH是Java Microbenchmark Harness的缩写。它...
      99+
      2023-10-12
      Java JMH
    • Java多态的使用方法是什么
      本篇内容主要讲解“Java多态的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多态的使用方法是什么”吧!一.再探向上转型(upcasting)  将某个objec...
      99+
      2023-06-03
    • java中json的使用方法是什么
      这期内容当中小编将会给大家带来有关java中json的使用方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。josn:    一种数据传输格式,与开发语言无关,轻量级    一开始是javaScri...
      99+
      2023-06-05
    • java中mat的使用方法是什么
      在Java中,我们可以使用Mat类来表示OpenCV中的矩阵数据结构。Mat类包含了各种方法来操作和处理矩阵数据。 下面是一些常用的...
      99+
      2024-03-02
      java
    • java中try的使用方法是什么
      在Java中,try关键字用于启动异常处理机制,通常与catch和finally关键字一起使用。try块用于封装可能会抛出异常的代码...
      99+
      2024-03-05
      java
    • java中biginteger的使用方法是什么
      Java中的BigInteger类是用于表示任意精度的整数。它提供了大量的方法来对大整数进行加减乘除等操作。 下面是BigInteg...
      99+
      2024-04-08
      java
    • java中bitmap的使用方法是什么
      在Java中使用Bitmap需要先导入相关的类库,通常是android.graphics.Bitmap类。Bitmap类提供了一系列...
      99+
      2024-04-02
    • java中parse的使用方法是什么
      在Java中,parse方法通常用于将字符串解析为其他数据类型,比如将字符串解析为整数、浮点数、日期等。具体使用方法取决于要解析的数...
      99+
      2024-03-14
      java
    • java中model的使用方法是什么
      在Java中,Model通常是指表示数据的类,通常用于存储应用程序中的数据,以便在程序中进行操作和处理。 Model的使用方法通常包...
      99+
      2024-04-03
      java
    • java中linq的使用方法是什么
      在Java中,没有内置的LINQ(Language Integrated Query)语法,但可以使用第三方库,比如Stream A...
      99+
      2024-04-03
      Java linq
    • java中mono的使用方法是什么
      在Java中,可以通过使用Mono类来创建一个只包含一个元素的Mono流。Mono类是Project Reactor库中的一部分,它...
      99+
      2024-03-15
      java
    • java中case的使用方法是什么
      在Java中,case语句通常用于switch语句中,用于根据表达式的值执行不同的代码块。switch语句会根据表达式的值来匹配对应...
      99+
      2024-04-02
    • java中string的使用方法是什么
      在Java中,String是一个类,用于表示字符串。String类提供了丰富的方法来处理字符串,包括以下常用方法: 创建字符串:...
      99+
      2024-04-08
      java
    • runtime error的原因是什么
      这篇文章主要介绍“runtime error的原因是什么”,在日常操作中,相信很多人在runtime error的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”runtime error的原因是什么...
      99+
      2023-06-20
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作