<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## CGLib CGLIB(Code Generation Library)是一個開源項目,是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java接口。Hibernate用它來實現PO(Persistent Object 持久化對象)字節碼的動態生成 ### cglib動態代理 核心思想:CGLib采用了非常底層的字節碼技術,其原理是通過字節碼技術為一個類創建子類(CGLib底層是通過繼承實現的動態代理),并在子類中采用方法攔截的技術攔截所有父類方法的調用,順勢織入橫切邏輯。JDK動態代理與CGLib動態代理均是實現Spring AOP的基礎;底層:使用一個小而快的字節碼處理框架ASM(Java字節碼操控框架),來轉換字節碼并生成新的類 缺點:不能代理final修飾的類 示例代碼: ``` //被代理的類即目標對象 public class A { public void execute(){ System.out.println("執行A的execute方法..."); } } //代理類 public class CGLibProxy implements MethodInterceptor { /** * 被代理的目標類 */ private A target; public CGLibProxy(A target) { super(); this.target = target; } /** * 創建代理對象 * @return */ public A createProxy(){ // 使用CGLIB生成代理: // 1.聲明增強類實例,用于生產代理類 Enhancer enhancer = new Enhancer(); // 2.設置被代理類字節碼,CGLIB根據字節碼生成被代理類的子類 enhancer.setSuperclass(target.getClass()); // 3.//設置回調函數,即一個方法攔截 enhancer.setCallback(this); // 4.創建代理: return (A) enhancer.create(); } /** * 回調函數 * @param proxy 代理對象 * @param method 委托類方法 * @param args 方法參數 * @param methodProxy 每個被代理的方法都對應一個MethodProxy對象, * methodProxy.invokeSuper方法最終調用委托類(目標類)的原始方法 * @return * @throws Throwable */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //過濾不需要該業務的方法 if("execute".equals(method.getName())) { //調用前驗證權限(動態添加其他要執行業務) AuthCheck.authCheck(); //調用目標對象的方法(執行A對象即被代理對象的execute方法) Object result = methodProxy.invokeSuper(proxy, args); //記錄日志數據(動態添加其他要執行業務) Report.recordLog(); return result; }else if("delete".equals(method.getName())){ //..... return methodProxy.invokeSuper(proxy, args); } //如果不需要增強直接執行原方法 return methodProxy.invokeSuper(proxy, args); } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看