hello,笔者现在要开篇涨姿势系列了,大家跟着我一起来Java涨姿势吧哈哈

话不多说,我们进入正题,今天要讲的是反射,相信大家都已经听过,或者了解过一些,今天跟着笔者再回顾一遍:


什么是反射呢?在Google是这样说的:

java涨姿势--反射知识篇

也就是说,反射其实是可以反映,程序在运行状态的结构以及行为的。

那么为什么要用反射呢?

java涨姿势--反射知识篇

笔者觉得这段解释的很好,无论你是写框架还是在写复杂的面相对象的系统时候,无须知道某方法是否被声明,你就可以用反射去调用,这就让Java的灵活性

发挥到了极致。


那么问题来了,怎么使用反射?


Oracle官方的api提供了几种方法:

1、运行中去获取类的类型(classType)

2、运行中获取类对象

3、调用其方法或者变量(invoke)

那么我们来一一说明一下:


1、获取类的类型(Java所谓万物皆对象,那么类其实也是对象,它是什么对象呢?是java.lang.class的对象,就是说,它也会有自己的类型):

java涨姿势--反射知识篇

这就是通过Class.forName,通过传入类的包名,去找到这个类的实例,这里笔者用了getName去获取,所以抛出了ClassNotFoundException异常;

还有一种方式:

java涨姿势--反射知识篇

这是通过classname.class去获取类的实例

以及第三种方式:

java涨姿势--反射知识篇

这个是通过类的对象的getClass方法来获取类的实例;

这三种方法没有什么优劣之分,都可以使用来获取类的实例。


2、获取类的对象:获取完类的类型就可以来获取类的对象了,没有对象怎么愉快的工作(单身狗的怨念.jpg)


(1)通过class.newInstance()来获取类的对象

java涨姿势--反射知识篇

  • Creates a new instance of the class represented by thisClass object.

显然,返回的是新的对象,没什么好说;


(2)通过getConstructor获取构造器,再通过newInstance去获取,此时适用于有参数的构造函数

java涨姿势--反射知识篇

如此便获取到了对象,要注意如果原有的类的构造函数为私有的话,不能这么获取!不然会报illegalaccessexception安全异常,所以如果被反射类是私有构造的话,需要

这样写:

java涨姿势--反射知识篇

要设置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()

java涨姿势--反射知识篇

通过类实例来调用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. 
包括了从父类继承的,接口中的以及本身的公有方法

所以这个打印出来是:

java涨姿势--反射知识篇


(二)classObj.getDeclaredMethods()

java涨姿势--反射知识篇

同样通过类实例来获取方法,使用了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. 

也就是获取自身除了继承的方法

打印的结果:

java涨姿势--反射知识篇


4、获取成员变量(与获取对象原理一致):

同样是getFiled,getDeclaredField,这两者的区别于上面的第二点的区别一致,不再多说。

调用方法:那么如何使用类里面的方法呢?

java涨姿势--反射知识篇

首先使用getMethod(String name, Class<?>... parameterTypes) 来得到对应类中单的特定含参数的方法,然后调用invoke来反射这个方法,最后将方法输出返回。

总结:以上就是反射常用的方法以及例子,大家可以提出看法,反射就先讲到这里啦~~落幕撒花~~~v

相关文章:

  • 2022-12-23
  • 2021-08-14
  • 2021-06-23
  • 2022-01-12
  • 2021-11-15
  • 2022-12-23
  • 2022-12-23
  • 2022-02-26
猜你喜欢
  • 2021-08-05
  • 2021-07-28
  • 2022-01-12
  • 2021-11-20
  • 2022-12-23
相关资源
相似解决方案