反射机制(Reflection)
Reflectio允许程序在执行的期间借助ReflectionAPI取得任何类的内部信息,并能够直接操作任意对象的内部属性及方法。
Class c =Class.forName("java.lang.String")
既我们在加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类完整的的结构信息,我们可以通过这个对象看到类的结构,这个对象就宛如一面镜子。我们将这种现象称为反射。
获反射机制提供的功能
- 运行时判断任意一个对象所属的类
- 运行时构造任意一个类的对象
- 运行时判断任意一个类所具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员和方法
- 在运行时处理注解
- 动态代理生成
- .......
反射的优缺点
优点:实现动态创建对象和编译,灵活度更高
缺点:对性能有一定影响。使用反射基本上是解释操作,相当于我们告诉JVM,我们希望做什么并且让它满足我们的要求。这类操作总是慢于直接执行相同的操作。
Class类
在Object类中定义了以下的方法,此方法将被所有子类继承
public final Class getClass()
这个方法的返回值是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。
Class类的常用方法
static ClassforName(String name) | 返回指定类名name的Class对象 |
---|---|
Object newInstance() | 调用缺省构造函数,返回Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类,接口,数组类或void)的名称。 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class[] getinterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Constructor[] getConstructors() | 返回一个包含某些Constructor对象的数组 |
Method getMothed(String name,Class.. T) | 返回一个Method对象,此对象的形参类型为paramType |
Field[] getDeclaredFields() | 返回Field对象的一个数组 |