JAVA加强——代理
来源:互联网 发布:网络信息资源检索利用 编辑:程序博客网 时间:2024/06/06 01:59
代理
代理的作用:
要为存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如:异常处理、日志、计算方法的运行时间、事务管理、等等这些操作。如果单独的去添加,是不现实的。那么可以编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法是加上系统功能代码。例如(异常处理、日志等)。
AOP编程很多功能和核心技术都需要动态代理类来实现。AOP就是切面编程,在很多类的方法中,都可以统一被添加一些其他的方法,这些其他的方法是贯穿各个类的。
举个例子:
class X //目标类
{
void sayHello(){ syso:hello,world};//目标类的方法
}
XProxy //代理类
{
void sayHello() 代理的方法
{
starttime //在目标类方法前加上其他方法
X.sayHello(); //调用目标类方法
endtime //在目标类方法后加上其他方法
}
}
这就是代理类。
代理架构图解:
代理类和目标类都应该实现一个接口,或者代理类要成为目标类的子类。总之,代理类要获取目标类需要被代理的方法。
如果目标类没有继承接口,那么代理类如何成为目标类的子类?可以使用CGLIB库,这个库可以动态生成一个类的子类,从而达到可以映射到父类的所有元素。
使用工厂模式或配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是代理类。这样可以很容易的进行切换。
JVM动态生成类(案例)
创建实现了Collection接口的动态类,并查看其名称。
使用getProxyClass(目标类的加载器,目标类的接口,);获得一个类的字节码,如下
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
clazzProxy1 .getName(); //通过字节码获得该类的名称。
Constructor[] constructors = clazzProxy1 .getConstructor(); //看看这个类都有什么构造函数,构造函数可能不是一个,所以是个数组
for(Constructor constructor :constructors) //循环找出所有构造方法
{
String name == constructor.getNmae();//找到构造函数的名字
StringBuilder sBuilder = new StringBuilder (name); //拼接字符串,使用StringBuilder 。StringBuilder 与StringBuffer的区别是前者不同步,效率较快。后者是同步的。
sBuilder.append('('); //拼接一个括号
Class [] clazzParams= constructor.getParameterTypes(); //获取构造函数的参数,也可能不是一个,所以也是数组
for(Class clazz:clazzParams)
{
sBuilder.append(clazzParams.getName()).append(','); //把这个参数的名字加到字符串里去,还要跟上一个逗号。但是有可能无参数,所以逗号需要哦判断。
}
if(clazzParams!=null&&clazzParams.length!=0) //判断数组是否为0,或为NULL。如果为空就把逗号删掉
{
sBuilder.deleteCharAt(sBuilder.length()-1); //删掉括号中位置的字符,括号中的值是字符串倒数第二个字,length-1 就是倒数第二个。
}
sBuilder.append(')'); //拼接一个括号
}
- JAVA加强——代理
- 黑马程序员——java基础加强之代理
- 黑马程序员——java加强之代理
- Java基础加强总结(三)——代理(Proxy)
- Java基础加强总结(三)——代理(Proxy)
- Java基础加强总结——代理(Proxy)
- Java基础加强总结——代理(Proxy)
- Java基础加强总结(三)——代理(Proxy)
- 黑马程序员java学习<基础加强>—动态代理
- 黑马程序员—Java基础加强(动态代理)
- Java基础加强---动态代理
- java基础加强--代理类
- 黑马程序员-java加强-代理
- java基础加强_代理
- Java 基础加强 - 代理与动态代理
- 黑马程序员——Ⅲjava基础加强之动态代理(15)
- JAVA——基础知识加强
- JAVA加强——枚举
- openGL在surfaceview中实例
- ssl验证类
- x86/x64 指令长度的解码
- android 功能代码----(AlarmManager保证后台服务长时间在后台运行)
- 朋友发现GitHub上超实用的开源UI项目
- JAVA加强——代理
- 国际上进行盲源分离研究的主要学者及其研究方向
- 三、git分支与合并
- YUV格式分析详解
- web站点还在license么,云平台
- 【转】C++中new动态定义一维数组,二维数组,三维数组
- 修改Linux动态库的搜索路径
- poj 2247 Humble Numbers
- CSS开发:DIV去除横向滚动条且内容自动换行