目录
- 1 什么是反射?主要提供了哪些功能?
- 2 如何通过反射获取类的信息?
- 3 数组的特殊处理。
- 4 反射的应用场景。
- 5 其他。
正文
1 什么是反射?主要提供了哪些功能?
1) Java的反射机制是指在程序运行期间,对于任意一个类,都可以知道这个类的属性和方法,并进行调用。
2) 提供以下功能:
① 在运行时可以判断任意一个对象所属的类。
② 在运行时可以构造任意一个类的对象。
③ 在运行时可以获取任意一个类的所有成员变量和方法。
④ 在运行时调用任意一个对象的方法。
⑤ 生成动态代理。
3) 优缺点
① 优点:增加灵活性。
② 缺点:使用不当会导致效率低、会破坏封装,且可以访问类的私有方法,不安全。
2 如何通过反射获取类的信息?
1) 首先获取类的Class对象:
① 每一个类、接口、数组、基本类型都有唯一的一个对应的Class类对象。通过Class类对象可以获取类的全部信息(包括成员变量、方法、父类、接口等)。
② 获得Class对象的三种方式。【参考TestLoadClass.java】
③ Class的常用方法:【参考TestClass.java】
2) 对类的构造函数、方法、属性的访问和调用:
① Constructor类:用于构造函数。【参考TestConstrcutor.java】
② Method类:用于类的方法。【参考TestMethod.java】
③ Field类:用于类的属性。【参考TestField.java】
④ Modifer类:用于判断修饰符类型。【参考TestModifier.java】
⑤ Field、Method、Constructor类都继承了AccessibleObject类(该类用于获取和修该访问权限)【参考TestAccessible.java】,同时也实现了Member接口。
3 数组的特殊处理。
1) 数组是没有方法和属性的对象,所以不能通过反射常用的的方法来获取或设置成员。
2) 可以通过反射创建数组,使用两种new Instance的方法来创建。使用Array.set和Array.get来设置或获取数组元素的值。【参考TestArray.java】
4 反射的应用场景。
1) 用于基础框架中,如Spring。
2) JDBC,数据库可能使用Oracle,也可能使用Mysql,不同的数据库有不同的驱动,在运行时,再通过Class.forName()运用反射动态加载。
3) 应用开发中,尽量避免使用反射。
5 其他。
1) class.getName方法返回结果
① 数组类型以[为前缀,后面跟着成员的类型编码,基础类型则简写如下。
(B:byte、C:char、D:double、F:float、I:int、J:long、S:short、Z:boolean)
② 嵌套类型使用$符号将类型名隔开:Outer$Inner
2) 注意这种写法是错误的:Class<Parent> c = Child.class; 因为Child.class不是Parent的子类,正确写法是:Class<? extends Parent> c= Child.class。
3) 向上转型和向下转型:
① 向上转型:子类转为父类,自动转换。
② 向下转型:父类转为子类,需要强制转换。