【Java】反射

shangs00 2020-02-01

反射

反射库提供了一个丰富的工具集,用于编写能够动态操纵Java代码的程序。

能够分析类能力的程序称为反射。

反射机制可以用来:

  • 在运行时分析类的能力。
  • 在运行时查看对象
  • 实现通用的数组操作代码
  • 利用Method对象,这个对象很像C++中的函数指针

Class类

在程序运行的时候,Java运行时系统会给所有的对象维护一个运行时的类型标识。虚拟机利用运行时类型信息选择响应的方法执行。

类似于C++中的RTTI运行时类型识别:程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。
C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于多态性的要求,C++中的指针或引用本身的类型,可能与它实际代表的类型不一致。这时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要求。
和Java相比,C++要想获得运行时类型信息,只能通过RTTI机制,并且C++最终生成的代码是直接与机器相关的。
Java的运行时类型识别,就是通过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),而且Java中还提供了一个关键字,可以在运行时判断一个类是不是另一个类的子类或者是该类的对象,Java可以生成字节码文件,再由JVM(Java虚拟机)加载运行,字节码文件中可以含有类的信息。

保存这些信息的类被称为Class。Object中的getClass()方法将会返回一个Class类型的实例。

System.out.println(a.getClass().getName());

如果类在一个包里,包的名字也会作为类的一部分:
Random generator =new Random();
Class cl=generator.getClass();//class java.util.Random
String name = cl.getName();//java.util.Random

虚拟机为每个类型管理一个Class对象。因此,可以利用=运算符实现两个类对象比较的操作。

例如:if(e.getClass() == Employee.class)

还有一个很有用的方法newlnstance(),可以用来动态地创建一个类的实例。

例如:e.getClass().newInstance();

创建了一个与e具有相同类类型的实例。newInstance方法调用默认的构造器。如果没有默认的构造器,就会抛出异常。
将forName与newlnstance配合起来使用,可以根据存储在字符串中的类名创建一个对象。

String s="java.util.Randon";
0bject m=Class.forName(s).newInstance();

利用反射分析类的能力

java.lang.reflect包中有三个类:Field(域)、Method(方法)、Constructor(构造器)

三个类都有:

  1. getName()方法,返回项目的名称。
  2. getModifiers()方法,将返回一个整形数值。用于描述public,static等修饰符的使用情况。可以利用Modifier类的静态方法isPublic、isFinal来对返回的整形数值分析判断,并且可以利用Modifier.toString()将修饰符打印出来。

Field有:getType方法,返回所描述域所属类型的Class对象。

Method有:报告返回类型和参数的方法。

Constructor有:报告参数的方法。

相关推荐