Package org.jboss.weld.bean.proxy
Class ProxyFactory<T>
java.lang.Object
org.jboss.weld.bean.proxy.ProxyFactory<T>
- Direct Known Subclasses:
ClientProxyFactory,DecoratorProxyFactory,InterceptedProxyFactory,InterceptedSubclassFactory
Main factory to produce proxy classes and instances for Weld beans. This
implementation creates proxies which forward non-static method invocations to
a
BeanInstance. All proxies implement the Proxy interface.- Author:
- David Allen, Stuart Douglas, Marius Bogoevici, Ales Justin
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final Stringprotected static final BytecodeMethodResolverstatic final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringprotected static final Stringstatic final Stringstatic final String -
Constructor Summary
ConstructorsConstructorDescriptionProxyFactory(String contextId, Class<?> proxiedBeanType, Set<? extends Type> typeClosure, jakarta.enterprise.inject.spi.Bean<?> bean) created a new proxy factory from a bean instance.ProxyFactory(String contextId, Class<?> proxiedBeanType, Set<? extends Type> typeClosure, jakarta.enterprise.inject.spi.Bean<?> bean, boolean forceSuperClass) 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-serializationProxyFactory(String contextId, Class<?> proxiedBeanType, Set<? extends Type> typeClosure, String proxyName, jakarta.enterprise.inject.spi.Bean<?> bean, boolean forceSuperClass) -
Method Summary
Modifier and TypeMethodDescriptionprotected voidaddAdditionalInterfaces(Set<Class<?>> interfaces) Sub classes may override to specify additional interfaces the proxy should implementprotected voidaddConstructedGuardToMethodBody(org.jboss.classfilewriter.ClassMethod classMethod) protected voidaddConstructedGuardToMethodBody(org.jboss.classfilewriter.ClassMethod classMethod, String className) Adds the following code to a delegating method:protected voidaddConstructors(org.jboss.classfilewriter.ClassFile proxyClassType, List<DeferredBytecode> initialValueBytecode) Adds a constructor for the proxy for each constructor declared by the base bean type.protected voidaddFields(org.jboss.classfilewriter.ClassFile proxyClassType, List<DeferredBytecode> initialValueBytecode) voidaddInterface(Class<?> newInterface) Adds an additional interface that the proxy should implement.voidaddInterfacesFromTypeClosure(Set<? extends Type> typeClosure, Class<?> proxiedBeanType) protected voidaddMethods(org.jboss.classfilewriter.ClassFile proxyClassType, org.jboss.classfilewriter.ClassMethod staticConstructor) protected voidaddMethodsFromClass(org.jboss.classfilewriter.ClassFile proxyClassType, org.jboss.classfilewriter.ClassMethod staticConstructor) protected voidaddSerializationSupport(org.jboss.classfilewriter.ClassFile proxyClassType) Adds special serialization code.protected voidaddSpecialMethods(org.jboss.classfilewriter.ClassFile proxyClassType, org.jboss.classfilewriter.ClassMethod staticConstructor) Adds methods requiring special implementations rather than just delegation.create(BeanInstance beanInstance) Method to create a new proxy that wraps the bean instance.protected voidcreateForwardingMethodBody(org.jboss.classfilewriter.ClassMethod classMethod, MethodInformation method, org.jboss.classfilewriter.ClassMethod staticConstructor) protected voidcreateInterceptorBody(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.protected voidcreateSpecialMethodBody(org.jboss.classfilewriter.ClassMethod proxyClassType, MethodInformation method, org.jboss.classfilewriter.ClassMethod staticConstructor) protected voidgenerateEqualsMethod(org.jboss.classfilewriter.ClassFile proxyClassType) Generate the body of the proxies equals method.protected voidgenerateGetMethodHandlerBody(org.jboss.classfilewriter.ClassMethod method) protected voidgenerateHashCodeMethod(org.jboss.classfilewriter.ClassFile proxyClassType) Generate the body of the proxies hashCode method.protected voidgenerateSetMethodHandlerBody(org.jboss.classfilewriter.ClassMethod method) protected StringReturns the package and base name for the proxy class.jakarta.enterprise.inject.spi.Bean<?>getBean()Class<?>protected voidgetMethodHandlerField(org.jboss.classfilewriter.ClassFile file, org.jboss.classfilewriter.code.CodeAttribute b) protected Class<? extends MethodHandler>protected Class<?>Produces or returns the existing proxy class.protected StringReturns a suffix to append to the name of the proxy class.protected Class<?>protected voidinvokeMethodHandler(org.jboss.classfilewriter.ClassMethod classMethod, MethodInformation method, boolean addReturnInstruction, BytecodeMethodResolver bytecodeMethodResolver, org.jboss.classfilewriter.ClassMethod staticConstructor) calls methodHandler.invoke for a given methodprotected booleanisMethodAccepted(Method method, Class<?> proxySuperclass) protected booleanstatic <T> voidsetBeanInstance(String contextId, T proxy, BeanInstance beanInstance, jakarta.enterprise.inject.spi.Bean<?> bean) Convenience method to set the underlying bean instance for a proxy.protected Class<?>toClass(org.jboss.classfilewriter.ClassFile ct, Class<?> originalClass, org.jboss.weld.serialization.spi.ProxyServices proxyServices, ProtectionDomain domain) Delegates proxy creation viaProxyServicesto the integrator or to our own implementation.
-
Field Details
-
PROXY_SUFFIX
- See Also:
-
WELD_PROXY_PREFIX
- See Also:
-
DEFAULT_PROXY_PACKAGE
- See Also:
-
CONSTRUCTED_FLAG_NAME
- See Also:
-
DEFAULT_METHOD_RESOLVER
-
LJAVA_LANG_REFLECT_METHOD
- See Also:
-
LJAVA_LANG_BYTE
- See Also:
-
LJAVA_LANG_CLASS
- See Also:
-
LJAVA_LANG_OBJECT
- See Also:
-
LBEAN_IDENTIFIER
- See Also:
-
LJAVA_LANG_STRING
- See Also:
-
LJAVA_LANG_THREAD_LOCAL
- See Also:
-
INIT_METHOD_NAME
- See Also:
-
INVOKE_METHOD_NAME
- See Also:
-
METHOD_HANDLER_FIELD_NAME
- See Also:
-
-
Constructor Details
-
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
-
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 classtypeClosure- the bean types of the beanproxyName- the name of the proxy class
-
ProxyFactory
-
-
Method Details
-
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 instancebeanInstance- the instance of the bean
-
addInterfacesFromTypeClosure
-
addInterface
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
Method to create a new proxy that wraps the bean instance.- Parameters:
beanInstance- the bean instance- Returns:
- a new proxy object
-
instantiateProxy
-
getProxyClass
Produces or returns the existing proxy class. The operation is thread-safe.- Returns:
- always the class of the proxy
-
getBaseProxyName
Returns the package and base name for the proxy class.- Returns:
- base name without suffixes
-
getProxyNameSuffix
Returns a suffix to append to the name of the proxy class. The name already consists of <class-name>_$$_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
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 proxyinitialValueBytecode-
-
addFields
protected void addFields(org.jboss.classfilewriter.ClassFile proxyClassType, List<DeferredBytecode> initialValueBytecode) -
getMethodHandlerType
-
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
-
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 methodmethod- 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 informationaddReturnInstruction- set to true you want to return the result of the method invocationbytecodeMethodResolver- 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
-
getAdditionalInterfaces
-
getBean
public jakarta.enterprise.inject.spi.Bean<?> getBean() -
getContextId
-
getProxiedBeanType
-
getMethodHandlerField
protected void getMethodHandlerField(org.jboss.classfilewriter.ClassFile file, org.jboss.classfilewriter.code.CodeAttribute b) -
getProxySuperclass
-
isUsingProxyInstantiator
protected boolean isUsingProxyInstantiator()- Returns:
trueifProxyInstantiatoris 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 viaProxyServicesto the integrator or to our own implementation.
-