首页 > 编程语言 >JAVA反射Runtime类研究

JAVA反射Runtime类研究

时间:2022-10-12 11:45:29浏览次数:53  
标签:反射 调用 JAVA IOException main java Runtime public

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,java,Runtime,public
From: https://www.cnblogs.com/Nzpz/p/16783953.html

相关文章

  • 关于Java中length、length()、size()的区别
    以前总是觉得自己好像会了,但是某天忽然面对这个笔试题还是会恍惚一下,混淆和答错的几率也很大,不知道有没有其他人像我一样的。所以今天把这个问题记一下,希望印象更深刻。......
  • WebAssembly01--在JavaScript中读写C/C++内存
    编译选项emccmem.cc-omem.jsmem.cc#include"util.h"intg_int=42;doubleg_double=3.1415926;EM_PORT_API(int*)get_int_ptr(){return&g_int;}EM_PO......
  • java 实现接口频次限制
    1、添加依赖<dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</versio......
  • Java控制台简易计算器(两数运算)
    Java控制台简易计算器(两数运算)源代码使用while循环,Scanner方法,Switch语句实现交互效果packagecom.ge.method;importjava.util.Scanner;publicclassDemo04{......
  • java笔记
    代码规范命名规范项目名:见名知意,英文,小写包名:公司反域名;小写类名:见名知意,驼峰原则,不能有特殊符号,支持_,数字不能放开头类名如果有多个单词,每个单词大......
  • Java 做项目能用到 Map 哪些功能?这篇总结全了
    在Java的集合框架里除了Collection类族外还有Map类族,在Java中Collection类族表示存储着对象的各种集合数据结构,而Map类族则表示存储着键值对的映射表数据结构。......
  • Java基础(三)| switch、循环及Random详解
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • 力扣350(java&python)-两个数组的交集 II(简单)
    题目:给你两个整数数组 nums1和nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑......
  • java求最大递增子序列算法
    求最大递增子序列:packagecom.test.algorithm;importjava.util.Arrays;/***CreatedbyAdministratoron2022/10/12.*/publicclassMaxIncrSub{/*......
  • 尚硅谷-JavaWeb Day8 Filter、Json、Ajax
    1.Filter过滤器(JavaEE的规范,也是接口)作用:拦截请求、过滤响应;(应用于权限检查、日记操作、事务管理等等)①基本使用(通过判断session域中是否包含用户信......