首頁  >  文章  >  Java  >  詳解cglib和jdk兩種動態代理

詳解cglib和jdk兩種動態代理

Y2J
Y2J原創
2017-05-12 09:50:101962瀏覽

本篇文章主要介紹了spring cglib與jdk動態代理的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧

1. 概述

JDK動態代理程式是利用java反射機制產生一個實作介面的匿名類別, 在呼叫具體方法前調用InvocationHandler來處理

Cglib動態代理是利用asm開源包把被代理類的class文件加載進來通過修改其字節碼生成子類來處理

如果目標對象實現了介面那麼預設使用jdk代理(可以強制使用cglib代理)

如果沒有實現接口必須使用cglib代理

強制使用cglib代理需要

  *引入cglibjar包

  *設定spring 263a7f8df26b0f1821edd5bfc09dd601    

cglib因為是動態產生被代理類別的子類別並且覆寫被代理類別的方法來實現的所以被代理方法不要使用final修飾

2. 程式碼範例

2.1 cglib代理類別

package com.rocky.spring;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy {

  public static void main(String[] args) {
    final UserService service = new UserService();
    Enhancer hancer = new Enhancer();
    hancer.setSuperclass(service.getClass());
    hancer.setCallback(new MethodInterceptor(){

      @Override
      public Object intercept(Object proxy, Method method, Object[] arg2,
          MethodProxy arg3) throws Throwable {
        System.out.println("增强前 ... Cglib");
        Object invoke = method.invoke(service, arg2);
        System.out.println("增强后 ... Cglib");
        return invoke;
      }});
    UserService userService = (UserService) hancer.create();
    userService.sayHello();

  }
}
//需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar 
//输出
//增强前 ... Cglib
//this userService works....
//增强后 ... Cglib

被代理程式類別UserService

package com.rocky.spring;

public class UserService {

  public void sayHello(){
    System.out.println("this userService works....");
  }
}

2.2 jdk代理程式介面

package com.rocky.spring;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy {

  public static void main(String[] args) {
    final ActorService service = new ActorServiceImpl();
    ActorService actorService = (ActorService) Proxy.newProxyInstance(
        service.getClass().getClassLoader(), service.getClass()
            .getInterfaces(), new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method,
              Object[] args) throws Throwable {
            System.out.println("增强前...jdk");
            Object invoke = method.invoke(service, args);
            System.out.println("增强后...jdk");
            return invoke;
          }
        });
    actorService.sayHi();
  }
}
//增强前...jdk
//Honestly, I do the work.
//增强后...jdk

被代理介面及實作類別

package com.rocky.spring;
public interface ActorService {
  public void sayHi();
}
-----------------
package com.rocky.spring;
public class ActorServiceImpl implements ActorService {

  @Override
  public void sayHi() {
    doSomething();
  }

  private void doSomething() {
    System.out.println("Honestly, I do the work.");
  }
}

【相關推薦】

1. Java免費影片教學

2. JAVA教學手冊

3. 全面解析Java註解

以上是詳解cglib和jdk兩種動態代理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn