【自学】Java核心技术卷1_5.7 反射

参考1参考2参考3

 反射reflection

Package java.lang.reflect Description

  • 反射:能够分析类的能力(capabilities of classes)的程序。
  • 反射库:提供了丰富的工具集,便于编写能够动态操纵Java代码的程序
  • 反射是一种功能强大且复杂的机制,使用反射机制的主要是工具构造者。
  • 反射机制可以:在运行时分析类的能力、在运行时查看对象、实现通用的数组操作代码、利用Methon实现类似C++函数指针的功能。

  • 程序运行期间,Java runtime system总是为所有object维护runtime type identification。Runtime type information跟踪每个对象所属的类,且被JVM用于选择正确的执行方法。可以通过Class类访问这些information (runtime type information),所以想检查一个类的信息之前,要先获取这个类的Class对象。

5.7.1  Class

  • Class类是一个泛型类,Class的对象实际上表示一种type,这个type可以是已有的类、自己编写的类、甚至不是类,例如int不是类,但int.class是一个Class类型的对象。

得到Class类的对象的三种方法:

  1. Object类的getClass()方法:Class cl=obj.getClass();
  2. Class类的forName():Class cl=Class.forName(“className”); //类名/接口名
  3. Type.class:设T为Java某类型,则T.class代表T类型的对象。Class cl=int.class;

JVM为每个type管理a unique Class object,因此可以用 == 判断两个class对象是否相等

Class类的方法:

  • getName()方法返回类的名字(包括包名)。返回String
  • getSimpleName()只获取类名,不包括包名。返回String
  • getModifiers():访问一个类的修饰符(public,private,protected,static,final)。返回int
  • getPackage():获取包信息。返回Package对象
  • getSuperclass():访问父类。返回Class对象
  • getInterfaces():获取指定类所实现的接口集合。返回Class[]
  • newInstance():用于创建某类的实例。调用默认的无参构造器初始化新创建的对象,如果类没有默认构造器,则此方法会抛出异常。(Constructor类的newInstance()方法可以调用含参数的构造器)
  •  isInstance():来判断是否为某个类的实例

5.7.3 利用反射分析类的capability

1、Class类方法得到Field、Method、Constructor对象数组

2、Field,Method,Constructor类检查类的结构(域、方法、构造器)

  • java.lang.reflect包中有Field,Method,Constructor类,用于描述类的域、方法、构造器(名称、参数、返回值...)

3、查看任意对象的数据域名称和类型:

具体API查看java.lang.reflect和java.lang.Class包

5.7.4 在运行时用反射分析对象——查看数据域的实际内容:Field类的get()方法

  • 假设f是一个Field类的对象,并且是某类对象obj的一个域,则f.get(obj)将返回obj这个实例对象的f域的当前值。
  • 不过反射机制的默认行为受限于Java的访问控制(private,public,static…),可以通过调用Field,Method,Constructor的公共超类AccessibleObject类的setAccessible()方法覆盖访问控制
  • eg:privateField.setAccessible(true);

5.7.6 调用任意方法:Method类的invoke()方法

Method m1=Employee.class.getMethod(“raiseSalary”,double.class);
double salary=(Double) m1.invoke(byPercent);
  • invoke()第一个参数是隐式参数(Method对象),其余的对象提供了显示参数,静态方法的第一个参数可设置为null;如果返回类型是基本类型,invoke()方法会返回其包装类型
  • 建议仅在有必要的时候用Method对象——invoke()的参数和返回值必须是Object类型,因此要进行多次转换,这样会使编译器错过检查代码的机会(最好用接口和lambda表达式)
  • 建议Java开发者不要使用Method对象的回调功能——反射获得方法指针的代码要比直接调用方法明显慢一些(使用接口回调使代码执行速度更快,更易于维护)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值