熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java程序性能優化-代理模式(4)

2022-06-13   來源: Java高級技術 

    代理模式(

  在這個切入對象的基礎上可以生成動態代理

  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數據庫開發優化指南


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27831.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.