基础加强-代理

来源:互联网 发布:女网络歌手2016 编辑:程序博客网 时间:2024/06/08 09:27

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

                                                                   基础加强-框架

一, 使用反射来写框架,框架一般会用到配置文件,配置文件 一般放在工程下(相对路径) 

1,配置文件存放的文件:
1,使用绝对路径 (是通过某种方法来获取到的。)
2,可以使用类加载器 的getResourceAsStream(String name)name值一定要连文件所在的包名也一起写上,也不可以在包名前加/
3,也可以使用class类的中getResourceAsStream(String name)此name值就 是文件名, 不用写包名。当文件前有/时,说明此文件存在于当前
目录下的。也可以写绝对路径的

二,类加载器
就是将.class文件加载进内存用的。  以后学到的框架都通过类加载器来加载配置文件的,都会放在classpath下面的。
1,方法:
InputStreamgetResourceAsStream(String naem):在classPath下逐一查找在加载的文件 会返回一个与此文件关联的读取泫对象(在此目录前不能加/)
此方法一定要写上包名


                               基础加强-代理
一,AOP(aspect oriented program)面向方面的编程  OOP面向对象的编程
二,
·JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类

三,生成代理类的方法:
1,当目标类有实现的接口时,可以通过jvm动态生成代理类
·JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。
2,当目标类没有实现的接口时,可以使用CGLIB库(第三方库)来动态生成目标类的子类,其子类为代理类
·CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类
那么可以使用CGLIB库

四,代理方法添加代码的位置:
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置上加上系统功能代码 :
1,在调用目标方法之前
2,在调用目标方法之后
3,在调用目标方法前后
4,在处理目标方法异常的catch块中
五,Proxy类

1,方法:
static Class<?> getProxyClass(ClassLoader loader,Class<?>...interface);  返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
static boolean isProxyClass(Class<?> cl):如该类为代理类,则为 true,否则为 false 
static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
返回一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口 

注:动态生成的代理类,只能一个有参数的构造方法,没有无参的构造方法

六,InvocationHandler对象
1,构造方法接受一个InvocationHandler对象,接受对象是为了将此对象赋值给Proxy类中的InvocationHandler变量,该方法代码如下
class Proxy{
//在内部建立InvocationHandler的引用 
private InvocationHandler handler;
//在Proxy类中的通过newProxyInstance方法中的InvocationHandler参数进行传递。
public &Proxy0(InvocationHandler handler){

this.handler = handler;
}
}
代理对象中的方法的运行原理(拿接口为Collection的代理对象来说):

int size(){
//其实就是调用InvocationHandler对象中的invoke方法
return handler.invoke(this,this.getClass().getMethod("size"),null);
}




调用代理对象方法的三个要素:代理对象,方法名,方法参数


注:对于代理类中从Object类继承来的方法只有三个方法会hashCode equals toString方法是交给代理类中的InvocationHandler中的invoke方法
而对于其它的方法,则是自己去实现。
                                

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击