反射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来修改访问权限

最新文章

  1. python黑魔法 -- 内置方法使用
  2. 实用的圆形图片控件ImageView
  3. 一看便知linux下mysql报错ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
  4. Debian MySQL 卸载和安装 PHP安装
  5. bootstrap-图文混排 media
  6. mysql JDBC URL格式
  7. Spring-如何实现事物管理的
  8. 移动开发 android 入门开发 阶段视频
  9. iOS7自定义statusbar和navigationbar的若干问题
  10. Head First HTML与CSS — 布局与定位
  11. php连接sql server 2008数据库
  12. JavaScript插件——弹出框
  13. .NET 三层架构
  14. Python3控制结构与函数
  15. 聊下 git 多账户问题
  16. kafka原理和实践(六)总结升华
  17. Python网络爬虫与信息提取(三)—— Re模块
  18. 重启网卡报错:Device eth0 does not seem to be present
  19. linux终端用户登录流程
  20. Unity3d项目入门之Rolling Ball

热门文章

  1. computed计算属性(二)
  2. Linux 内核总线注册
  3. .net webapi 文件夹上传
  4. Keras cnn 手写数字识别示例
  5. 最全最详细的PHP面试题(带有答案)
  6. Hyperledger Fabric动态配置Raft节点
  7. vue学习笔记(四)事件处理器
  8. jib-maven-plugin构建镜像
  9. .NET设计篇08-线程统一取消模型和跨线程访问UI
  10. # Okhttp解析—Interceptor详解