类加载器
Java虚拟机可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
类加载器也是java类,因为其他是java类的加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap.
Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载
类加载器的委托机制
当java虚拟机要加载一个类,首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了B,java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass() 方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪个呢?
不同的类加载器,有各自的管辖范围。
我们可以自定义自已的类加载器,但是要使用自己定义的,必须挂到加载器树上。
Java是如何分派类加载器的,首先派当前线程的类加载器,每个线程都有自己的类加载器,
写类加载器的原理
模板方法设计模式:父类—>loadClass/findClass./得到class文件的转换成字节码àdefinClass();
Class NetworkClassLoader extends ClassLoader{
String host;
Int port;
Public Class findClass(String name){
Byte[] b = loadClassData(name);
Return definedClass(name,b,0,b.length);
}
}
还要继续学习 似懂非懂
代理类
代理模式的作用:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
一些同样的操作,没有什么变化,都可以用代理类来解决重复写相同代码的麻烦问题
AOP面向方面的编程
交叉业务的编程问题即为面向方面的编程(Asperct oriented program,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在发中编写切面代码的运行效果是一样的。
动态代理技术
要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!
JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用做代理类,即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置上加上系统功能代码:
1在调用目标方法之前
2在调用目标方法之后
3在调用目标方法前后
4在处理目标方法异常的catch块中
Class proxy{
Void sayHello(){
……….
Try{
target.sayHello();
}catch(Exception e){
……….
}
……….
}
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, J2EEjava语言JDK1.4APIjavalangObject.html">Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,
Proxy:该类即为动态代理类,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用。