概念
(以下总结来自java的编程逻辑一书)
正常来说是根据类型进行代码的检查编译,反射则是在运行时而非编译时,动态获取类的信息,比如接口的信息、成员信息、构造方法等,根据这些动态获取的信息创建对象、访问/修改类的成员、调用方法等。我们下面先介绍几个比较常用的类:
常用类
- java.lang.Class(类信息对应的类),获取类的对象有以下几种方法:
- 所有类的根父类有一个方法可以获取Class对象,Class类是一个泛型类,所以该方法不知道具体的类型
- 获取类对象不一定需要实例对象,使用<类名>.class即可获取class对象,如date.class(注意:基本类型没有getClass方法,也有对应的Class对象,为对应的包装类型,void 作为一种特殊的类型,也有对应的Class类型,具体如下图所示)
- 还可以使用Class类的一个静态方法forName(可能会抛出ClassNotFoundExcption),可以直接根据类名直接加载类,例如以下程序:
- Class类中还有一个方法可以用来创建对象:newInstance()(该方法会自动调用无参的public构造方法),如果没有的话,会抛出异常。
介绍获取class对象的方法,介绍一下Class类的常用方法
- 获取名字信息
- public String getName()---返回的是java内部真正使用的名称
- public String getSimpleName()---返回的名称不带包名
- public String getCanonicalName()---返回的名称较为友好
- public Package getPackage()---返回的是包信息
实例:
- 获取字段信息
上面的Field是用来获取字段信息的,有以下的基本方法,可以获取字段的信息和操作字段,注意获取修饰符可以用getModifiers(),返回的是一个int类型,有一个枚举类对应可以识别出对应的类型
- 获取方法信息