KEMBAR78
Understanding Java Dynamic Proxies | PDF
Understanding Dynamic Proxies
How to create proxy classes in runtime




Osoco
Rafael Luque
Introduction


Contents



1   Introduction


2   Creating a Proxy Class
      Proxy Class Properties


3   Creating a Proxy Instance


4   Examples




    Rafael Luque (Osoco)       Java Dynamic Proxies   04/2009   2 / 17
Introduction


Introduction



Dynamic Proxy Class
A class that implements a list of interfaces specified at runtime, such
that a method invocation through one of the interfaces on an instance
of the class will be encoded and dispatched to another object through
a uniform interface.

Usage
Create a proxy object for a list of interfaces without writing the proxy
class at compile-time.




    Rafael Luque (Osoco)        Java Dynamic Proxies             04/2009   3 / 17
Introduction


Introduction



Dynamic Proxy Class
A class that implements a list of interfaces specified at runtime, such
that a method invocation through one of the interfaces on an instance
of the class will be encoded and dispatched to another object through
a uniform interface.

Usage
Create a proxy object for a list of interfaces without writing the proxy
class at compile-time.




    Rafael Luque (Osoco)        Java Dynamic Proxies             04/2009   3 / 17
Creating a Proxy Class


Contents



1   Introduction


2   Creating a Proxy Class
      Proxy Class Properties


3   Creating a Proxy Instance


4   Examples




    Rafael Luque (Osoco)                Java Dynamic Proxies   04/2009   4 / 17
Creating a Proxy Class


Creating a Proxy Class

 • Proxy classes and instances are created using static methods of
   java.lang.reflect.Proxy.
 • Proxy.getProxyClass() returns the java.lang.Class
   object for a proxy class given a class loader and an array of
   interfaces.
 • The proxy class will be defined in the specified class loader and
   will implement all the interfaces.
 • Dynamic Proxy Class API implementations keep a cache of
   generated proxy classes:
       • If a proxy class for the same permutation of interfaces has already
           been defined by the class loader, then the existing proxy class will
           be returned; otherwise, a proxy class for those interfaces will be
           generated dynamically.


   Rafael Luque (Osoco)                Java Dynamic Proxies          04/2009   5 / 17
Creating a Proxy Class


Creating a Proxy Class

 • Proxy classes and instances are created using static methods of
   java.lang.reflect.Proxy.
 • Proxy.getProxyClass() returns the java.lang.Class
   object for a proxy class given a class loader and an array of
   interfaces.
 • The proxy class will be defined in the specified class loader and
   will implement all the interfaces.
 • Dynamic Proxy Class API implementations keep a cache of
   generated proxy classes:
       • If a proxy class for the same permutation of interfaces has already
           been defined by the class loader, then the existing proxy class will
           be returned; otherwise, a proxy class for those interfaces will be
           generated dynamically.


   Rafael Luque (Osoco)                Java Dynamic Proxies          04/2009   5 / 17
Creating a Proxy Class


Creating a Proxy Class

 • Proxy classes and instances are created using static methods of
   java.lang.reflect.Proxy.
 • Proxy.getProxyClass() returns the java.lang.Class
   object for a proxy class given a class loader and an array of
   interfaces.
 • The proxy class will be defined in the specified class loader and
   will implement all the interfaces.
 • Dynamic Proxy Class API implementations keep a cache of
   generated proxy classes:
       • If a proxy class for the same permutation of interfaces has already
           been defined by the class loader, then the existing proxy class will
           be returned; otherwise, a proxy class for those interfaces will be
           generated dynamically.


   Rafael Luque (Osoco)                Java Dynamic Proxies          04/2009   5 / 17
Creating a Proxy Class


Creating a Proxy Class

 • Proxy classes and instances are created using static methods of
   java.lang.reflect.Proxy.
 • Proxy.getProxyClass() returns the java.lang.Class
   object for a proxy class given a class loader and an array of
   interfaces.
 • The proxy class will be defined in the specified class loader and
   will implement all the interfaces.
 • Dynamic Proxy Class API implementations keep a cache of
   generated proxy classes:
       • If a proxy class for the same permutation of interfaces has already
           been defined by the class loader, then the existing proxy class will
           be returned; otherwise, a proxy class for those interfaces will be
           generated dynamically.


   Rafael Luque (Osoco)                Java Dynamic Proxies          04/2009   5 / 17
