ホームページ  >  記事  >  Java  >  cglib および jdk ダイナミック プロキシの詳細な説明

cglib および jdk ダイナミック プロキシの詳細な説明

Y2J
Y2Jオリジナル
2017-05-12 09:50:102001ブラウズ

この記事では、参考価値の高い Spring cglib と jdk ダイナミック プロキシの関連知識を主に紹介します。以下のエディターで見てみましょう

1. 概要

JDK 動的プロキシは、Java リフレクション機構を使用してインターフェースを実装する匿名クラスを生成し、特定のメソッドを呼び出す前に InvocationHandler を呼び出してそれを処理します

Cglib動的プロキシの使用 asm オープン ソース パッケージは、プロキシ クラスのクラス ファイルをロードし、そのバイトコードを変更して処理してサブクラスを生成します。ターゲット オブジェクトがインターフェイスを実装している場合は、デフォルトで jdk プロキシが使用されます (cglib プロキシを強制することができます)。インターフェイスが実装されていない場合は、cglib プロキシを使用する必要があります

cglib プロキシの使用を強制するには

*cglibjar パッケージの紹介

* spring

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
Proxiedクラス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
Proxiedインターフェースと実装クラス
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。