java中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类中的方法时,传递我们获得的对象,这样就可以调用
}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理