Java反射机制详解
目的:由于Java的各种框架大多都会用到反射机制,因此了解反射机制非常必要。
先看Java程序的运行过程,类加载机制:
通过ClassLoader将XXX.class类Load到内存中CodeSegment里面,运行环境找到main方法开始执行,遇到一个类load一个类,并非一次性加载。静态块不管new几次都只执行一次,动态块每new一个对象,就执行一次。
详细的Load过程可以根据如下操作运行:
Jdk里面的ClassLoader有很多,
bootstrap是最核心的ClassLoader,它没有名字,代码中无法获取,主要管理底层的C或C++库,非Java语言编写,其他的ClassLoader都是用Java编写。首先是它把其他的ClassLoader加载进来,然后其他的ClassLoader在去Load各种Class。
extension 负责Load jdk里面的扩展包。
application 负责Load自定义的类。系统默认的ClassLoader指application loader
other 包括SecureClassLoader还有URLClassLoader等等,也可以自定义ClassLoader。
注意:除了bootstrap外,其他的ClassLoader都继承自ClassLoader类。他们之间有个层次关系,每个对象都有个引用parent,但他们不是继承。类加载器都会先看上一层是否已经加载某个类,如果加载过,它就不会再加载,否则才加载该类。
从ClassLoader角度讲,每一个.class就是一个class对象,从面相对象的思维放大来讲,每个类里面的属性、方法以及方法的参数都是一个对象。
因此,Java提供获取属性、方法的api接口文档(java.lang.reflect),其中Field获取属性,Method获取方法。
作用:反射机制可以通过反射API接口,探索运行期间的class的内部结构,并且根据其内部结构来决定方法怎么进行调用。比如说,登录系统前,检查登录人是否有这个权限。又比如说,Spring、Hibernate等框架的事务Transaction机制,面相切面的编程等等这些都需要反射机制的支持。
封装打折策略
工厂模式
所有的工厂模式都是用来生产对象。
静态工厂方法:
- 产生对象
- 构造方法通常private
- getInstance()
简单工厂
直接通过工厂类的一个方法来获取一个对象,不常用,了解即可。
抽象工厂
假设有个产品Tank,一开始我并不知道它的形状、大小、动作等属性,我要求工厂能制造各种各样的Tank,也就是说它有哪些属性,类型又是设么,可能我不确定,那么我应该怎么处理这样的工厂业务呢?
从上面代码可以看出,抽象工厂有一个抽象接口和一个全局工厂类,全局工厂一定是一个单例模式,而且制造坦克的方法要求可配,既可以制造圆形坦克,也可以制造方形坦克。