通过Java反射调用类

通过Java反射调用类

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:My Eclipse 10  ,Java

作者:陈显其      

撰写时间:2019/5/6

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Java的反射机制可以获取并调用任意一个类的方法和属性,包括私有的属性和方法,在对一个类进行反射操作时,首先要把这个类加载进来,加载类的方法有已下几种,根据个人情况用(有异常需要抛出或者处理)

把类加载进来后,可以通过getConstructors方法(不能获取私有)或者getDeclarConstructors方法(可以获取私有)把构造器拿到,然后放到一个 Constructor<?>[]数组里,把这个数组遍历输出后就可以获取到它的构造器了

类里的方法和成员变量的获取也差不多,只不过存放的数组和获取方法的方法名不同,方法存放的数组是Method[]数组,获取方法是getDeclaredMethods(能获取私有)和.getMethods(不能获取私有)方法获取多了获取方法的返回类型,变量存放的数组是Field[]数组,方法是getDeclaredFields(私有获取)和getFields,变量多了变量类型,都要用for循环遍历

方法获取的具体代码如下

变量获取的具体代码如下

这样,这个类里有什么都知道了,然后根据需要把想要的构造器或者方法或者变量调用就方便了,通过反射调用构造器去实例化一个实例,通过getConstructor(形参类型)方法的形参类型去分辨要实例的构造器(有异常需要抛出或者处理)用newInstance方法把形参的值传过去,这样子,就把构造器给调用了。

getConstructor方法无法调用私有的构造器,如果想要调用私有构造器就要使用 getDeclaredConstructor 方法,然后需要用setAccessible(true)把封装打破,让程序有权限去访问私有的东西,后面的就和之前的代码一样了。

方法和变量的调用也基本差不多,和构造器的调用一样,有两个方法,一个可以调用私有的东西,一个不能调用私有的东西,方法要用getMethod和getDeclaredMethod,变量用getField和getDeclaredField,调用私有的东西时一定要先打破封装,否则无法访问,

在调用方法的时候,getDeclaredMethod方法比构造器调用的时候的第一个形参是方法的名称, 调用方法时invoke里的第一个参数是实例,后面的是方法需要的形参变量,变量用set,一样要实例,后面的才是赋予变量的值。全代码运行结果如下