Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der dynamischen Proxys von cglib und jdk

Detaillierte Erläuterung der dynamischen Proxys von cglib und jdk

Y2J
Y2JOriginal
2017-05-12 09:50:101962Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Kenntnisse über Spring CGlib und JDK Dynamic Proxy vorgestellt, die einen guten Referenzwert haben. Werfen wir einen Blick mit dem Editor unten

1. Übersicht

Der dynamische JDK-Proxy verwendet den Java-Reflektionsmechanismus, um eine anonyme Klasse zu generieren, die die Schnittstelle implementiert und spezifisch aufruft Methoden Vor dem Aufruf von InvocationHandler zur Verarbeitung

Der dynamische Proxy von Cglib verwendet das Open-Source-Paket ASM, um die Klassendatei der Proxy-Klasse zu laden und ihren Bytecode zu ändern, um eine zu verarbeitende Unterklasse zu generieren

Wenn das Zielobjekt implementiert ist. Die Schnittstelle verwendet dann standardmäßig den JDK-Proxy (die Verwendung des cglib-Proxys kann erzwungen werden).

Wenn die Schnittstelle nicht implementiert ist, muss der cglib-Proxy verwendet werden.

Die Verwendung von erzwingen cglib-Proxy erfordert

*Führen Sie das cglibjar-Paket ein

*Konfigurieren Sie Spring 33f561b1aa1e8675fa66638c77366337   

cglib ist eine Methode, die dynamisch Unterklassen der Proxy-Klasse generiert und die Methode der Proxy-Klasse überschreibt. Um dies zu erreichen, sollte die Proxy-Methode nicht mit final

2 geändert werden

2.1 cglib-Proxy-Klasse

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

Proxy-Klasse UserService

package com.rocky.spring;

public class UserService {

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

2.2 JDK-Proxy-Schnittstelle

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

Proxy-Schnittstellen und Implementierungsklassen

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.");
  }
}

[Verwandte Empfehlungen]

1 Kostenlose Java-Video-Tutorials

2.

JAVA-Tutorial-Handbuch

3.Umfassende Analyse von Java-Annotationen

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der dynamischen Proxys von cglib und jdk. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn