反射(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