更新时间:2018-10-31 来源:黑马程序员 浏览量:
一:反射的概念反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等成员。
反射的前提:必须先要获取到该类的字节码文件对象,即Class类型对象。
反射的实现:
二:获取Class对象三种方式:
1)通过类名.class获取
举例:
[Java] 纯文本查看 复制代码
2)通过Object类的成员方法getClass()方法获取,对象名.getClass()
3)通过Class.forName("类的全路径名")获取,即Class.forName("cn.itcast.test2.Student");
举例:
[Java] 纯文本查看 复制代码
三:[size=1.5em]Class对象相关方法
String getSimpleName(); 获得简单类名,只是类名,没有包
String getName(); 获取完整类名,包含包名+类名
T newInstance() ;创建此 Class 对象所表示的类的一个新实例。
要求:类必须有public的无参数构造方法(已过时,一般用class.getConstructor().newInstance()方法)
举例:
[Java] 纯文本查看 复制代码
四:Class类中与Constructor相关方法:
1. Constructor getConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,只能获得public修饰的构造方法。
如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
2. Constructor getDeclaredConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,包括private修饰的构造方法。
如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
3. Constructor[] getConstructors() 获取所有的public修饰的构造方法
4. Constructor[] getDeclaredConstructors() 获取所有构造方法,包括privat修饰的
Constructor类中的常用方法:
1. T newInstance(Object... initargs)
根据指定参数创建对象。
2. void setAccessible(true)
暴力反射,设置为可以直接访问私有类型的构造方法。
五:Class类中与Method相关的方法:
1. Method getMethod("方法名", 方法的参数类型... 类型)
根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
2. Method getDeclaredMethod("方法名", 方法的参数类型... 类型)
根据方法名和参数类型获得一个方法对象,包括private修饰的
3. Method[] getMethods() (了解)
获取所有的public修饰的成员方法,包括父类中。
4. Method[] getDeclaredMethods() (了解)
获取当前类中所有的方法,包含私有的,不包括父类中。
Method类中常用方法
1. Object invoke(Object obj, Object... args)
根据参数args调用对象obj的该成员方法
如果obj=null,则表示该方法是静态方法
2. void setAccessible(boolean flag)
暴力反射,设置为可以直接调用私有修饰的成员方法
六:Class类中与Field相关方法
1. Field getDeclaredField(String name)
根据属性名获得属性对象,包括private修饰的
2. Field getField(String name)
根据属性名获得属性对象,只能获取public修饰的
3. Field[] getFields()
获取所有的public修饰的属性对象,返回数组。
4. Field[] getDeclaredFields()
获取所有的属性对象,包括private修饰的,返回数组。
Field类中常用方法
1. void set(Object obj, Object value)
Object get(Object obj)
2. void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
Class getType(); 获取属性的类型,返回Class对象。