首先说一下反射机制的概念
反射机制是指再程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能便是Java语言的反射机制。
说完反射的概念,谈谈反射的应用。
我们知道Java中的对象有编译时类型和运行时类型两种类型。编译时类型指的是声明对象时所采用的类型,运行时类型指为对象赋值时所采用的类型。例子如下:
Animal animal=new Cat();
在以上代码中,animal对象的编译时类型为Animal,运行时类型为Cat,因此无法在编译时获取Cat类中特有的定义的方法。对于程序在编译期间无法获得对象和类的真实信息,只能通过运行时信息来获取该对象和类的信息,而这些信息便是通过反射机制来获取的,这便是Java反射机制的核心。
接下来谈谈反射的步骤
反射的步骤如下:
-
获取想要操作的类的对象,通过该类对象可以调用类的任意方法。
-
调用Class对象所对应的类中定义的方法
-
使用反射API来获取并调用类的属性和方法等
获取Class对象的三种方法:
-
调用某个对象的getClass方法以获取该类对应的Class对象
Animal animal = new Animal(); Class clz = animal.getClass();
-
调用某个类的class属性以获取该类对应的Class对象
Class clz = Animal.class;
-
调用Class类中的forName静态方法,从而获取对应的Class对象
Class clz=Class.forName("ClassPath");
创建对象的两种方式:
通过反射创建对象有两种方式:
-
使用Class对象的newInstance方法创建该Class对象对应类的实例,这种方法要求该Class对象对应的类有默认的空构造器
Class clz=Class.forName("ClassPath"); Animal a=(Animal)clz.newInstance();
-
先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance方法创建Class对象对应类的实例
Constructor c = clazz.getDeclaredConstructor(String.class,int.class); Cat cat = (Cat) c.newInstance("美国短尾猫","2");
如何动态调用方法?
获取对象的Method,并调用Method的invoke方法。
-
获取Method对象:通过调用Class对象的getMethod(String name,Class<?>... parameterTypes)返回一个Method对象,他描述了此Class对象所表示的类或接口指定的公共成员方法。其中name参数是指所需方法的名称,parameterTypes参数是按照声明顺序标识该方法的形参类型的Class对象的一个数组。
-
调用invoke方法:通过调用Method对象的invoke方法来动态执行函数
//首先获取类对象 Class clz = Class.forName("Animal"); //获取类对象的setName方法 Method method = clz.getMethod("setName", String.class); //获取构造器对象 Constructor constructor = clz.getConstructor(); //根据构造器对象生成实体对象 Animal animal = (Animal) constructor.newInstance(); //通过方法对象的invoke函数对实体对象方法进行动态调用 method.invoke(animal, "美国蓝白猫");