首页 > 编程语言 >java中Runtime类执行研究

java中Runtime类执行研究

时间:2022-10-12 14:14:10浏览次数:72  
标签:执行 java 调用 IOException main public Runtime

Runtime类

在java中一般类的调用方法是new 类();
所以我们使用new Runtime()来实例化一个Runtime类的对象

import java.io.IOException;

public class main {
    public static void main(String[] args) throws IOException {
        Runtime rt = new Runtime();
        rt.exec("calc.exe");
    }
}

但是这样执行我们会得到一个错误

 

 

 这是为什么呢,我们进入到Runtime类里研究

 

 

 

发现Runtime类其实是一个内部方法,需要用getRuntime()方法来得到Runtime的对象
所以我们需要写成静态调用的方法Runtime.getRuntime()首先获得Runtime类的对象,再调用Runtime的内部方法。

import java.io.IOException;

public class main {
    public static void main(String[] args) throws IOException {
        Runtime rt = Runtime.getRuntime();
        rt.exec("calc.exe");
    }
}

机制研究

为什么java的原生类要这样写呢?这样去调用不是很麻烦吗?
其实这种写法,在java中叫做单例模式,这种模式的出现主要是为了避免一个系统的某一种应用被多次实例化导致的安全问题
比如在Web应用中,数据的链接,我们只需要初始化一次就足够了,后面所有的应用调用数据库均使用该对象即可。
我们的代码就可以仿照Runtime类写成这样


public class Dbconnection {
    private static Dbconnection currentconnection = new Dbconnection();
    public static Dbconnection getDbconnection() {
          return currentconnection;
    }
    private Dbconnection() {
        //这里写建立数据库时使用的代码
    }
}

这样数据库在简历连接的时候就会只得到一次实例化,后面再想调用只能通过getDbConnection()方法来调用

反射的时候Runtime类的exec方法调用

研究完java的机制后,我们回到反射的机制里来,那么这样的单例模式下,我们怎么调用Runtime类的exec()方法呢
看下面的代码

import jdk.internal.org.objectweb.asm.commons.Method;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

public class main {
    public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
        Class clazz = Class.forName("java.lang.Runtime"); //初始化Runtime类
        Object rt = clazz.getMethod("getRuntime").invoke(clazz); //调用Runtime类中的getRuntime方法得到Runtime类的对象
        clazz.getMethod("exec",String.class).invoke(rt,"calc.exe"); //再次使用invoke调用Runtime类中的方法时,传递我们获得的对象,这样就可以调用

    }
}

 

 

 

标签:执行,java,调用,IOException,main,public,Runtime
From: https://www.cnblogs.com/Nzpz/p/16784306.html

相关文章

  • java中代码块执行顺序
    classa{static{System.out.println("静态代码块");}{System.out.println("构造代码块");}publica(){System.out......
  • Java--字符串使用StringTokenizer来分割字符,由小写转大写,由大写转小写
    我们再来看看Java的字符串分割另外一种方法,使用StringTokenizer 可以使用StringTokennizer设置不同分隔符来分隔字符串,其默认的分割符是:空格"",制表符(\t),换行符(......
  • java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundE
    oozie报错:java.lang.RuntimeException:java.lang.RuntimeException:java.lang.ClassNotFoundException:Classorg.apache.oozie.action.hadoop.OozieLauncherOutputCo......
  • 输入的查询SQL语句,是如何执行的?
    摘要:输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。转载原文地址本文分享自华为云社区《一条查询SQL是如何执行的-云社区-华为云》,作者:共饮一杯......
  • Java新浪微博客户端开发第四、五步
    0、Main:主函数入口;1、MainDialog:主界面;2、WeiboPanel:StatusPanel及CommentPanel的父类;3、StatusPanel:所有有关“微博”的父类......AD: 这一步是对之前进行较大的改动。......
  • java 根据 lambda 解析出原数据
    /***解析lambda表达式,该方法只是调用了{@linkSerializedLambda#resolve(SFunction)}中的方法,在此基础上加了缓存。*该缓存可能会在任意不定的时......
  • java--面向对象
    面向==对象==OO:OritenedObjectOOP:使用oo的思想进行开发。利用对象实现功能。  面向对象编程。1.封装2.继承3.多态   面向过程c vs 面向对象......
  • Java Heap
    堆堆是一种基于树的数据结构,是一种完全二叉树,堆中的所有的节点都按照特定的顺序排列。在堆数据结构中,如果任意父节点的值都大于其子节点,则会产生一个大顶堆;反之,如果任......
  • Java代码如何编写世界上最漂亮的null判断代码呢?
    转自:​​http://www.java265.com/JavaJingYan/202205/16524508473361.html​​null:  空对象,通常指一个引用对象没有在堆上产生,没有指向任何东西,  此时它就是一个nu......
  • java函数式编程
    importcom.alibaba.fastjson.JSON;importcom.ctrip.car.osd.util.LogHelper;importorg.apache.commons.collections.CollectionUtils;importjava.util.ArrayList;......