Creating a Proxy Class


Creating a Proxy Class

 • Proxy classes and instances are created using static methods of
   java.lang.reflect.Proxy.
 • Proxy.getProxyClass() returns the java.lang.Class
   object for a proxy class given a class loader and an array of
   interfaces.
 • The proxy class will be defined in the specified class loader and
   will implement all the interfaces.
 • Dynamic Proxy Class API implementations keep a cache of
   generated proxy classes:
       • If a proxy class for the same permutation of interfaces has already
           been defined by the class loader, then the existing proxy class will
           be returned; otherwise, a proxy class for those interfaces will be
           generated dynamically.


   Rafael Luque (Osoco)                Java Dynamic Proxies          04/2009   5 / 17
Creating a Proxy Class


Proxy.getProxyClass Method




Proxy.getProxyClass() method
  public static Class getProxyClass(
             ClassLoader loader,
             Class[] interfaces)
        throws IllegalArgumentException




   Rafael Luque (Osoco)                Java Dynamic Proxies   04/2009   6 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Class   Proxy Class Properties


Proxy Class Properties


 • Proxy classes are public, final, and not abstract.
 • A proxy class extends java.lang.reflect.Proxy.
 • The unqualified name of a proxy class is unspecified.
 • If a proxy class implements a non-public interface, then it will be
   defined in the same package as that interface. Otherwise, the
   package of a proxy class is also unspecified.
 • A proxy class implements exactly the interfaces specified at its
   creation, in the same order.
 • The Proxy.isProxyClass will return true if it is passed a proxy
   class.



   Rafael Luque (Osoco)                Java Dynamic Proxies                 04/2009   7 / 17
Creating a Proxy Instance


Contents



1   Introduction


2   Creating a Proxy Class
      Proxy Class Properties


3   Creating a Proxy Instance


4   Examples




    Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   8 / 17
Creating a Proxy Instance


Invocation Handler



 • Each proxy instance has an associated invocation handler object,
   which implements the interface
   java.lang.reflect.InvocationHandler.
 • A method invocation on a proxy instance will be dispatched to the
   invoke method of the instance’s invocation handler.
 • Invoke method receives the proxy instance, a
   java.lang.reflect.Method object identifying the method
   that was invoked and an array of type Object containing the
   arguments.




   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   9 / 17
Creating a Proxy Instance


Invocation Handler



 • Each proxy instance has an associated invocation handler object,
   which implements the interface
   java.lang.reflect.InvocationHandler.
 • A method invocation on a proxy instance will be dispatched to the
   invoke method of the instance’s invocation handler.
 • Invoke method receives the proxy instance, a
   java.lang.reflect.Method object identifying the method
   that was invoked and an array of type Object containing the
   arguments.




   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   9 / 17
Creating a Proxy Instance


Invocation Handler



 • Each proxy instance has an associated invocation handler object,
   which implements the interface
   java.lang.reflect.InvocationHandler.
 • A method invocation on a proxy instance will be dispatched to the
   invoke method of the instance’s invocation handler.
 • Invoke method receives the proxy instance, a
   java.lang.reflect.Method object identifying the method
   that was invoked and an array of type Object containing the
   arguments.




   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   9 / 17
Creating a Proxy Instance


Proxy Instance I


  • Each proxy class has one public constructor that takes as
    argument an implementation of the interface
    InvocationHandler.
  • You can instantiate the proxy class using the reflection API:

Proxy for the Foo interface
  Class proxyClass = Proxy.getProxyClass(
      Foo.class.getClassLoader(), new Class[] { Foo.class });
  InvocationHandler handler = new MyInvocationHandler(...);
  Foo f = (Foo) proxyClass.
      getConstructor(new Class[] { InvocationHandler.class }).
      newInstance(new Object[] { handler });




    Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   10 / 17
Creating a Proxy Instance


Proxy Instance II


  • Better, you can use the Proxy.newProxyInstance method:

Proxy using Proxy.newProxyInstance
  InvocationHandler handler = new MyInvocationHandler(...);
  Foo f = (Foo) Proxy.newProxyInstance(
      Foo.class.getClassLoader(),
      new Class[] { Foo.class },
      handler);


  • This method combines the actions of calling
    Proxy.getProxyClass with invoking the constructor with an
    invocation handler.




   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   11 / 17
Creating a Proxy Instance


