本文仅用于自我总结,无任何高深技术,大佬绕行,如有不足,见谅!
1. 概念
什么是反射:在运行时 通过字节码文件 动态的获取类的成员和创建对象的技术
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类 进行解剖,把个个组成部分映射成一个个对象。
学习的重点:
- Class :类的字节码文件对象
- Method: 方法
- Constructor:构造方法
- Field:属性
2. 如何获取一个类的class(字节码文件对象)
- 通过Object的getClass方法
Class cla1=new Demo().getClass();
- 通过静态属性class
Class cla2=Demo.class;
- 通过Class类的静态方法forName
Class cla3=Class.forName("test05_reflect.Demo");
注意:在运行期间,一个类,只有一个Class对象产生。
三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
3.Class类:对类的字节码文件的封装
类中的方法
- static Class forName(String className) :通过类名获取类的字节码文件对象
- ClassLoader getClassLoader()
- Constructor[] getConstructors() :获取所有的public构造方法
Constructor[] getDeclaredConstructors() :获取所有的构造方法
Constructor<T> getDeclaredConstructor(Class... parameterTypes) :获取指定的构造方法
Constructor<T> getConstructor(Class... parameterTypes) :获取指定的public构造方法
- Method[] getMethods() :获取所有的public方法
Method getMethod(String name, Class... parameterTypes) :获取指定的public方法
Method[] getDeclaredMethods() :获取所有的方法
Method getDeclaredMethod(String name, Class... parameterTypes) :获取指定的方法
- Field[] getFields() :获取所有的public属性
Field[] getDeclaredFields() :获取所有的属性
Field getField(String name):获取指定的public属性
Field getDeclaredField(String name):获取指定的属性 - String getName() :获取包名.类名
String getSimpleName() :获取类名 - T newInstance() :创建对象 ::通过无参数的构造方法创建对象
重点方法:
-
static Class forName(String className) :通过类名获取类的字节码文件对象
-
xxx getXxx()+xxx getDeclaredXxx():::获取构造方法+方法+字段
-
String getxxxName() :获取包名.类名
-
T newInstance() :创建对象 ::通过无参数的构造方法创建对象
4. Constructor类:对构造方法的封装
类中的方法
- T newInstance(Object... initargs) :创建对象
- Class[ ] getParameterTypes() :获取参数列表
- int getModifiers() :获取修饰符
- String getName() :获取构造方法名
- Class[ ] getExceptionTypes() :获取抛出的异常
- void setAccessible(boolean flag):暴力访问 取消范围修饰符检查
重点方法
- T newInstance(Object... initargs) :创建对象
- void setAccessible(boolean flag):暴力访问 取消范围修饰符检查
5. Method类 :对方法的封装
- Class[] getExceptionTypes() :获取方法抛出的所有异常类型
- int getModifiers() 获取方法的修饰符
- String getName() :获取方法的名字
- Class[] getParameterTypes() :获取方法的参数列表
- Class getReturnType() :获取方法的返回值类型
- void setAccessible(boolean flag):设置暴力访问
- Object invoke(Object obj, Object... args) :执行方法
6. Field类:对类的属性的封装
- String getName() :获取属性名
- Class getType() :获取属性类型
- int getModifiers():获取修饰符
- void setAccessible(boolean flag) :暴力访问
- Object get(Object obj) :获取参数对象obj的当前属性的值
- void set(Object obj, Object value) :设置参数对象obj的当前属性值为value
总结来说就是
1个概念
4个类
8个方法
7. 面试题
哪里用到反射机制?
- JDBC中,利用反射动态加载了数据库驱动程序。
- Web服务器中利用反射调用了Sevlet的服务方法。
- Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
- 很多框架都用到反射机制,注入属性,调用方法,如Spring。