反射机制是Java中一个非常重要的部分,许多设计模式都离不开反射机制的运用,因此今天先讲讲关于反射机制的内容,后边再介绍多点设计模式的内容。
什么是反射机制
反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性,对于任何一个对象,我们都能够对它的方法和属性进行调用,我们把这种动态获取对象信息和调用方法的对象的功能称之为反射机制。反射其实就是获取类的字节码文件,也就是.class文件。
(图片摘自https://blog.csdn.net/lwl20140904/article/details/80163880)
从上图我们可以很清晰的了解一个反射的过程。其实反射就是把Java类中的各个成分映射成一个个Java对象,例如Field(属性)、Method(方法)、Constructor(构造方法)等等。
反射的三种方式
- Class.getClass():这其实是Object类的一个方法,因为Class继承了Object,所以我们可以直接使用。
- Class clazz = b.class:这个方法其实跟第一个方法差不多
- Class clazz = Class.forName(String str):前两种方式其实都有点多此一举,第一种已经创建了对象,没必要再进行反射,第二种需要导入类的包,会导致类之间的依赖性增强,因此我们一般都通过这种方式来进行反射,参数str是要进行反射的类的全路径名。
反射相关的方法
先获取类
Class c = Class.forName("b");
(1)构造方法
Constructor[] constructors = c.getConstructors(); | 获取所有公用的构造方法 |
Constructor[] declaredConstructors = c.getDeclaredConstructors(); | 获取所有的构造方法 |
Constructor constructor = c.getConstructor(null); | 获取公有的无参构造方法 |
Constructor constructor = c.getConstructor(new Class[]{String.class...}) | 获取公有的有参构造方法,最后为参数的引用类型 |
Constructor constructor = c.getDeclaredConstructor(new Class[]{String.class...} | 获取私有的有参构造方法 |
(2)类属性
Field[] fields = c.getFields(); | 获取所有公有字段 |
Field[] declaredFields = c.getDeclareFields(); | 获取所有的字段 |
Field field = c.getField("字段名"); | 获取指定公有字段 |
Field declaredField = c.getDeclareField("字段名"); | 获取私有字段 |
(3)方法
Method[] methods = c.getMethods(); | 获取所有公有方法 |
Method[] declaredMethods = c.getDeclaredMethods(); | 获取所有方法 |
Method method1 = c.getMethod("方法名",String.class); | 获取特定方法(带参) |
Method method2 = c.getMethod(""); | 获取特定方法(无参) |
Method method3 = c.getDeclaredMethod("",String.class...) | 获取特定方法(多参,与单个参数做对比) |
调用方法则是用到invoke()方法
Object obj = c.getConstructor.newInstance();
method1.invoke(obj,"字段");
总结
反射最关键的地方,就在于获取类的字节码文件,只有能获取到类的字节码文件,才能进行接下去的操作。反射在框架和设计模式中运用的非常广泛,很多技术的实现都离不开反射机制,具体的实例大家可以自行摸索,或者参考其他博客。
参考:https://blog.csdn.net/lwl20140904/article/details/80163880