SlideShare a Scribd company logo
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

More Related Content

What's hot (20)

PPTX
Java bytecode and classes
yoavwix
 
PPTX
JAVA BYTE CODE
Javed Ahmed Samo
 
PDF
Smalltalk on the JVM
ESUG
 
PPTX
Java architecture
Rakesh
 
PPTX
Java byte code & virtual machine
Laxman Puri
 
PPT
Presentation on java
shashi shekhar
 
PDF
Introduction to java (revised)
Sujit Majety
 
PDF
Calypso underhood
ESUG
 
PDF
Lec 3 01_aug13
Palak Sanghani
 
PPTX
Introduction to Java Programming
Saravanakumar R
 
PDF
Introduction to the Java bytecode - So@t - 20130924
yohanbeschi
 
PPTX
Java virtual machine
Nikhil Sharma
 
PDF
Introduction to Java Programming
Ravi Kant Sahu
 
PDF
Learn Java with Dr. Rifat Shahriyar
Abir Mohammad
 
PDF
Lecture 3
Debasish Pratihari
 
PDF
Core Java Introduction | Basics
Hùng Nguyễn Huy
 
PDF
First-Class Undefined Classes for Pharo, From Alternative Designs to a Unifie...
ESUG
 
PPTX
History of java'
deepthisujithra
 
PPTX
Introduction to JAVA
Md. Tanvir Hossain
 
DOCX
Introduction to java
jayc8586
 
Java bytecode and classes
yoavwix
 
JAVA BYTE CODE
Javed Ahmed Samo
 
Smalltalk on the JVM
ESUG
 
Java architecture
Rakesh
 
Java byte code & virtual machine
Laxman Puri
 
Presentation on java
shashi shekhar
 
Introduction to java (revised)
Sujit Majety
 
Calypso underhood
ESUG
 
Lec 3 01_aug13
Palak Sanghani
 
Introduction to Java Programming
Saravanakumar R
 
Introduction to the Java bytecode - So@t - 20130924
yohanbeschi
 
Java virtual machine
Nikhil Sharma
 
Introduction to Java Programming
Ravi Kant Sahu
 
Learn Java with Dr. Rifat Shahriyar
Abir Mohammad
 
Core Java Introduction | Basics
Hùng Nguyễn Huy
 
First-Class Undefined Classes for Pharo, From Alternative Designs to a Unifie...
ESUG
 
History of java'
deepthisujithra
 
Introduction to JAVA
Md. Tanvir Hossain
 
Introduction to java
jayc8586
 

Similar to Understanding Java Dynamic Proxies (20)

PPT
Adapter Poxy Pattern
Philip Zhong
 
PDF
Proxy deep-dive java-one_20151027_001
Sven Ruppert
 
PPT
Java OOP s concepts and buzzwords
Raja Sekhar
 
PDF
Metaprograms and metadata (as part of the the PTT lecture)
Ralf Laemmel
 
PPTX
Proxy Design Pattern
Anjan Kumar Bollam
 
PPT
Java Network Programming 1197644949195966 4
chendi.bhargavi
 
PPT
Java Network Programming
backdoor
 
PDF
Dynamic Binding in C# 4.0
Buu Nguyen
 
PPT
Packages and interfaces
vanithaRamasamy
 
PPTX
13. interfaces
M H Buddhika Ariyaratne
 
PDF
Proxy Deep Dive Voxxed Belgrad 2015
Sven Ruppert
 
PPTX
The Art of Metaprogramming in Java
Abdelmonaim Remani
 
PPSX
Proxy design pattern
Sase Kleckovski
 
PPTX
Objects and classes in OO Programming concepts
researchveltech
 
PPTX
JavaBrotherYouarefuckedupinthis world...
ShashankG44
 
PPT
Proxy pattern
Chester Hartin
 
PDF
Exception handling and packages.pdf
Kp Sharma
 
PPTX
Design patterns
Alok Guha
 
PPT
Java New Evolution
Allan Huang
 
PPTX
Unit II Inheritance ,Interface and Packages.pptx
pranalisonawane8600
 
Adapter Poxy Pattern
Philip Zhong
 
Proxy deep-dive java-one_20151027_001
Sven Ruppert
 
Java OOP s concepts and buzzwords
Raja Sekhar
 
Metaprograms and metadata (as part of the the PTT lecture)
Ralf Laemmel
 
Proxy Design Pattern
Anjan Kumar Bollam
 
Java Network Programming 1197644949195966 4
chendi.bhargavi
 
Java Network Programming
backdoor
 
Dynamic Binding in C# 4.0
Buu Nguyen
 
Packages and interfaces
vanithaRamasamy
 
13. interfaces
M H Buddhika Ariyaratne
 
Proxy Deep Dive Voxxed Belgrad 2015
Sven Ruppert
 
The Art of Metaprogramming in Java
Abdelmonaim Remani
 
Proxy design pattern
Sase Kleckovski
 
Objects and classes in OO Programming concepts
researchveltech
 
JavaBrotherYouarefuckedupinthis world...
ShashankG44
 
Proxy pattern
Chester Hartin
 
Exception handling and packages.pdf
Kp Sharma
 
Design patterns
Alok Guha
 
Java New Evolution
Allan Huang
 
Unit II Inheritance ,Interface and Packages.pptx
pranalisonawane8600
 
Ad

Recently uploaded (20)

PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
ICONIQ State of AI Report 2025 - The Builder's Playbook
Razin Mustafiz
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PDF
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PDF
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
ICONIQ State of AI Report 2025 - The Builder's Playbook
Razin Mustafiz
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Ad

Understanding Java Dynamic Proxies

  • 1. Understanding Dynamic Proxies How to 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 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
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. 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
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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
  • 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
  • 18. 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
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
  • 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 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
  • 28. 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
  • 29. Understanding Dynamic Proxies How to create proxy classes in runtime Osoco Rafael Luque