Proxy Instance Properties I


  • Given a proxy instance proxy and one of the interfaces
    implemented by its proxy class Foo, the following expression will
    return true:
            proxy instanceof Foo

    and the following cast operation will succeed:
            (Foo) proxy

  • The static Proxy.getInvocationHandler method will return
    the invocation handler associated with the proxy instance passed
    as its argument.


   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   12 / 17
Creating a Proxy Instance


Proxy Instance Properties II



  • An interface method invocation on a proxy instance will be
    encoded and dispatched to the invocation handler’s invoke
    method.
  • An invocation of the hashCode, equals, or toString methods
    declared in java.lang.Object on a proxy instance will be also
    encoded and dispatched.




   Rafael Luque (Osoco)                   Java Dynamic Proxies   04/2009   13 / 17
Examples


Contents



1   Introduction


2   Creating a Proxy Class
      Proxy Class Properties


3   Creating a Proxy Instance


4   Examples




    Rafael Luque (Osoco)       Java Dynamic Proxies   04/2009   14 / 17
Examples


 DebugProxy Example I
     A proxy that prints out a message before and after each method
     invocation on an object that implements an arbitrary list of interfaces.
1        import j a v a . l a n g . r e f l e c t . Proxy ;
2
3        public class DebugProxy
4            implements j a v a . l a n g . r e f l e c t . I n v o c a t i o n H a n d l e r {
5
6           private Object obj ;
7
8           public s t a t i c O b j e c t newInstance ( O b j e c t o b j ) {
9             r e t u r n Proxy . newProxyInstance (
10                o b j . g e t C l a s s ( ) . getClassLoader ( ) ,
11                obj . getClass ( ) . g e t I n t e r f a c e s ( ) ,
12               new DebugProxy ( o b j ) ) ;
13          }
14
15          p r i v a t e DebugProxy ( O b j e c t o b j ) {
16              this . obj = obj ;
17          }
18


         Rafael Luque (Osoco)                      Java Dynamic Proxies                           04/2009   15 / 17
Examples


 DebugProxy Example II

19       public O b j e c t i n v o k e ( O b j e c t proxy , Method m, O b j e c t [ ] args )
20           throws Throwable {
21
22           Object r e s u l t ;
23           try {
24             System . o u t . p r i n t l n ( ‘ ‘ b e f o r e method ’ ’ ) ;
25             r e s u l t = m. i n v o k e ( obj , args ) ;
26           } catch ( I n v o c a t i o n T a r g e t E x c e p t i o n e ) {
27             throw e . g e t T a r g e t E x c e p t i o n ( ) ;
28           } catch ( E x c e p t i o n e ) {
29             throw new RuntimeException ( ) ;
30           } finally {
31             System . o u t . p r i n t l n ( ‘ ‘ a f t e r method ’ ’ ) ;
32           }
33           return r e s u l t ;
34
35       }
36
37   }



     Rafael Luque (Osoco)                       Java Dynamic Proxies                    04/2009   16 / 17
Understanding Dynamic Proxies
How to create proxy classes in runtime




Osoco
Rafael Luque

