Java基础回顾:反射Reflect
1)基本思想
反射可以在程序运行过程中动态获取类信息和调用类方法
通过反射构造类实例
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211016180711523-1988051049.png)
通过反射调用方法
Class clazz = Class.forName("com.bean.SmallPineapple");
Constructor constructor = clazz.getConstructor(String.class, int.class);
constructor.setAccessible(true);
SmallPineapple sp = (SmallPineapple) constructor.newInstance("小菠萝", 21);
Method method = clazz.getMethod("getInfo");
if (method != null) {
method.invoke(sp, null);
}
正射:new一个对象,这种方式是在编译期就把对象的类型给定下来,运行过程中无法修改,需要修改源码重新编译。
反射:可以在运行时确定使用哪一个数据类,在切换类时,无需修改源码、编译程序。
2)基本使用
Java反射的主要组成部分有四个核心类(java.lang.reflect 包):
- Class:任何运行在内存中的所有类都是该Class类的实例对象,每个Class类对象内部都包含了本来的所有信息。
- Field:描述一个类的属性,内部包含了该属性的所有信息,例如数据类型,属性名,访问修饰符……
- Constructor:描述一个类的构造方法,内部包含了构造方法的所有信息,例如参数类型,参数名称,参数访问修饰符……
- Method:描述一个类的所有方法,包括抽象方法,内部包含了该方法的所有信息,与Constructor类似,不同之处是Method拥有返回值类型信息,因为构造方法是没有返回值的。
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211016180919096-1316796238.png)
Class对象中包含了该类的所有信息
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211016180947202-268695736.png)
3) 应用场景
- Spring实例化对象:当程序启动时,Spring会读取配置文件 applicationContext.xml 并解析出里面所有的标签实例化到 IOC 容器中。
- 反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对格之格新增的类,反射可以使得程序更加健壮。
- JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类。
4)反射优缺点
优点:
- 增加程序的灵活性
缺点:
- 破坏类的封装性:可以强制访问private修饰的信息
- 性能损耗
参考:https://juejin.cn/post/6864324335654404104
一点浩然气,千里快哉风!