java涨姿势--反射知识篇

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 thisClass 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值