javaweb-codereview 学习记录-4

简介: javaweb-codereview 学习记录-4

反射java.lang.Runtime

之前在p牛的知识星球中也学过反射机制调用Runtime来执行命令时需要用getruntime来返回Runtime类的实例,因为Runtime类设计是单例模式,并且该类的构造方法是私有的,因此无法直接通过newinstance来实例化该类,因此除了通过getRuntime来返回类的实例来调用该类的方法外,还可以通过反射直接获取该类的构造方法并且设置访问属性来实例化该类。

import sun.misc.IOUtils;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class reflect_runtime {
    private static Object cmd="calc";
    public static void main (String args[]) throws Exception {
        // 获取Runtime类对象
        Class runtimeClass1 = Class.forName("java.lang.Runtime");
// 获取构造方法
        Constructor constructor = runtimeClass1.getDeclaredConstructor();
        constructor.setAccessible(true);
// 创建Runtime类示例,等价于 Runtime rt = new Runtime();
        Object runtimeInstance = constructor.newInstance();
// 获取Runtime的exec(String cmd)方法
        Method runtimeMethod = runtimeClass1.getMethod("exec", String.class);
// 调用exec方法,等价于 rt.exec(cmd);
        Process process = (Process) runtimeMethod.invoke(runtimeInstance, cmd);
    }
}

上面的代码注释已经解释的非常清楚了,此时可以通过class类型对象的getDeclaredConstructor()返回类的无参数构造方法,然后再通过setAccessible(true)来修改该构造方法的访问属性,从而方便接下来通过该构造器来newInstance该类的实例。

而这里getRuntime返回的就是该类的实例

getConstructor和getDeclareConstructor都可以获得类的构造方法,区别是后者可以拿到类的私有构造方法,而前者不行,所以一般来说要拿到类的构造方法都用前者,当然如果一个类有多个构造方法,那么取其构造方法时可以加上其方法的入口参数类型,和反射调用函数较为类似,那么getDeclareConstructors就可以获得类的所有的构造函数,返回为数组,就可以进行更多操作。

反射调用类方法

这一点在p牛的知识星球中也有,通过class类型的对象来调用类的方法,当然这里也有两种方式,getMethod和getDeclareMethod都能够获取到类成员方法,区别在于getMethod只能获取到当前类和父类的所有有权限的方法(如:public修饰的方法),而getDeclareMethod能获取到当前类的所有成员方法(不包含父类)。

通过Method.invoke()反射调用方法时,invoke函数的第一个参数一般为反射调用的类的实例,第二个开始即为传入的参数,但是如果调用的是类的静态方法,则第一个参数可以为null,因为调用类的静态方法不需要实例化该类。

反射调用成员变量

通过getDeclaredField就能够拿到该类所有的成员变量。

getFieldgetDeclaredField的区别同getMethodgetDeclaredMethod

获取成员变量值:

Object obj = field.get(类实例对象);

修改成员变量值:

field.set(类实例对象, 修改后的值);

同理这里修改类似private修饰的变量时也可以使用setAccessible来修改访问权限

相关文章
|
2月前
|
NoSQL Java MongoDB
墙裂推荐!超全SpringBoot2.x的奇技淫巧,满足你一切开发需求
一个小伙伴最近参加某一线互联网公司的面试,被问到了一些Spring Boot源码的问题,看看大家能否答出来:
|
Web App开发 人工智能 小程序
爆肝熬夜开发了一个SpringBoot活动管理系统,现在开源给你!毕设面试学习都不愁了!
基于springboot的小程序系统,前台是小程序,后台用springboot开发的,源码进行开源。系统和奈斯,前台面向的是用户,可以进行登录、注册、在线预约活动、公告查看、活动分类查看等
308 0
爆肝熬夜开发了一个SpringBoot活动管理系统,现在开源给你!毕设面试学习都不愁了!
|
12月前
|
监控 Java 测试技术
JAVA项目开发从0到1的心路历程
JAVA项目开发是一个复杂而有挑战性的过程,它需要经历从项目规划到需求分析、设计、编码、测试、部署和维护等多个阶段。下面我将分享一下从0到1的心路历程。
322 0
|
JavaScript 前端开发 Go
重学JavaWeb第三天(五)
重学JavaWeb第三天
145 0
重学JavaWeb第三天(五)
|
前端开发 JavaScript 程序员
重学JavaWeb第三天(十一)
重学JavaWeb第三天(十一)
62 0
|
存储 JavaScript 前端开发
重学JavaWeb第三天(三)
重学JavaWeb第三天
141 0
|
Web App开发 开发框架 JavaScript
重学JavaWeb第三天(七)
重学JavaWeb第三天(七)
161 0
|
JavaScript 前端开发
重学JavaWeb第三天(十)
重学JavaWeb第三天(十)
171 0
|
JavaScript 前端开发
重学JavaWeb第三天(二)
重学JavaWeb第三天
149 0
|
XML 前端开发 架构师
圣诞节熬夜整理一套SSM模板,让你可以快速搭建环境(七)
九、修改删除书籍 添加日志功能 十、查询框
圣诞节熬夜整理一套SSM模板,让你可以快速搭建环境(七)

热门文章

最新文章