反射:框架设计的灵魂
框架:半成品的软件。可以在框架基础上进行软件开发,简化编码。
反射:将类的各个组成部分封装为其他对象,这就是反射机制。
1.反射的优点:
1.1可以在程序运行过程中,操作这些对象。
1.2.可以解耦,提高程序的可扩展性。
1.3.能够运行时动态获取类的实例,提高灵活性;
1.4.与动态编译结合
反射的缺点:
1.1使用反射性能较低,需要解析字节码,将内存中的对象进行解析。
解决方案:
1.通过setAccessible(true),关闭JDK的安全检查来提升反射速度。
2.获取Class对象的方式:
2.1Class.forName("全类名"):将字节码文件加载进内存,返回Class对象。
*多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2.2类名.class:通过类名的属性class获取。
*多用于参数的传递
2.3对象名.getClass():getClass()方法在Object类中定义。
*多用于对象的获取字节码的方式。
结论:同一个字节码(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个。
3.class对象功能:
获取功能:
3.1获取成员变量们;
Field[] |
getFields() 返回一个数组包含 |
Field |
getField(String name) 返回一个 |
Field |
getDeclaredField(String name) 返回一个对象,反映了 |
Field[] |
getDeclaredFields() 返回 |
Field:成员变量
操作:获取值:1.get(Object obj);
2.设置值:void set(Object obj,Object value);
3.忽略访问权限修饰符的安全检查
setAccessible(true) //暴力反射
3.2获取构造器们
Constructor<T> |
getConstructor(类<?>... parameterTypes) 返回一个 |
Constructor<?>[] |
getConstructors() 返回一个数组包含 |
Constructor<T> |
getDeclaredConstructor(类<?>... parameterTypes) 返回一个 |
Constructor<?>[] |
getDeclaredConstructors() 返回 |
Constructor:构造方法
1.创建对象:
* T newInstance(Object ... initargs)
*如果使用空参数构造方法创建对象,操作可以简化:class对象的newInstance方法。
3.3获取成员方法们
方法 |
getMethod(String name, 类<?>... parameterTypes) 返回一个 |
方法[] |
getMethods() 返回一个数组包含 |
方法 |
getDeclaredMethod(String name, 类<?>... parameterTypes) 返回一个 |
方法[] |
getDeclaredMethods() 返回一个数组包含 |
Method:方法对象
*执行方法:
Object invoke(Object obj,Object ...,args) ;
*获取方法名称:
*String getName:获取方法名
3.4获取类名
String |
getName() 返回单位名称(类,接口,数组类,原始类型,或无效)的 |