hello,笔者现在要开篇涨姿势系列了,大家跟着我一起来Java涨姿势吧哈哈
话不多说,我们进入正题,今天要讲的是反射,相信大家都已经听过,或者了解过一些,今天跟着笔者再回顾一遍:
什么是反射呢?在Google是这样说的:
也就是说,反射其实是可以反映,程序在运行状态的结构以及行为的。
那么为什么要用反射呢?
笔者觉得这段解释的很好,无论你是写框架还是在写复杂的面相对象的系统时候,无须知道某方法是否被声明,你就可以用反射去调用,这就让Java的灵活性
发挥到了极致。
那么问题来了,怎么使用反射?
Oracle官方的api提供了几种方法:
1、运行中去获取类的类型(classType)
2、运行中获取类对象
3、调用其方法或者变量(invoke)
那么我们来一一说明一下:
1、获取类的类型(Java所谓万物皆对象,那么类其实也是对象,它是什么对象呢?是java.lang.class的对象,就是说,它也会有自己的类型):
这就是通过Class.forName,通过传入类的包名,去找到这个类的实例,这里笔者用了getName去获取,所以抛出了ClassNotFoundException异常;
还有一种方式:
这是通过classname.class去获取类的实例
以及第三种方式:
这个是通过类的对象的getClass方法来获取类的实例;
这三种方法没有什么优劣之分,都可以使用来获取类的实例。
2、获取类的对象:获取完类的类型就可以来获取类的对象了,没有对象怎么愉快的工作(单身狗的怨念.jpg)
(1)通过class.newInstance()来获取类的对象
-
Creates a new instance of the class represented by this
Class
object.
显然,返回的是新的对象,没什么好说;
(2)通过getConstructor获取构造器,再通过newInstance去获取,此时适用于有参数的构造函数
如此便获取到了对象,要注意如果原有的类的构造函数为私有的话,不能这么获取!不然会报illegalaccessexception安全异常,所以如果被反射类是私有构造的话,需要
这样写:
要设置Accessible去压制Java的访问权限问题,此方法说明是:A value of true indicates that the reflected object should suppress Java language access checking when it is used.
也就是当设置为true的时候,对权限进行压制。
3、获取类的方法:
获取方法也是有两种方式的:
(1)classObj.getMethods()
通过类实例来调用getMethods()方法,此方法返回的是
-
Returns an array containing
Method
objects reflecting all the public methods of the class or interface represented by thisClass
object, -
including those declared by the class or interface and those inherited from superclasses and superinterfaces.
所以这个打印出来是:
(二)classObj.getDeclaredMethods()
同样通过类实例来获取方法,使用了getDeclaredMethods()来返回,返回的是:
-
Returns an array containing
Method
objects reflecting all the declared methods of the class or interface represented by thisClass
object, -
including public, protected, default (package) access, and private methods, but excluding inherited methods.
也就是获取自身除了继承的方法
打印的结果:
4、获取成员变量(与获取对象原理一致):
同样是getFiled,getDeclaredField,这两者的区别于上面的第二点的区别一致,不再多说。
调用方法:那么如何使用类里面的方法呢?
首先使用getMethod(String name, Class<?>... parameterTypes) 来得到对应类中单的特定含参数的方法,然后调用invoke来反射这个方法,最后将方法输出返回。
总结:以上就是反射常用的方法以及例子,大家可以提出看法,反射就先讲到这里啦~~落幕撒花~~~v