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");
    }
}

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


image.png

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


image.png

需要用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");
    }
}
image.png

机制研究

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

    }
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容