J2SE-反射

目录

  • 1 什么是反射?主要提供了哪些功能?
  • 2 如何通过反射获取类的信息?
  • 3 数组的特殊处理。
  • 4 反射的应用场景。
  • 5 其他。

正文

1 什么是反射?主要提供了哪些功能?
  1) Java的反射机制是指在程序运行期间,对于任意一个类,都可以知道这个类的属性和方法,并进行调用。
  2) 提供以下功能:
    ① 在运行时可以判断任意一个对象所属的类。
    ② 在运行时可以构造任意一个类的对象。
    ③ 在运行时可以获取任意一个类的所有成员变量和方法。
    ④ 在运行时调用任意一个对象的方法。
    ⑤ 生成动态代理。
  3) 优缺点
    ① 优点:增加灵活性。
    ② 缺点:使用不当会导致效率低、会破坏封装,且可以访问类的私有方法,不安全。

2 如何通过反射获取类的信息?
  1) 首先获取类的Class对象:
    ① 每一个类、接口、数组、基本类型都有唯一的一个对应的Class类对象。通过Class类对象可以获取类的全部信息(包括成员变量、方法、父类、接口等)。
    ② 获得Class对象的三种方式。【参考TestLoadClass.java】
    ③ Class的常用方法:【参考TestClass.java】 

 TestLoadClass.java
 TestClass.java

  2) 对类的构造函数、方法、属性的访问和调用:
    ① Constructor类:用于构造函数。【参考TestConstrcutor.java】
    ② Method类:用于类的方法。【参考TestMethod.java】
    ③ Field类:用于类的属性。【参考TestField.java】
    ④ Modifer类:用于判断修饰符类型。【参考TestModifier.java】
    ⑤ Field、Method、Constructor类都继承了AccessibleObject类(该类用于获取和修该访问权限)【参考TestAccessible.java】,同时也实现了Member接口。

 TestConstrcutor.java
 TestMethod.java
 TestField.java
 TestModifier.java
 TestAccessible.java

 3 数组的特殊处理。

  1) 数组是没有方法和属性的对象,所以不能通过反射常用的的方法来获取或设置成员。
  2) 可以通过反射创建数组,使用两种new Instance的方法来创建。使用Array.set和Array.get来设置或获取数组元素的值。【参考TestArray.java】  

 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) 向上转型和向下转型:
    ① 向上转型:子类转为父类,自动转换。
    ② 向下转型:父类转为子类,需要强制转换。

原文地址:https://www.cnblogs.com/dudadi/p/7989469.html