目录
反射
什么是反射 ?
获取Class对象的四种方式
反射相关API
类对象常用API
Filed常用API
Method常用API
Constructors常用API
反射的使用场景?
反射的实现原理 ?(todo)
反射为什么这么慢 ?
反射的优缺点
反射中,Class.forName和ClassLoader的区别 ?
int.class 与 Integer.class的区别是什么 ?
利用反射与工厂模式实现SpringIOC
反射
什么是反射 ?
对于反射
就类似于你想要进入一个房子,你没有钥匙,但是你知道这个房子是谁的,我们就可以通过反射API知道房子中的内部结构,具体都有啥.
也就是说通过反射你就可以构造对象,知道对象属于某个类,可以获取类的属性和方法,获取到我们就可以调用属性和方法, 这种动态获取程序信息的能力,以及动态调用对象的能力我们就称为反射.
在换句话讲,通过反射你就可以知道类的方法和属性,并可以调用它们
在Java中有一个java.lang.reflect这个包就是实现了反射相关的类库,比如Construct,Field,Method...
获取Class对象的四种方式
Class是反射的入口
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象:
1. 知道具体类的情况下可以使用:
Class alunbarClass = TargetObject.class;
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化
2. 通过 Class.forName()传入类的全路径获取:
Class alunbarClass1 = Class.forName("cn.sfx.TargetObject");
3. 通过对象实例instance.getClass()获取:
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();
4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取:
ClassLoader.getSystemClassLoader().loadClass("cn.sfx.TargetObject");
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行
反射相关API
类对象常用API
Filed常用API
Method常用API
Constructors常用API
反射的使用场景?
- 动态代理
- 注解
反射的实现原理 ?(todo)
反射为什么这么慢 ?
反射的优缺点
优点 :
- 提高程序的灵活性
-
通过反射机制我们就可以让程序创建和控制任何类的对象
-
通过反射机制,我们可以在程序运行的时候,判断对象所属的类,构造任意一个类的对象,获取到任意一个类所具有的方法,属性,可以动态的调用对象的方法
-
缺点 :
- 代码的可读性低
- 反射破坏封装
- 反射的代码性能极低
反射中,Class.forName和ClassLoader的区别 ?
int.class 与 Integer.class的区别是什么 ?
int.class是基本数据类型int的Class对象,用于获取基本数据类型的相关信息。
Integer.class是java.lang.Integer包装类的Class对象,用于获取包装类的相关信息。