Class ProxyFactory<T>

    • Constructor Detail

      • ProxyFactory

        public ProxyFactory​(String contextId,
                            Class<?> proxiedBeanType,
                            Set<? extends Type> typeClosure,
                            jakarta.enterprise.inject.spi.Bean<?> bean)
        created a new proxy factory from a bean instance. The proxy name is generated from the bean id
      • ProxyFactory

        public ProxyFactory​(String contextId,
                            Class<?> proxiedBeanType,
                            Set<? extends Type> typeClosure,
                            jakarta.enterprise.inject.spi.Bean<?> bean,
                            boolean forceSuperClass)
      • ProxyFactory

        public ProxyFactory​(String contextId,
                            Class<?> proxiedBeanType,
                            Set<? extends Type> typeClosure,
                            String proxyName,
                            jakarta.enterprise.inject.spi.Bean<?> bean)
        Creates a new proxy factory when the name of the proxy class is already known, such as during de-serialization
        Parameters:
        proxiedBeanType - the super-class for this proxy class
        typeClosure - the bean types of the bean
        proxyName - the name of the proxy class
      • ProxyFactory

        public ProxyFactory​(String contextId,
                            Class<?> proxiedBeanType,
                            Set<? extends Type> typeClosure,
                            String proxyName,
                            jakarta.enterprise.inject.spi.Bean<?> bean,
                            boolean forceSuperClass)
    • Method Detail

      • setBeanInstance

        public static <T> void setBeanInstance​(String contextId,
                                               T proxy,
                                               BeanInstance beanInstance,
                                               jakarta.enterprise.inject.spi.Bean<?> bean)
        Convenience method to set the underlying bean instance for a proxy.
        Parameters:
        proxy - the proxy instance
        beanInstance - the instance of the bean
      • addInterfacesFromTypeClosure

        public void addInterfacesFromTypeClosure​(Set<? extends Type> typeClosure,
                                                 Class<?> proxiedBeanType)
      • addInterface

        public void addInterface​(Class<?> newInterface)
        Adds an additional interface that the proxy should implement. The default implementation will be to forward invocations to the bean instance.
        Parameters:
        newInterface - an interface
      • create

        public T create​(BeanInstance beanInstance)
        Method to create a new proxy that wraps the bean instance.
        Parameters:
        beanInstance - the bean instance
        Returns:
        a new proxy object
      • getProxyClass

        public Class<T> getProxyClass()
        Produces or returns the existing proxy class. The operation is thread-safe.
        Returns:
        always the class of the proxy
      • getBaseProxyName

        protected String getBaseProxyName()
        Returns the package and base name for the proxy class.
        Returns:
        base name without suffixes
      • getProxyNameSuffix

        protected String getProxyNameSuffix()
        Returns a suffix to append to the name of the proxy class. The name already consists of _$$_Weld, to which the suffix is added. This allows the creation of different types of proxies for the same class.
        Returns:
        a name suffix
      • addAdditionalInterfaces

        protected void addAdditionalInterfaces​(Set<Class<?>> interfaces)
        Sub classes may override to specify additional interfaces the proxy should implement
      • addConstructors

        protected void addConstructors​(org.jboss.classfilewriter.ClassFile proxyClassType,
                                       List<DeferredBytecode> initialValueBytecode)
        Adds a constructor for the proxy for each constructor declared by the base bean type.
        Parameters:
        proxyClassType - the Javassist class for the proxy
        initialValueBytecode -
      • addFields

        protected void addFields​(org.jboss.classfilewriter.ClassFile proxyClassType,
                                 List<DeferredBytecode> initialValueBytecode)
      • addMethods

        protected void addMethods​(org.jboss.classfilewriter.ClassFile proxyClassType,
                                  org.jboss.classfilewriter.ClassMethod staticConstructor)
      • addSerializationSupport

        protected void addSerializationSupport​(org.jboss.classfilewriter.ClassFile proxyClassType)
        Adds special serialization code. By default this is a nop
        Parameters:
        proxyClassType - the Javassist class for the proxy class
      • addMethodsFromClass

        protected void addMethodsFromClass​(org.jboss.classfilewriter.ClassFile proxyClassType,
                                           org.jboss.classfilewriter.ClassMethod staticConstructor)
      • isMethodAccepted

        protected boolean isMethodAccepted​(Method method,
                                           Class<?> proxySuperclass)
      • generateHashCodeMethod

        protected void generateHashCodeMethod​(org.jboss.classfilewriter.ClassFile proxyClassType)
        Generate the body of the proxies hashCode method.

        If this method returns null, the method will not be added, and the hashCode on the superclass will be used as per normal virtual method resolution rules

      • generateEqualsMethod

        protected void generateEqualsMethod​(org.jboss.classfilewriter.ClassFile proxyClassType)
        Generate the body of the proxies equals method.

        If this method returns null, the method will not be added, and the hashCode on the superclass will be used as per normal virtual method resolution rules

        Parameters:
        proxyClassType - The class file
      • createSpecialMethodBody

        protected void createSpecialMethodBody​(org.jboss.classfilewriter.ClassMethod proxyClassType,
                                               MethodInformation method,
                                               org.jboss.classfilewriter.ClassMethod staticConstructor)
      • addConstructedGuardToMethodBody

        protected void addConstructedGuardToMethodBody​(org.jboss.classfilewriter.ClassMethod classMethod)
      • addConstructedGuardToMethodBody

        protected void addConstructedGuardToMethodBody​(org.jboss.classfilewriter.ClassMethod classMethod,
                                                       String className)
        Adds the following code to a delegating method:

        if(!this.constructed) return super.thisMethod()

        This means that the proxy will not start to delegate to the underlying bean instance until after the constructor has finished.

      • createForwardingMethodBody

        protected void createForwardingMethodBody​(org.jboss.classfilewriter.ClassMethod classMethod,
                                                  MethodInformation method,
                                                  org.jboss.classfilewriter.ClassMethod staticConstructor)
      • createInterceptorBody

        protected void createInterceptorBody​(org.jboss.classfilewriter.ClassMethod classMethod,
                                             MethodInformation method,
                                             org.jboss.classfilewriter.ClassMethod staticConstructor)
        Creates the given method on the proxy class where the implementation forwards the call directly to the method handler.

        the generated bytecode is equivalent to:

        return (RetType) methodHandler.invoke(this,param1,param2);

        Parameters:
        classMethod - the class method
        method - any JLR method
      • invokeMethodHandler

        protected void invokeMethodHandler​(org.jboss.classfilewriter.ClassMethod classMethod,
                                           MethodInformation method,
                                           boolean addReturnInstruction,
                                           BytecodeMethodResolver bytecodeMethodResolver,
                                           org.jboss.classfilewriter.ClassMethod staticConstructor)
        calls methodHandler.invoke for a given method
        Parameters:
        method - The method information
        addReturnInstruction - set to true you want to return the result of the method invocation
        bytecodeMethodResolver - The resolver that returns the method to invoke
      • addSpecialMethods

        protected void addSpecialMethods​(org.jboss.classfilewriter.ClassFile proxyClassType,
                                         org.jboss.classfilewriter.ClassMethod staticConstructor)
        Adds methods requiring special implementations rather than just delegation.
        Parameters:
        proxyClassType - the Javassist class description for the proxy type
      • generateSetMethodHandlerBody

        protected void generateSetMethodHandlerBody​(org.jboss.classfilewriter.ClassMethod method)
      • generateGetMethodHandlerBody

        protected void generateGetMethodHandlerBody​(org.jboss.classfilewriter.ClassMethod method)
      • getBeanType

        public Class<?> getBeanType()
      • getAdditionalInterfaces

        public Set<Class<?>> getAdditionalInterfaces()
      • getBean

        public jakarta.enterprise.inject.spi.Bean<?> getBean()
      • getContextId

        public String getContextId()
      • getProxiedBeanType

        protected Class<?> getProxiedBeanType()
      • getMethodHandlerField

        protected void getMethodHandlerField​(org.jboss.classfilewriter.ClassFile file,
                                             org.jboss.classfilewriter.code.CodeAttribute b)
      • getProxySuperclass

        protected Class<?> getProxySuperclass()
      • isUsingProxyInstantiator

        protected boolean isUsingProxyInstantiator()
        Returns:
        true if ProxyInstantiator is used to instantiate proxy instances
      • toClass

        protected Class<?> toClass​(org.jboss.classfilewriter.ClassFile ct,
                                   Class<?> originalClass,
                                   org.jboss.weld.serialization.spi.ProxyServices proxyServices,
                                   ProtectionDomain domain)
        Delegates proxy creation via ProxyServices to the integrator or to our own implementation.