JAVA反射机制
定义:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
意义
首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
再次,使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
最后,反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。
正是反射有以上的特征,所以它能动态编译和创建对象,极大的激发了编程语言的灵活性,强化了多态的特性,进一步提升了面向对象编程的抽象能力,因而受到编程界的青睐。
原理
反射机制(Reflection)是Java提供的一项较为高级的功能,它提供了一种动态功能,而此功能的体现在于通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。反射技术在中间件领域应用得较多。
Class 类
对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特
定某个结构(class/interface/enum/annotation/primitive type/void/[])的有关信息。
Class 本身也是一个类
Ø Class 对象只能由系统建立对象
Ø 一个加载的类在 JVM 中只会有一个Class实例
Ø 一个Class对象对应的是一个加载到JVM中的一个.class文件
Ø 每个类的实例都会记得自己是由哪个 Class 实例所生成
Ø 通过Class可以完整地得到一个类中的所有被加载的结构
Ø Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的
Class对象
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对象的一个数组
package Annotaions;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class fanshe {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class classs=Class.forName("Annotaions.ml");//通过类名获取一个实例化Class类对象
ml ml = (ml) classs.newInstance();// 该类具体的对象
Method[] methods = classs.getMethods();//获取ml类的方法名
for (Method method : methods) {
System.out.println(method);
}
Field[] fields = classs.getDeclaredFields();//获取mL类的成员属性
for (Field field : fields) {
System.out.println(field);
}
Constructor[] constructors = classs.getConstructors();//获取ml的构造方法
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
}
}