java code reviewer_javaweb-codereview 学习记录-4

反射java.lang.Runtime

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

importsun.misc.IOUtils;importjava.io.InputStream;importjava.lang.reflect.Constructor;importjava.lang.reflect.Method;public classreflect_runtime {private static Object cmd="calc";public static void main (String args[]) throwsException {//获取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该类的实例。

2abe95206e6b5934d1212cf96f5fe4a1.png

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

5498ddbea7da81bc3a8d1a2603288a0e.png

a92c0deaf9ade75968f1351f8b9fde3e.png

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

反射调用类方法

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

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

反射调用成员变量

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

getField和getDeclaredField的区别同getMethod和getDeclaredMethod

获取成员变量值:

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

修改成员变量值:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值