Java反射
图
Reflection(反射)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,被private封装的资源只能类内部访问,外部是不行的,但反射能直接操作类私有属性,反射称为框架的灵魂

反射(Reflection)

Java是静态语言,有了反射后可以成“准动态语言”

动态语言:在运行时能改变程序自身的结构

  • 一个类在内存中只有一个Class对象
  • 一个类被加载后,类的整个结构都会被封装到Class对象中

Class类

对于每个类,JRE都为其保留一个不变的Class类型对象,包含所有结构相关信息

  • Class本身也是一个对象
  • 只能由系统创建
  • 一个加载的类在JVM中只有一个Class实列
  • 一个Class对象对应的是一个加载到JVM的一个.class文件
  • 每个类的实例都会记得自己由哪个Class实例所生成
  • 通过Class可以完整的得到一个类中所加载的结构
  • Class类是反射的根源,针对任何想动态加载、运行的类,只有先获得相应的Class对象
方法 说明
static ClassforName(String name) 返回指定类名的Class对象
Object newInstance() 调用缺省构造函数,返回Class对象的一个实列
getName() 返回此Class对象所表示的实体的名称
Class getSuperClass() 获取当前Class的父类Class对象
Class[] getinterfaces() 获取当前Class的接口
ClassLoader getClassLoader() 获取类加载器
Constructor[] getConstructors() 返回包含Constructor对象的数组
Method getMothed(String name, Class.. t) 返回Method对象,形参类型为paramType
Field[] getDeclaredFielsd() 返回Field对象的一个数组

获取Class类的实例方式

  • 若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
    • Class clazz = Person.class
  • 已知某个类的实例,调用该实例的getClass()方法获取Class对象
    • Class clazz = person.getClass()
  • 已知一个类的全名,且该类下类路径下,可通过Class的静态方法forName()获取
    • Class clazz = Class.forName("")
  • 内置基本数据类型可以直接用类名.Type
  • 利用ClassLoader