Java反射机制学习
反射机制介绍
在程序运行时,对于一个类,我们可以获取这个类的所有属性和方法并进行调用,这种动态执行程序的过程我们称之为Java的反射机制。
反射常见函数介绍
- forname/getClass:根据类型获取一个类
- newInstance:实例化类的对象
- getConstructor:获取构造函数
- getMethod:获取类的方法
- invoke:执行函数的方法
获取Class的三种方式
给出示例类
1 | class User implements Serializable { |
我们可以用以下的三种来获取class
点运算符获取
在已知类名的情况下,可以直接使用类名.class来获取class
1 | System.out.println(User.class); |
getClass获取
若已经存在实例化对象,可以使用对象.getClass()来获取class
1 | User a = new User("yd0ng",18); |
forname获取
已知类名的情况下,可以通过forname函数来获取类
1 | Class clz = Class.forName("User"); |
运行结果均为
通过反射实例化对象
1 | Class clz = Class.forName("User"); |
首先获取User类,然后通过getConstruction方法得到具有String和int的构造函数,并以此构造函数实例化对象,传入参数即可。
通过反射调用公有方法
1 | Class clz = Class.forName("User"); |
首先获取ShowInfo方法,然后调用invoke来执行方法,invoke传入通过反射实现的对象即可
通过反射调用私有方法
将ShowInfo函数改为私有,反射代码如下
1 | Class clz = Class.forName("User"); |
Java类的初始化调用顺序
样例代码
1 | public class Initorder { |
会发现先调用的是static,然后是代码块,最后是构造函数
Tricks
- 单例模式调用私有函数无法执行命令,可以寻找一个类的公有方法执行,结合类的重载来执行函数或者执行命令
- 没有无参构造方法,可以借助getConstructor来构造有参实例,参照上面例子
- 调用私有方法,借助getDeclare系列来进行进行反射,参照上面例子
参考资料
- P牛小圈子《Java安全漫谈-反射篇》
- https://blog.csdn.net/GuoCong666/article/details/79131280
- https://blog.csdn.net/Handsome_fan/article/details/54862873
- https://blog.csdn.net/Ivorybeach/article/details/80621945
本文作者:
yd0ng
本文链接: https://yd0ng.github.io/2020/08/07/Java%E5%8F%8D%E5%B0%84%E5%AD%A6%E4%B9%A0/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://yd0ng.github.io/2020/08/07/Java%E5%8F%8D%E5%B0%84%E5%AD%A6%E4%B9%A0/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!