javaweb-codereview 学习记录-4

反射java.lang.Runtime

以前在p牛的知识星球中也学过反射机制调用Runtime来执行命令时须要用getruntime来返回Runtime类的实例,由于Runtime类设计是单例模式,而且该类的构造方法是私有的,所以没法直接经过newinstance来实例化该类,所以除了经过getRuntime来返回类的实例来调用该类的方法外,还能够经过反射直接获取该类的构造方法而且设置访问属性来实例化该类。java

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就能够得到类的全部的构造函数,返回为数组,就能够进行更多操做。spa

反射调用类方法

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

经过Method.invoke()反射调用方法时,invoke函数的第一个参数通常为反射调用的类的实例,第二个开始即为传入的参数,可是若是调用的是类的静态方法,则第一个参数能够为null,由于调用类的静态方法不须要实例化该类。code

反射调用成员变量

经过getDeclaredField就可以拿到该类全部的成员变量。对象

getFieldgetDeclaredField的区别同getMethodgetDeclaredMethodblog

 获取成员变量值:get

Object obj = field.get(类实例对象);
修改为员变量值:
field.set(类实例对象, 修改后的值);

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

相关文章
相关标签/搜索