`

jdk动态代理实现原理

阅读更多
jdk动态代理实现例子

一 接口

public interface CountService {
	int count();
}


二 具体实现类

public class CountServiceImpl implements CountService {

	private int count = 0;

	public int count() {
		
	System.out.println("count= " + count); 	
	return count ++;
	}

}



三 jdk处理类




	//jdk处理类
	private static class JdkHandler implements InvocationHandler {

	final Object delegate;

	JdkHandler(Object delegate) {
	this.delegate = delegate;
	}

	public Object invoke(Object object, Method method, Object[] objects)
	throws Throwable
	{
	 //System.out.println(" JDK Proxy invoke "+method.getName());	
	 return method.invoke(delegate, objects);
	}
	}



四 具体使用代码


public class DynamicProxyPerformanceTest {

	public static void main(String[] args) throws Exception {
		
		
		CountService delegate = new CountServiceImpl();

		
		long time = System.currentTimeMillis();
		
		
		CountService jdkProxy = createJdkDynamicProxy(delegate);
		time = System.currentTimeMillis()- time;
		System.out.println("Create JDK Proxy: " + time + " ms");
		
		jdkProxy.count();
		
	     byte[] bt=ProxyGenerator.generateProxyClass("Jdk$Proxy", CountServiceImpl.class.getInterfaces());
			
			
			OutputStream outs=new FileOutputStream(new File("E:/Jdk$Proxy.class"));
			outs.write(bt);
			outs.flush();
			outs.close();
	

		
		
		}

}


这样我们就实现了简单的jdk动态代理,那jdk动态代理类具体是怎么生成的呢?jdk动态代理类又是怎么调用jdk处理类的invoke方法的呢?

没办法只能查看源代码了


 public static Class<?> getProxyClass(ClassLoader loader,
                                         Class<?>... interfaces)
        throws IllegalArgumentException
    {


 /*
                 * Generate the specified proxy class.
                 */
                byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
                    proxyName, interfaces);
                try {
                    proxyClass = defineClass0(loader, proxyName,
                        proxyClassFile, 0, proxyClassFile.length);
                } catch (ClassFormatError e) {
                    /*
                     * A ClassFormatError here means that (barring bugs in the
                     * proxy class generation code) there was some other
                     * invalid aspect of the arguments supplied to the proxy
                     * class creation (such as virtual machine limitations
                     * exceeded).
                     */
                    throw new IllegalArgumentException(e.toString());
                }

}



从上可见是通过ProxyGenerator类的generateProxyClass方法产生动态代理类的字节流

那jdk动态代理类又是怎么调用jdk处理类的invoke方法的呢?看来我们要是能生成具体jdk动态代理类的字节码就好了?既然ProxyGenerator类的generateProxyClass方法能产生动态类的字节流,我们把字节流保存到文件,再通过反编译工具就能看到具体的jdk动态代理类的源代码了。

通过反编译工具得到的动态代理类源代码如下
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import test.kkfun.funbox.test.proxy.CountService;

public final class Jdk$Proxy extends Proxy
  implements CountService
{
  private static Method m1;
  private static Method m3;
  private static Method m0;
  private static Method m2;

  public Jdk$Proxy(InvocationHandler paramInvocationHandler)
    throws 
  {
    super(paramInvocationHandler);
  }

  public final boolean equals(Object paramObject)
    throws 
  {
    try
    {
      return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();
    }
    catch (RuntimeException localRuntimeException)
    {
      throw localRuntimeException;
    }
    catch (Throwable localThrowable)
    {
    }
    throw new UndeclaredThrowableException(localThrowable);
  }

  public final int count()
    throws 
  {
    try
    {
      return ((Integer)this.h.invoke(this, m3, null)).intValue();
    }
    catch (RuntimeException localRuntimeException)
    {
      throw localRuntimeException;
    }
    catch (Throwable localThrowable)
    {
    }
    throw new UndeclaredThrowableException(localThrowable);
  }

  public final int hashCode()
    throws 
  {
    try
    {
      return ((Integer)this.h.invoke(this, m0, null)).intValue();
    }
    catch (RuntimeException localRuntimeException)
    {
      throw localRuntimeException;
    }
    catch (Throwable localThrowable)
    {
    }
    throw new UndeclaredThrowableException(localThrowable);
  }

  public final String toString()
    throws 
  {
    try
    {
      return (String)this.h.invoke(this, m2, null);
    }
    catch (RuntimeException localRuntimeException)
    {
      throw localRuntimeException;
    }
    catch (Throwable localThrowable)
    {
    }
    throw new UndeclaredThrowableException(localThrowable);
  }

  static
  {
    try
    {
      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
      m3 = Class.forName("test.kkfun.funbox.test.proxy.CountService").getMethod("count", new Class[0]);
      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());
  }
}


通过查看JDK动态代理类的源代码的count方法

return ((Integer)this.h.invoke(this, m3, null)).intValue();

可见在动态代理类是直接调用注入的InvocationHandler对象的invoke方法来实现代理的


分享到:
评论

相关推荐

    Java JDK动态代理实现原理实例解析

    Java JDK动态代理实现原理实例解析 Java JDK动态代理实现原理实例解析是指通过Java JDK提供的代理机制来实现动态代理的原理和实例解析。动态代理是一种非常重要的设计模式,它可以在运行时生成代理类,从而实现了...

    JDK动态代理_JDK动态代理

    本文将详细介绍JDK动态代理的原理与应用,帮助读者深入理解其工作方式以及如何在实际项目中运用。 #### 二、JDK动态代理简介 JDK动态代理是Java平台提供的一个工具包,用于在运行时创建代理对象。它主要适用于实现...

    JDK动态代理 spring aop 的原理

    现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,...

    关于jdk动态代理的源码剖析

    - **只能代理实现了接口的类**:这是JDK动态代理的一个限制,如果目标对象没有实现任何接口,则无法使用JDK动态代理。 - **性能开销**:虽然这种开销通常很小,但在高并发场景下可能会成为瓶颈。 通过上述分析,...

    JDK动态代理源码

    在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在...理解并掌握JDK动态代理的原理和用法,能够帮助我们更灵活地设计和实现程序,特别是在需要扩展或增强已有功能时,动态代理提供了一种优雅的解决方案。

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    JDK动态代理简单示例

    除了基本的代理实现,JDK动态代理还可以结合其他设计模式,如工厂模式,创建更加复杂的代理对象。此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行...

    模拟JDK动态代理内部实现

    在本文中,我们将深入探讨如何模拟JDK的动态代理内部实现。 首先,我们需要了解JDK动态代理的基础知识。Java中的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。`Proxy...

    Jdk动态代理和cglib动态代理原理

    - **JDK代理**适用于目标类实现有接口的情况,更符合面向接口的设计原则,且无需引入额外的库。 - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成...

    JDK动态代理的底层实现原理

    JDK动态代理的底层实现原理

    jdk与cglib动态代理与底层实现

    4. **底层实现原理**: - **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    CGLIB 和 JDK生成动态代理类的区别

    CGLIB和JDK动态代理是两种常用的实现方式,它们各有优缺点,适用于不同的场景。下面将详细探讨这两种动态代理的区别。 首先,JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect....

    JDK动态代理proxy

    下面将详细介绍JDK动态代理的工作原理及其实现方式。 ### 1. 动态代理概述 在Java中,动态代理主要由两个类完成:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建一个...

    JDK动态代理在EJB3(包括WebService)中的应用

    首先,我们来理解JDK动态代理的工作原理。在Java中,动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,该对象可以作为一个接口的实例,而...

    JavaEE JDK动态代理实现AOP切面功能

    一、JDK动态代理的基本原理 1. `Proxy`类:这个类是Java动态代理的入口,它提供了一种创建代理对象的方式。通过`Proxy.newProxyInstance()`方法,我们可以根据一个接口生成一个实现了该接口的代理对象。 2. `...

    JDK动态代理和Cglib动态代理实例源码

    1. **JDK动态代理实现过程**: - 定义一个接口,被代理类实现该接口。 - 创建`InvocationHandler`实现类,重写`invoke`方法,此方法会在调用被代理类的任何方法时被调用。 - 使用`Proxy.newProxyInstance()`创建...

    模拟JDK动态代理

    在Java编程中,JDK动态代理是一种非常重要的技术,它允许我们在运行时创建对现有接口的代理实现。这种技术在很多场景下都有广泛的应用,比如AOP(面向切面编程)、事务管理、缓存处理等。现在我们来深入探讨一下JDK...

Global site tag (gtag.js) - Google Analytics