• 欢迎光临~

JAVA反射Runtime类研究

开发技术 开发技术 2022-10-12 次浏览

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

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

JAVA反射Runtime类研究

 

 

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

JAVA反射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反射Runtime类研究

 

 

 

程序员灯塔
转载请注明原文链接:JAVA反射Runtime类研究
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com