Skip to content

Jacob110/dynamicProxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Java Dynamic Proxy Sample


本例是一个简单的 Java 动态代理的例子。以 ArrayList 为样例,进行了封装,其内部实现和 ArrayList 中完全相同的功能,增加了计算 ArrayList 每个方法运行的时间。

Java Dynamic Proxy

Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作.

代码简述

ArrayListHandler类实现了 InvocationHandler接口,实现接口中定义的invoke方法。invoke方法的参数说明:

  • Object proxy:指被代理的对象
  • Method method:要调用的方法,也就是被代理的对象真正执行的方法
  • Object[] args:方法调用时所需要的参数

ArrayListHandler类中还定义了一个方法bind,此方法是通过Proxy类生成一个代理类。

Proxy

Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.

Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException

参数说明:

  • loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
  • interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
  • h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

总结

一个典型的动态代理创建对象过程可分为以下几个步骤:

  • 通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
  • 通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类

About

java dynamic proxy sample

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages