Java-面试-基础-2-反射
什么是反射
运行时分析类以及执行类中方法的能力。
通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
优缺点
优点:灵活,框架,运行时分析操作类
缺点: 安全问题,无视泛型的参数的安全检查(编译时),性能问题
应用场景
- 开发通用框架
- 动态代理
- JDK 代理
- GGLIB 代理
- 自定义注解
- 访问私有成员
实际使用
获取 class 对象
<className>.class
Class.forName("<path>")
<objectName>.getClass()
ClassLoader.loadClass("<path>")
1. 知道具体类的情况下可以使用:
1 | Class alunbarClass = TargetObject.class; |
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化
2. 通过
Class.forName()
传入类的全路径获取:
1 | Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject"); |
3.
通过对象实例instance.getClass()
获取:
1 | TargetObject o = new TargetObject(); |
4.
通过类加载器xxxClassLoader.loadClass()
传入类路径获取:
1 | ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject"); |
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。
反射的基本操作
- 你得先有一个需要反射得到的类
- 获取类对象并创建实例
- 获取其中的所有方法
- 获取指定方法并且掉哟个(
invoke
) - 获取指定参数并对参数进行修改
- 调用
private
方法,需要先取消安全检查