栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

获取Runtime类对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取Runtime类对象

获取Runtime类对象的相关代码分析

文章目录
  • 获取Runtime类对象的相关代码分析
    • 很重要的知识点
    • getMethod和invoke
    • 获取Runtime类对象
    • 另一种写法

本文参考P佬的java安全漫谈

很重要的知识点

invoke的作用是执行方法,它的第一个参数是

  1. 如果这个方法是一个普通方法,那么第一个参数是类对象
  2. 如果这个方法是一个静态方法,那么第一个参数是类
getMethod和invoke

这里对getMethod和invoke进行分析

getMethod 的作用是通过反射获取一个类的某个特定的公有方法。Java支持类的重载,我们不能仅通过函数名来确定一个函数。所以,在调用 getMethod 的时候,我们需要 传给他你需要获取的函数的参数类型列表。

Runtime.exec有6个重载

我们使用第一个

getMethod("exec",String.class)来获取Runtime.exec方法

invoke的作用是执行方法,它的第一个参数是

  1. 如果这个方法是一个普通方法,那么第一个参数是类对象
  2. 如果这个方法是一个静态方法,那么第一个参数是类

exec是一个普通方法,所以最终第一个参数是类对象

获取Runtime类对象

但是我们怎么获取Runtime的一个类对象呢?

根据上面的分析,我们可以通过getRuntime()方法获取一个Runtime类对象

而调用getRuntime需要用到getMethod方法,得到Method之后,进行invoke调用

但是这个getRuntime方法是静态方法,invoke()中的参数是类,而不是类对象

所以下文中invoke里面的是clazz,是一个类

//获取Runtime类
Class clazz = Class.forName("java.lang.Runtime");
//获取getRuntime方法
Method getRunimeMethod = clazz.getMethod("getRuntime");
//通过调用getRuntime获取Runtime类对象
Object runtime = getRunimeMethod.invoke(clazz);

然后最终exec去用invoke的时候,用的是Runtime类对象

Method execMethod = clazz.getMethod("exec", String.class);
execMethod.invoke(runtime, "calc.exe");

调用计算器全部的代码

//获取Runtime类
Class clazz = Class.forName("java.lang.Runtime");
//获取getRuntime方法
Method getRunimeMethod = clazz.getMethod("getRuntime");
//通过调用getRuntime获取Runtime类对象
Object runtime = getRunimeMethod.invoke(clazz);
//获取exec方法
Method execMethod = clazz.getMethod("exec", String.class);
//invoke执行方法
execMethod.invoke(runtime, "calc");

执行结果

另一种写法
Class clazz = Class.forName("java.lang.Runtime");
clazz.getMethod("exec",String.class).invoke(clazz.getMethod("getRuntime").invoke(clazz),"calc");

注意上面这个代码,其实是5行代码的简写

第二行可以分为clazz.getMethod("exec",String.class)和invoke(clazz.getMethod("getRuntime").invoke(clazz),"calc");

前者是获取exec方法

后者是invoke里面的参数,因为exec是一个普通方法,不是静态方法,所以invoke的第一个参数需要是一个Runtime类对象

clazz.getMethod("getRuntime").invoke(clazz)就是一个Runtime类对象,是通过调用getRuntime方法来获取一个Runtime类对象,因为getRuntime是一个静态方法,invoke的第一个参数是类而不是类对象

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/915190.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号