Understanding Java Dynamic Proxies

  • 1.
    Understanding Dynamic Proxies Howto create proxy classes in runtime Osoco Rafael Luque
  • 2.
    Introduction Contents 1 Introduction 2 Creating a Proxy Class Proxy Class Properties 3 Creating a Proxy Instance 4 Examples Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 2 / 17
  • 3.
    Introduction Introduction Dynamic Proxy Class Aclass that implements a list of interfaces specified at runtime, such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. Usage Create a proxy object for a list of interfaces without writing the proxy class at compile-time. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 3 / 17
  • 4.
    Introduction Introduction Dynamic Proxy Class Aclass that implements a list of interfaces specified at runtime, such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. Usage Create a proxy object for a list of interfaces without writing the proxy class at compile-time. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 3 / 17
  • 5.
    Creating a ProxyClass Contents 1 Introduction 2 Creating a Proxy Class Proxy Class Properties 3 Creating a Proxy Instance 4 Examples Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 4 / 17
  • 6.
    Creating a ProxyClass Creating a Proxy Class • Proxy classes and instances are created using static methods of java.lang.reflect.Proxy. • Proxy.getProxyClass() returns the java.lang.Class object for a proxy class given a class loader and an array of interfaces. • The proxy class will be defined in the specified class loader and will implement all the interfaces. • Dynamic Proxy Class API implementations keep a cache of generated proxy classes: • If a proxy class for the same permutation of interfaces has already been defined by the class loader, then the existing proxy class will be returned; otherwise, a proxy class for those interfaces will be generated dynamically. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 5 / 17
  • 7.
    Creating a ProxyClass Creating a Proxy Class • Proxy classes and instances are created using static methods of java.lang.reflect.Proxy. • Proxy.getProxyClass() returns the java.lang.Class object for a proxy class given a class loader and an array of interfaces. • The proxy class will be defined in the specified class loader and will implement all the interfaces. • Dynamic Proxy Class API implementations keep a cache of generated proxy classes: • If a proxy class for the same permutation of interfaces has already been defined by the class loader, then the existing proxy class will be returned; otherwise, a proxy class for those interfaces will be generated dynamically. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 5 / 17
  • 8.
    Creating a ProxyClass Creating a Proxy Class • Proxy classes and instances are created using static methods of java.lang.reflect.Proxy. • Proxy.getProxyClass() returns the java.lang.Class object for a proxy class given a class loader and an array of interfaces. • The proxy class will be defined in the specified class loader and will implement all the interfaces. • Dynamic Proxy Class API implementations keep a cache of generated proxy classes: • If a proxy class for the same permutation of interfaces has already been defined by the class loader, then the existing proxy class will be returned; otherwise, a proxy class for those interfaces will be generated dynamically. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 5 / 17
  • 9.
    Creating a ProxyClass Creating a Proxy Class • Proxy classes and instances are created using static methods of java.lang.reflect.Proxy. • Proxy.getProxyClass() returns the java.lang.Class object for a proxy class given a class loader and an array of interfaces. • The proxy class will be defined in the specified class loader and will implement all the interfaces. • Dynamic Proxy Class API implementations keep a cache of generated proxy classes: • If a proxy class for the same permutation of interfaces has already been defined by the class loader, then the existing proxy class will be returned; otherwise, a proxy class for those interfaces will be generated dynamically. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 5 / 17
  • 10.
    Creating a ProxyClass Creating a Proxy Class • Proxy classes and instances are created using static methods of java.lang.reflect.Proxy. • Proxy.getProxyClass() returns the java.lang.Class object for a proxy class given a class loader and an array of interfaces. • The proxy class will be defined in the specified class loader and will implement all the interfaces. • Dynamic Proxy Class API implementations keep a cache of generated proxy classes: • If a proxy class for the same permutation of interfaces has already been defined by the class loader, then the existing proxy class will be returned; otherwise, a proxy class for those interfaces will be generated dynamically. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 5 / 17
  • 11.
    Creating a ProxyClass Proxy.getProxyClass Method Proxy.getProxyClass() method public static Class getProxyClass( ClassLoader loader, Class[] interfaces) throws IllegalArgumentException Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 6 / 17
  • 12.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 13.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 14.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 15.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 16.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 17.
    Creating a ProxyClass Proxy Class Properties Proxy Class Properties • Proxy classes are public, final, and not abstract. • A proxy class extends java.lang.reflect.Proxy. • The unqualified name of a proxy class is unspecified. • If a proxy class implements a non-public interface, then it will be defined in the same package as that interface. Otherwise, the package of a proxy class is also unspecified. • A proxy class implements exactly the interfaces specified at its creation, in the same order. • The Proxy.isProxyClass will return true if it is passed a proxy class. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 7 / 17
  • 18.
    Creating a ProxyInstance Contents 1 Introduction 2 Creating a Proxy Class Proxy Class Properties 3 Creating a Proxy Instance 4 Examples Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 8 / 17
  • 19.
    Creating a ProxyInstance Invocation Handler • Each proxy instance has an associated invocation handler object, which implements the interface java.lang.reflect.InvocationHandler. • A method invocation on a proxy instance will be dispatched to the invoke method of the instance’s invocation handler. • Invoke method receives the proxy instance, a java.lang.reflect.Method object identifying the method that was invoked and an array of type Object containing the arguments. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 9 / 17
  • 20.
    Creating a ProxyInstance Invocation Handler • Each proxy instance has an associated invocation handler object, which implements the interface java.lang.reflect.InvocationHandler. • A method invocation on a proxy instance will be dispatched to the invoke method of the instance’s invocation handler. • Invoke method receives the proxy instance, a java.lang.reflect.Method object identifying the method that was invoked and an array of type Object containing the arguments. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 9 / 17
  • 21.
    Creating a ProxyInstance Invocation Handler • Each proxy instance has an associated invocation handler object, which implements the interface java.lang.reflect.InvocationHandler. • A method invocation on a proxy instance will be dispatched to the invoke method of the instance’s invocation handler. • Invoke method receives the proxy instance, a java.lang.reflect.Method object identifying the method that was invoked and an array of type Object containing the arguments. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 9 / 17
  • 22.
    Creating a ProxyInstance Proxy Instance I • Each proxy class has one public constructor that takes as argument an implementation of the interface InvocationHandler. • You can instantiate the proxy class using the reflection API: Proxy for the Foo interface Class proxyClass = Proxy.getProxyClass( Foo.class.getClassLoader(), new Class[] { Foo.class }); InvocationHandler handler = new MyInvocationHandler(...); Foo f = (Foo) proxyClass. getConstructor(new Class[] { InvocationHandler.class }). newInstance(new Object[] { handler }); Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 10 / 17
  • 23.
    Creating a ProxyInstance Proxy Instance II • Better, you can use the Proxy.newProxyInstance method: Proxy using Proxy.newProxyInstance InvocationHandler handler = new MyInvocationHandler(...); Foo f = (Foo) Proxy.newProxyInstance( Foo.class.getClassLoader(), new Class[] { Foo.class }, handler); • This method combines the actions of calling Proxy.getProxyClass with invoking the constructor with an invocation handler. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 11 / 17
  • 24.
    Creating a ProxyInstance Proxy Instance Properties I • Given a proxy instance proxy and one of the interfaces implemented by its proxy class Foo, the following expression will return true: proxy instanceof Foo and the following cast operation will succeed: (Foo) proxy • The static Proxy.getInvocationHandler method will return the invocation handler associated with the proxy instance passed as its argument. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 12 / 17
  • 25.
    Creating a ProxyInstance Proxy Instance Properties II • An interface method invocation on a proxy instance will be encoded and dispatched to the invocation handler’s invoke method. • An invocation of the hashCode, equals, or toString methods declared in java.lang.Object on a proxy instance will be also encoded and dispatched. Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 13 / 17
  • 26.
    Examples Contents 1 Introduction 2 Creating a Proxy Class Proxy Class Properties 3 Creating a Proxy Instance 4 Examples Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 14 / 17
  • 27.
    Examples DebugProxy ExampleI A proxy that prints out a message before and after each method invocation on an object that implements an arbitrary list of interfaces. 1 import j a v a . l a n g . r e f l e c t . Proxy ; 2 3 public class DebugProxy 4 implements j a v a . l a n g . r e f l e c t . I n v o c a t i o n H a n d l e r { 5 6 private Object obj ; 7 8 public s t a t i c O b j e c t newInstance ( O b j e c t o b j ) { 9 r e t u r n Proxy . newProxyInstance ( 10 o b j . g e t C l a s s ( ) . getClassLoader ( ) , 11 obj . getClass ( ) . g e t I n t e r f a c e s ( ) , 12 new DebugProxy ( o b j ) ) ; 13 } 14 15 p r i v a t e DebugProxy ( O b j e c t o b j ) { 16 this . obj = obj ; 17 } 18 Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 15 / 17
  • 28.
    Examples DebugProxy ExampleII 19 public O b j e c t i n v o k e ( O b j e c t proxy , Method m, O b j e c t [ ] args ) 20 throws Throwable { 21 22 Object r e s u l t ; 23 try { 24 System . o u t . p r i n t l n ( ‘ ‘ b e f o r e method ’ ’ ) ; 25 r e s u l t = m. i n v o k e ( obj , args ) ; 26 } catch ( I n v o c a t i o n T a r g e t E x c e p t i o n e ) { 27 throw e . g e t T a r g e t E x c e p t i o n ( ) ; 28 } catch ( E x c e p t i o n e ) { 29 throw new RuntimeException ( ) ; 30 } finally { 31 System . o u t . p r i n t l n ( ‘ ‘ a f t e r method ’ ’ ) ; 32 } 33 return r e s u l t ; 34 35 } 36 37 } Rafael Luque (Osoco) Java Dynamic Proxies 04/2009 16 / 17
  • 29.
    Understanding Dynamic Proxies Howto create proxy classes in runtime Osoco Rafael Luque