java什么是反射
相关话题
反射指程序可以访问、检测和修改它本身状态或行为的一种能力程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
Java中的反射,我们常见是取得构造方法,成员变量,普通方法,还有对数组反射的操作。
1、反射的精辟定义:反射就是把Java类中的各种成分映射成相应的Java类。
2、Class实例表示正在运行的Java应用程序中的类和接口。所有的
3、反射除了方法体得不到,别的都可以得到。包括可以得到类里私有的成员变量。本人觉得这破坏了Java的封装性,不知道为什么要这么设计。
一、构造方法的反射
(1)得到需要反射的类Class。知道类名可以使用forName(String className) 方法。也可以通过对象的.getClass方法获得。或者明确去获得哪个类型。比如我们有一个Person类,我们想得到这个类的实例可以写成 Person.class。
(2)构造方法用Constructor类表示。可以通过刚才得到的Class,使用getConstructor方法获得,想获得什么形参的构造方法,就传入什么形参类型的Class,比如想取得String的String(StringBuffer buffer) 构造方法可以这样:String.class.getConstructor(StringBuffer.class)。
(3)使用取得的构造方法创建对象,我们需要使用newInstance方法,形参为可变参数,按上面取得的String的构造方法,我们就可以这样创建对象,String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer())
二、成员变量的反射
(1)我们同样需要取得反射的类Class。
(2)Java中使用Field类表示字段,我们想获得成员变量可以使用Class的getField(String name)方法,参数为成员变量的名字。也有getFields()方法取得该类的所有成员变量,返回值为Field的数组。取得Field的值,使用 get方法,设置值使用set方法。
(3)暴力访问私有成员使用setAccessible方法,getType() 取得Field类型,getName()取得Field的字段名称。
三、普通方法的反射
(1)取得反射类Class。
(2)方法使用Method类定义,获得方法使用getMethod(String name, Class… parameterTypes) ,用法很像获得构造方法,只是多出一个方法名的参数。
(3)getReturnType()获得方法的返回值类型,getParameterTypes()获得所有形参类型。
(4)用invoke调用方法第一个参数为需要调用的对象,第二个参数为用于调用的参数。