目录
1. 静态语言和动态语言
静态语言:运行时结构不可变的语言称为静态语言。
动态语言:运行时结构可以改变的语言称为动态语言。
Java在运行前要进行编译,运行时运行的是编译后的可执行文件,所以结构是不可变的,所以是静态语言。但是Java提供了Reflection API使得Java程序在执行的时候具有一定的动态性,所以Java是准动态语言。
2. 反射
2.1 反射的作用
- 可以在运行时判断任意一个对象属于哪个类。
- 在运行时构造任意一个类的对象。
- 在运行时获取一个类的所有结构(包括属性、方法、注解等)。
- 在运行时调用一个类的对象的属性和方法。
- 处理注解。
2.2 反射相关的主要API
- java.lang.Class:代表一个类
- java.lang.reflection.Method:代表一个类的方法
- java.lang.reflection.Field:代表一个类的属性
- java.lang.reflection.Constructor:代表一个类的构造器
3. Class类
对于每一个类,当其被加载到内存中时,系统就会产生一个与之对应的对象。一个类只能有一个Class对象。这个Class类的对象包含了对应类的所有结构信息(包括方法、属性、注解等),我们可以通过这个对象来获取类的结构,进而操作这个类,就实现了反射。正是因为Class类的对象记录了类的所有结构信息,所以Class类是反射的源头。
3.1 Class类的注意事项和总结
- Class类也是一个类。
- Class类的对象只能由系统构建,我们只能获取。
- 一个Class类的对象对应一个加载到内存中的类。
- Class类的对象记录了对应类的所有结构信息。(一个加载到内存中的类就是一个Class类的对象。)
- 每个类都知道它由哪个Class对象加载。
- Class类是反射的源头。
3.2 获取Class实例的方法
- 使用 类名.Class
- 使用 Class.forName(类名)
- 使用 类的某个个对象.getClass
- 使用 类的加载器.loadClass("类的全类名")
3.3 哪些类型可以有Class对象
class(类)、interface(接口)、[](数组)、annotation(注解)、基本数据类型、void
注意:对于数组,当数组的数据类型和维度都相同时其Class对象相同。
3.4 Class类的常用方法
- static Class forName(String name):获取指定类名的Class对象
- Object newInstance():调动无参构造函数,返回Class对象的一个实例
- String getName():获取Class对象所表示的实体的名字
- Class getSuperClass():获取父类的Class对象
- Class getGenericSuperClass():获取带泛型的父类
- Class[] getInterfaces():获取当前Class对象的接口
- ClassLoader getClassLoader():获取类的加载器
- public Constructor[] getConstructors():获取类的所有public构造方法
- public Constructor[] getDeclaredConstructors();获取类的所有构造方法
- public Method[] getMethods():获取类的所有public方法(包括父类继承下来的)
- public Method[] getDeclaredMethods():获取类声明的所有方法
- public Field[] getFields():获取类的所有public属性(包括父类继承下来的)
- public Field[] getDeclaredFields():获取类声明的所有属性
3.5 File类的常用方法
- public Class getReturnType():获取返回值类型
- public Class[] getParameterTypes():获取全部的参数类型
- public int getModifiers():获取权限修饰符
- public Class[] getExceptionTypes():获取异常
- public Annotations[] getAnnotations():获取方法的注解
- public String getName():获取方法名
- Object invoke(Object obj,Object...args):调用obj对象的对应方法
- setAccessible(boolean b):设置是否可访问私有方法
3.6 Constructor类的常用方法
- public int getModifiers():获取权限修饰符
- public String getName():获取方法名
- public Class[] getParameterTypes():获取参数类型
3.7 Method类的常用方法
- public int getModifiers():获取Field的权限修饰符
- public String getName():获取属性名
- public Object get(Object obj):获取obj对象的对应属性值
- public void set(Object obj,Object value):将obj对象的对应属性值设置成value
4. 获取类的完整结构
使用上面提及的方法
5. 调用类的指定结构
使用上面提及的方法,特别在调用时使用invoke、get、set三个方法
6. 创建运行时类对象
Object newInstance():创建一个运行时类对象
要求:
- 该类有空参构造器
- 同一个包下空参构造器的权限不能为private,不同包下空参构造器要是public
7. 通过反射加载配置文件
步骤:
- 获取类的加载器
- 调用类的加载器的InputStream getResourceAsStream(String fileName)获取指向配置文件的输入流
- 创建Properties对象
- 调用Properties对象的load(InputStream is)方法加载配置文件
- 调用Properties对象的getProperty(String key)方法后期key对应的value值。