动态代理和cglib实现

jdk动态代理:

复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkHanler implements InvocationHandler {
    
    private Object target;
    
    public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable {
        System.out.println("before");
        Object o=method.invoke(target, arg);
        System.out.println("after");
        return o;
    }
    public JdkHanler(Object target) {
        super();
        this.target = target;
    }
    public Object getInstance(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(), this);
    }
}
复制代码

cglib动态代理:

复制代码
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 HelloWorldInterceptor implements MethodInterceptor {

    private Object target;
    
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before");
        Object r=proxy.invokeSuper(obj, args);
        System.out.println("after");
        return r;
    }
    public HelloWorldInterceptor(Object target) {
        super();
        this.target = target;
    }
    public Object getInstance(){
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
}
复制代码

测试类:

复制代码
public class AllTest {
    
    public static final String output="D:/SpringWorkSpace/";
    //cglib生成代理类字节码文件
    static{
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, output);
    }
    
    @Test
    public void proxyTest(){
        HelloWorldInterceptor interceptor=new HelloWorldInterceptor(new HelloWorldImpl());
        HelloWorld h=(HelloWorld) interceptor.getInstance();
        h.sayHello();
    }
    //@Test
    public void jdkproxyTest() throws IOException{
        JdkHanler hanler=new JdkHanler(new HelloWorldImpl());
        HelloWorld h=(HelloWorld) hanler.getInstance();
        h.sayHello();
        jdkToFile(h);
    }
//jdk代理类字节码文件
    public static void jdkToFile(HelloWorld obj) throws IOException {
        Class clazz = obj.getClass();
        String className = clazz.getName();
        byte[] classFile = ProxyGenerator.generateProxyClass(className, HelloWorldImpl.class.getInterfaces());
        FileOutputStream fos = new FileOutputStream(output+"proxy.class");
        fos.write(classFile);
    }
}
复制代码

 

利用jd-gui工具反编译字节码文件:

生成的jdk代理类:

复制代码
public final class $Proxy4 extends Proxy
  implements HelloWorld
{
  private static Method m3;
  private static Method m1;
  private static Method m0;
  private static Method m2;

  public $Proxy4(InvocationHandler paramInvocationHandler)
    throws 
  {
    super(paramInvocationHandler);
  }
  //调用sayHello方法
  public final String sayHello()
    throws 
  {
    try
    {
     //调用JdkHanler的invoke方法
      return (String)this.h.invoke(this, m3, null);
    }
    catch (Error|RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
    {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  static
  {
    try
    {
      m3 = Class.forName("com.selrain.DynamicProxy.HelloWorld").getMethod("sayHello", new Class[0]);
      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
      return;
    }
    catch (NoSuchMethodException localNoSuchMethodException)
    {
      throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
    }
    catch (ClassNotFoundException localClassNotFoundException)
    {
      throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
    }
  }
复制代码

生成的cglib代理类:

复制代码
public class HelloWorld$$EnhancerByCGLIB$$d87b5f2a extends HelloWorld
  implements Factory
{
  private boolean CGLIB$BOUND;
  public static Object CGLIB$FACTORY_DATA;
  private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
  private static final Callback[] CGLIB$STATIC_CALLBACKS;
  private MethodInterceptor CGLIB$CALLBACK_0;
  private static Object CGLIB$CALLBACK_FILTER;
  private static final Method CGLIB$sayHello$0$Method;
  private static final MethodProxy CGLIB$sayHello$0$Proxy;
  private static final Object[] CGLIB$emptyArgs;
  private static final Method CGLIB$hashCode$1$Method;
  private static final MethodProxy CGLIB$hashCode$1$Proxy;
  private static final Method CGLIB$clone$2$Method;
  private static final MethodProxy CGLIB$clone$2$Proxy;
  private static final Method CGLIB$equals$3$Method;
  private static final MethodProxy CGLIB$equals$3$Proxy;
  private static final Method CGLIB$toString$4$Method;
  private static final MethodProxy CGLIB$toString$4$Proxy;

  static void CGLIB$STATICHOOK1()
  {
    CGLIB$THREAD_CALLBACKS = new ThreadLocal();
    CGLIB$emptyArgs = new Object[0];
    Class localClass1 = Class.forName("com.selrain.DynamicProxy.HelloWorld$$EnhancerByCGLIB$$d87b5f2a");
    Class localClass2;
    Method[] tmp50_47 = ReflectUtils.findMethods(new String[] { "sayHello", "()Ljava/lang/String;" }, (localClass2 = Class.forName("com.selrain.DynamicProxy.HelloWorld")).getDeclaredMethods());
    CGLIB$sayHello$0$Method = tmp50_47[0];
    CGLIB$sayHello$0$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;", "sayHello", "CGLIB$sayHello$0");
    tmp50_47;
    Method[] tmp131_128 = ReflectUtils.findMethods(new String[] { "hashCode", "()I", "clone", "()Ljava/lang/Object;", "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;" }, (localClass2 = Class.forName("java.lang.Object")).getDeclaredMethods());
    CGLIB$hashCode$1$Method = tmp131_128[0];
    CGLIB$hashCode$1$Proxy = MethodProxy.create(localClass2, localClass1, "()I", "hashCode", "CGLIB$hashCode$1");
    Method[] tmp151_131 = tmp131_128;
    CGLIB$clone$2$Method = tmp151_131[1];
    CGLIB$clone$2$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/Object;", "clone", "CGLIB$clone$2");
    Method[] tmp171_151 = tmp151_131;
    CGLIB$equals$3$Method = tmp171_151[2];
    CGLIB$equals$3$Proxy = MethodProxy.create(localClass2, localClass1, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$3");
    Method[] tmp191_171 = tmp171_151;
    CGLIB$toString$4$Method = tmp191_171[3];
    CGLIB$toString$4$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;", "toString", "CGLIB$toString$4");
    tmp191_171;
  }

  final String CGLIB$sayHello$0()
  {
    return super.sayHello();
  }
 //调用sayHello方法
  public final String sayHello()
  {
    MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;
    if (tmp4_1 == null)
    {
      tmp4_1;
     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值