广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/301987.html(转载时请注明来源链接)

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

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • Java Runtime的使用方法是什么
      这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分...
      99+
      2023-06-22
    • java pattern的使用方法是什么
      Java中的Pattern类是用于定义正则表达式模式的对象。它提供了一些方法来匹配、查找和替换字符串中的文本。使用Pattern类的...
      99+
      2023-09-27
      java
    • java callable使用的方法是什么
      在Java中,`Callable`接口是用于创建可返回结果并可能抛出异常的任务的一种方式。要使用`Callable`接口,您需要遵循...
      99+
      2023-10-25
      java
    • Java中JMH使用的方法是什么
      在Java中,JMH是一个用于进行Java微基准测试的工具。JMH是Java Microbenchmark Harness的缩写。它...
      99+
      2023-10-12
      Java JMH
    • java中TagSupport使用的方法是什么
      在Java中,TagSupport类是一个抽象类,用于支持自定义标签的开发。它提供了一些方法用于处理自定义标签的各种操作。 TagS...
      99+
      2023-10-24
      java TagSupport
    • java中json的使用方法是什么
      这期内容当中小编将会给大家带来有关java中json的使用方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。josn:    一种数据传输格式,与开发语言无关,轻量级    一开始是javaScri...
      99+
      2023-06-05
    • Java多态的使用方法是什么
      本篇内容主要讲解“Java多态的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多态的使用方法是什么”吧!一.再探向上转型(upcasting)  将某个objec...
      99+
      2023-06-03
    • java super()方法的用法是什么
      Java中的super()方法用于调用父类的构造方法。它必须作为子类构造方法的第一行语句出现,用于显式调用父类的构造方法以完成父类的...
      99+
      2023-10-23
      java
    • Java枚举类的使用方法是什么
      本篇内容介绍了“Java枚举类的使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 枚举类有哪些特点创建一个ColorEnum的...
      99+
      2023-06-16
    • java方法的作用是什么
      Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”当中,并且起一个名字。使用...
      99+
      2017-04-12
      java 方法
    • java的方法是什么
      java的方法就是一段可以被重复调用的代码块,实现一种特定的功能。方法的定义包括两部分:方法头和方法体。 (推荐学习:java课程)方法头{ 具体的内容 }方法头可以由方法的类型,名称和名称之后的括号以及有参数的列表组...
      99+
      2016-07-25
      java入门 java
    • java中tostring方法的用法是什么
      在Java中,toString方法是一个被所有类继承的方法,它用来返回一个表示对象内容的字符串。默认情况下,toString方法返回...
      99+
      2023-10-18
      java
    • java使用注解加锁的方法是什么
      在Java中,可以使用注解加锁的方法有以下几种方式: 使用synchronized关键字:可以在方法的定义上添加synchron...
      99+
      2023-10-28
      java
    • java类的定义和使用方法是什么
      在Java中,类是一种用户自定义的数据类型,用于描述具有相同属性和行为的对象。类的定义包括类名、类的成员变量和方法。类的定义方法如下...
      99+
      2023-09-15
      java
    • Java之System.getProperty()的作用及使用方法是什么
      今天小编给大家分享一下Java之System.getProperty()的作用及使用方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2023-07-05
    • java 什么是方法
      java 什么是方法 Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合,方法包含于类或对象中,方法在程序中被创建,在其他地方被引用。方法的优点 使程序变得更简短而清晰。 有利于程序维护。 可以提高程...
      99+
      2016-09-14
      java 方法
    • java方法是什么
      什么是方法呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的...
      99+
      2015-08-24
      java
    • java方法是什么?
      java中方法是什么?Java方法是语句的集合,它们在一起执行一个功能。 ● 方法是解决一类问题的步骤的有序组合 ● 方法包含于类或对象中 ● 方法在程序中被创建,在其他地方被引用Java方法的优点使程序变得更简短而清晰。有利于程序维护。可...
      99+
      2019-08-21
      java教程 java 方法
    • java ffmpeg调用的方法是什么
      Java中调用FFmpeg的方法是使用Java的外部命令执行功能来执行FFmpeg命令。 可以使用Java的ProcessBuild...
      99+
      2023-10-23
      java ffmpeg
    • golang调用java的方法是什么
      在Go语言中调用Java方法可以通过使用Go的Java调用库,例如gojni或gojava。这些库允许Go代码与Java代码进行交互...
      99+
      2023-10-27
      java golang
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作