Package: org.codehaus.groovy.runtime

## [Java] Class ProxyGeneratorAdapter

- org.codehaus.groovy.runtime.ProxyGeneratorAdapter

-     public class ProxyGeneratorAdapter
      extends org.objectweb.asm.ClassVisitor

  A proxy generator responsible for mapping a map of closures to a class implementing a list of interfaces. For example, the following code:

           abstract class Foo {
               abstract void bar();
               abstract void baz();
           }
           def dyn = [bar: { println 'hello' }, baz: { println 'world'}] as Foo

  will generate a proxy class which extends class Foo and delegates method calls to the provided closures. The generated proxy implements the GroovyObject interface. Additionally, this proxy generator supports delegation to another object. In that case, if a method is defined both in the closure map and the delegate, the version from the map is preferred. This allows overriding methods from delegates with ease. Internally, the proxy generator makes use of ASM to generate bytecode, for improved performance as compared to the legacy proxy generation mechanism which made use of string templates.
  Since:
    2.0.0

- - ### Constructor Summary

    Constructors
    Constructor and description
    `ProxyGeneratorAdapter(Map<Object, Object> closureMap, Class requestedSuperClass, Class[] interfaces, ClassLoader proxyLoader, boolean emptyBody, Class delegateClass)` Construct a proxy generator.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `public GroovyObject` | `delegatingProxy(Object delegate, Map<Object, Object> map, Object constructorArgs)`
    `` | `public static Closure` | `ensureClosure(Object o)` Ensures that the provided object is wrapped into a closure if it's not a closure.
    `` | `public boolean` | `isProxyHidden()` Diagnostic: `true` if this adapter's proxy was defined as a hidden nestmate (JEP 371).
    `` | `protected org.objectweb.asm.MethodVisitor` | `makeDelegateCall(String name, String desc, String signature, String[] exceptions, int accessFlags)` Generate a call to the delegate object.
    `` | `protected org.objectweb.asm.MethodVisitor` | `makeDelegateToClosureCall(String name, String desc, String signature, String[] exceptions, int accessFlags)`
    `` | `public GroovyObject` | `proxy(Map<Object, Object> map, Object constructorArgs)`
    `` | `public String` | `proxyName()` Returns the proxy name used in the generated bytecode (internal form).
    `` | `public void` | `visit(int version, int access, String name, String signature, String superName, String[] interfaces)`
    `` | `public org.objectweb.asm.MethodVisitor` | `visitMethod(int access, String name, String desc, String signature, String[] exceptions)`

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class org.objectweb.asm.ClassVisitor` | `org.objectweb.asm.ClassVisitor#equals(java.lang.Object), org.objectweb.asm.ClassVisitor#getClass(), org.objectweb.asm.ClassVisitor#getDelegate(), org.objectweb.asm.ClassVisitor#hashCode(), org.objectweb.asm.ClassVisitor#notify(), org.objectweb.asm.ClassVisitor#notifyAll(), org.objectweb.asm.ClassVisitor#toString(), org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String, java.lang.String, java.lang.String, [Ljava.lang.String;), org.objectweb.asm.ClassVisitor#visitAnnotation(java.lang.String, boolean), org.objectweb.asm.ClassVisitor#visitAttribute(org.objectweb.asm.Attribute), org.objectweb.asm.ClassVisitor#visitEnd(), org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object), org.objectweb.asm.ClassVisitor#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int), org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, [Ljava.lang.String;), org.objectweb.asm.ClassVisitor#visitModule(java.lang.String, int, java.lang.String), org.objectweb.asm.ClassVisitor#visitNestHost(java.lang.String), org.objectweb.asm.ClassVisitor#visitNestMember(java.lang.String), org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String, java.lang.String, java.lang.String), org.objectweb.asm.ClassVisitor#visitPermittedSubclass(java.lang.String), org.objectweb.asm.ClassVisitor#visitRecordComponent(java.lang.String, java.lang.String, java.lang.String), org.objectweb.asm.ClassVisitor#visitSource(java.lang.String, java.lang.String), org.objectweb.asm.ClassVisitor#visitTypeAnnotation(int, org.objectweb.asm.TypePath, java.lang.String, boolean), org.objectweb.asm.ClassVisitor#wait(), org.objectweb.asm.ClassVisitor#wait(long), org.objectweb.asm.ClassVisitor#wait(long, int)`

- - ### Constructor Detail

    - #### public ProxyGeneratorAdapter(Map<Object, Object> closureMap, Class requestedSuperClass, Class[] interfaces, ClassLoader proxyLoader, boolean emptyBody, Class delegateClass)

      Construct a proxy generator. This generator is used when we need to create a proxy object for a class or an interface given a map of closures.

      Parameters:
        `closureMap` - the delegates implementations
        `interfaces` - extra interfaces the proxy should implement
        `proxyLoader` - the class loader which should be used to load the generated proxy
        `delegateClass` - if not null, generate a delegate field with the corresponding class
        `emptyBody` - if set to true, the unimplemented abstract methods will receive an empty body instead of throwing an UnsupportedOperationException.

  - ### Method Detail

    - #### public GroovyObject delegatingProxy(Object delegate, Map<Object, Object> map, Object constructorArgs)

    - #### public static Closure ensureClosure(Object o)

      Ensures that the provided object is wrapped into a closure if it's not a closure. Do not trust IDEs, this method is used in bytecode.

    - #### public boolean isProxyHidden()

      Diagnostic: `true` if this adapter's proxy was defined as a hidden nestmate (JEP 371). Not part of the stable user-facing proxy contract.

      Returns:
        `true` when the proxy class is hidden

    - #### protected org.objectweb.asm.MethodVisitor makeDelegateCall(String name, String desc, String signature, String[] exceptions, int accessFlags)

      Generate a call to the delegate object.

    - #### protected org.objectweb.asm.MethodVisitor makeDelegateToClosureCall(String name, String desc, String signature, String[] exceptions, int accessFlags)

    - #### public GroovyObject proxy(Map<Object, Object> map, Object constructorArgs)

    - #### public String proxyName()

      Returns the proxy name used in the generated bytecode (internal form). This is also the name visible in stack traces for visible-class proxies.

      Returns:
        the proxy name

    - #### public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)

    - #### public org.objectweb.asm.MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)