代理模式()
在这个切入对象的基础上可以生成动态代理
public static IDBQuery createCglibProxy(){
Enhancer enhancer = new Enhancer()
enhancersetCallback(new CglibDbQueryInterceptor())
//指定切入器定义代理类逻辑
enhancersetInterfaces(new Class[] { IDBQueryclass })
//指定实现的接口
IDBQuery cglibProxy = (IDBQuery) enhancercreate()
//生成代理类的实例
return cglibProxy;
}
使用Javassist生成动态代理可以使用两种方式一种是使用代理工厂创建另一种通过使用动态代码创建使用代理工厂创建时方法与CGLIB类似也需要实现一个用于代理逻辑处理的Handler:
public class JavassistDynDbQueryHandler implements MethodHandler {
IDBQuery real=null;
@Override
public Object invoke(Object arg Method arg Method arg Object[] arg)
throws Throwable {
if(real==null)
real=new DBQuery()
return realrequest()
}
}
以这个Handler为基础创建动态Javasssit代理
public static IDBQuery createJavassistDynProxy() throws Exception {
ProxyFactory proxyFactory = new ProxyFactory()
proxyFactorysetInterfaces(new Class[] { IDBQueryclass })//指定接口
Class proxyClass = proxyFactorycreateClass()
IDBQuery javassistProxy = (IDBQuery) proxyClassnewInstance()
//设置Handler处理器
((ProxyObject) javassistProxy)setHandler(new JavassistDynDbQuery Handler())
return javassistProxy;
}
Javassist使用动态Java代码创建代理的过程和前文的方法略有不同Javassist内部可以通过动态Java代码生成字节码这种方式创建的动态代理可以非常灵活甚至可以在运行时生成业务逻辑
public static IDBQuery createJavassistBytecodeDynamicProxy() throws Exception {
ClassPool mPool = new ClassPool(true)
//定义类名
CtClass mCtc = mPoolmakeClass(IDBQueryclassgetName() + Javaassist
BytecodeProxy)
//需要实现的接口
mCtcaddInterface(mPoolget(IDBQueryclassgetName()))
//添加构造函数
mCtcaddConstructor(CtNewConstructordefaultConstructor(mCtc))
//添加类的字段信息使用动态Java代码
mCtcaddField(CtFieldmake(public + IDBQueryclassgetName() +
real; mCtc))
String dbqueryname=DBQueryclassgetName()
//添加方法这里使用动态Java代码指定内部逻辑
mCtcaddMethod(CtNewMethodmake(public String request() { if(real==
null)real=new +dbqueryname+()return realrequest() } mCtc))
//基于以上信息生成动态类
Class pc = mCtctoClass()
//生成动态类的实例
IDBQuery bytecodeProxy = (IDBQuery) pcnewInstance()
return bytecodeProxy;
}
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南