反射(框架设计的灵魂)
框架
- 半成品软件。可以在框架的基础上进行软件开发,简化编码
概念
- 将类的各个组成部分封装成其他对象,这就是反射概念
- Java代码在计算机中经历的三个阶段:
- Source源代码阶段:
- javac编译为.class文件
- 使用(ClassLoader)类加载器将其加载到内存中
- class类对象阶段
- class.forname(“全类名”):
- 将字节码文件加载进内存,返回class对象
- 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
- 类名.class:
- 通过类名或者属性class获取
- 多用于参数的传递
- 对象.getClass():
- getClass()方法在object类中定义着
- 多用于对象的获取字节码文件方式
- class.forname(“全类名”):
- Runtime它运行阶段
- Source源代码阶段:
- 结论:
- 同一个字节码文件(*。class)在一次程序运行过程中,指挥被架子啊一次,不论通过哪一种方法获取的class对象都是同一个
class对象功能:
-
获取功能
-
获取成员变量们
-
Field[] getFields()
-
Field getField(String name)
-
Field[] getDeclaredFields()
-
获取所有成员变量,不考虑修饰符
-
忽略访问权限修饰符的安全检查
-
(暴力反射)
-
X.setAccessible(true);
-
-
-
-
Field getDeclaredField(String name)
-
-
获取构造方法们
-
Construtor<?>[] getConstrutors()
-
Construtor getConstrutor(类<?>…parameterTypes)
-
Construtor getDeclaredFieldtConstrutors(类<?>…parameterTypes)
-
创建对象
-
X.newInstance("xxx","xxx");
-
-
如果使用空参数构造方法创建对象,操作可以简化
- class对象的newInstance()来使用
-
-
Construtor<?>[] DeclaredFieldtConstrutors()
-
-
获取成员方法们
-
Method[] getMethods()
-
获取指定名称的方法
-
先创建对象
-
执行方法
-
invoke(x,x,x);
-
-
-
-
Method getMethod(String name,类<?>…parameterTypes)
-
Method[] getDeclaredMethods()
-
Method getDeclaredMethod(String name,类<?>…parameterTypes)
-
-
获取类名
- String getName()
- 打印出所有方法名
- 打印出包名
- String getName()
-
好处
- 在程序运行中,操作这些对象
- 可以解耦,提高程序的扩展性
写框架的步骤
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建内存
- 执行发法
框架
-
加载配置文件
-
创建对象
-
加载配置文件,转化为一个集合
-
Properties pro = new Properties();
-
获取class目录下的配置文件
-
ClassLoader classLoder = ReflectTest.class.getClassLoadder(); InputStream is = classLpader.getResourceAsStream("pro.properties"); pro.load(is);
-
-
-
-
获取配置文件中定义的数据
-
String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName");
-
-
加载该类进内存
-
class cla = Class.forName(className);
-
-
创建对象
-
Object obj = cls.newInstance();
-
-
获取方法对象
-
Method method = cls.getMethod(methodName);
-
-
执行方法
-
method.invoke(obj);
-