黑马程序员-java基础加强_代理和类加载器

时间:2023-02-12 09:03:09

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

 

类加载器:
Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:
BootStrap:jre/lib/rt.jar

ExtClassLoader:jre/lib/ext/*.jar

AppClassLoader:classPath指定的所有jar 或目录

类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,
显然必须有第一个类加载器不是java类,这就是BootStrap.

Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

自定义的类加载器必须继承ClassLoader,有包名的类不能调用无包名的类。
ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

当每个类加载器在加载类时,先委托给上级去加载这个类,这就是类加载器的委托机制。

 

自定义一个类加载器对一个class文件进行加密,在解密的时候只能调用自定义的这个类加载器


 

代理:

 

JVM可以在运行期间动态生成出类的字节码,这种动态生成的类往往被用作代理类, 即动态代理。JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的工代理。

 

CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理就可以使用CGLIB库

 

代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:

1、在调用目标方法之前

2、在调用目标方法之后

3、在调用目标方法前后

4、在处理目标方法异常的catch块中

AOP:

工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象。