public class ProxyFactory<T> extends Object
BeanInstance
. All proxies implement the Proxy
interface.Modifier and Type | Field and Description |
---|---|
static String |
CONSTRUCTED_FLAG_NAME |
protected static BytecodeMethodResolver |
DEFAULT_METHOD_RESOLVER |
static String |
DEFAULT_PROXY_PACKAGE |
protected static org.slf4j.cal10n.LocLogger |
log |
static String |
PROXY_SUFFIX |
Constructor and Description |
---|
ProxyFactory(Class<?> proxiedBeanType,
Set<? extends Type> typeClosure,
javax.enterprise.inject.spi.Bean<?> bean)
created a new proxy factory from a bean instance.
|
ProxyFactory(Class<?> proxiedBeanType,
Set<? extends Type> typeClosure,
String proxyName,
javax.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
|
Modifier and Type | Method and Description |
---|---|
protected void |
addAdditionalInterfaces(Set<Class<?>> interfaces)
Sub classes may override to specify additional interfaces the proxy should
implement
|
protected javassist.bytecode.Bytecode |
addConstructedGuardToMethodBody(javassist.bytecode.ClassFile proxyClassType,
javassist.bytecode.Bytecode existingMethod,
MethodInformation method)
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. |
protected void |
addConstructors(javassist.bytecode.ClassFile proxyClassType,
javassist.bytecode.Bytecode initialValueBytecode)
Adds a constructor for the proxy for each constructor declared by the base
bean type.
|
protected void |
addFields(javassist.bytecode.ClassFile proxyClassType,
javassist.bytecode.Bytecode initialValueBytecode) |
void |
addInterface(Class<?> newInterface)
Adds an additional interface that the proxy should implement.
|
protected void |
addMethods(javassist.bytecode.ClassFile proxyClassType) |
protected void |
addMethodsFromClass(javassist.bytecode.ClassFile proxyClassType) |
protected void |
addSerializationSupport(javassist.bytecode.ClassFile proxyClassType)
Adds special serialization code.
|
protected void |
addSpecialMethods(javassist.bytecode.ClassFile proxyClassType)
Adds methods requiring special implementations rather than just
delegation.
|
T |
create(BeanInstance beanInstance)
Method to create a new proxy that wraps the bean instance.
|
protected javassist.bytecode.Bytecode |
createForwardingMethodBody(javassist.bytecode.ClassFile proxyClassType,
MethodInformation method) |
protected javassist.bytecode.Bytecode |
createInterceptorBody(javassist.bytecode.ClassFile file,
MethodInformation method)
Creates the given method on the proxy class where the implementation
forwards the call directly to the method handler.
|
protected javassist.bytecode.Bytecode |
createSpecialMethodBody(javassist.bytecode.ClassFile proxyClassType,
MethodInformation method) |
protected javassist.bytecode.MethodInfo |
generateEqualsMethod(javassist.bytecode.ClassFile proxyClassType)
Generate the body of the proxies equals method.
|
protected javassist.bytecode.MethodInfo |
generateHashCodeMethod(javassist.bytecode.ClassFile proxyClassType)
Generate the body of the proxies hashCode method.
|
Set<Class<?>> |
getAdditionalInterfaces() |
protected String |
getBaseProxyName()
Returns the package and base name for the proxy class.
|
javax.enterprise.inject.spi.Bean<?> |
getBean() |
Class<?> |
getBeanType() |
Class<T> |
getProxyClass()
Produces or returns the existing proxy class.
|
protected String |
getProxyNameSuffix()
Returns a suffix to append to the name of the proxy class.
|
protected static void |
invokeMethodHandler(javassist.bytecode.ClassFile file,
javassist.bytecode.Bytecode b,
MethodInformation method,
boolean addReturnInstruction,
BytecodeMethodResolver bytecodeMethodResolver)
calls methodHandler.invoke for a given method
|
static boolean |
isProxy(Object proxySuspect)
Convenience method to determine if an object is a proxy generated by this
factory or any derived factory.
|
static ClassLoader |
resolveClassLoaderForBeanProxy(javax.enterprise.inject.spi.Bean<?> bean) |
static ClassLoader |
resolveClassLoaderForBeanProxy(javax.enterprise.inject.spi.Bean<?> bean,
Proxies.TypeInfo typeInfo)
Figures out the correct class loader to use for a proxy for a given bean
|
static <T> void |
setBeanInstance(T proxy,
BeanInstance beanInstance,
javax.enterprise.inject.spi.Bean<?> bean)
Convenience method to set the underlying bean instance for a proxy.
|
protected static final org.slf4j.cal10n.LocLogger log
public static final String PROXY_SUFFIX
public static final String DEFAULT_PROXY_PACKAGE
public static final String CONSTRUCTED_FLAG_NAME
protected static final BytecodeMethodResolver DEFAULT_METHOD_RESOLVER
public ProxyFactory(Class<?> proxiedBeanType, Set<? extends Type> typeClosure, javax.enterprise.inject.spi.Bean<?> bean)
public ProxyFactory(Class<?> proxiedBeanType, Set<? extends Type> typeClosure, String proxyName, javax.enterprise.inject.spi.Bean<?> bean)
proxiedBeanType
- the super-class for this proxy classtypeClosure
- the bean types of the beanproxyName
- the name of the proxy classpublic void addInterface(Class<?> newInterface)
newInterface
- an interfacepublic T create(BeanInstance beanInstance)
public Class<T> getProxyClass()
protected String getBaseProxyName()
public static boolean isProxy(Object proxySuspect)
proxySuspect
- the object suspected of being a proxypublic static <T> void setBeanInstance(T proxy, BeanInstance beanInstance, javax.enterprise.inject.spi.Bean<?> bean)
proxy
- the proxy instancebeanInstance
- the instance of the beanprotected String getProxyNameSuffix()
protected void addAdditionalInterfaces(Set<Class<?>> interfaces)
protected void addConstructors(javassist.bytecode.ClassFile proxyClassType, javassist.bytecode.Bytecode initialValueBytecode)
proxyClassType
- the Javassist class for the proxyinitialValueBytecode
- protected void addFields(javassist.bytecode.ClassFile proxyClassType, javassist.bytecode.Bytecode initialValueBytecode)
protected void addMethods(javassist.bytecode.ClassFile proxyClassType)
protected void addSerializationSupport(javassist.bytecode.ClassFile proxyClassType)
proxyClassType
- the Javassist class for the proxy classprotected void addMethodsFromClass(javassist.bytecode.ClassFile proxyClassType)
protected javassist.bytecode.MethodInfo generateHashCodeMethod(javassist.bytecode.ClassFile proxyClassType)
protected javassist.bytecode.MethodInfo generateEqualsMethod(javassist.bytecode.ClassFile proxyClassType)
proxyClassType
- The class fileprotected javassist.bytecode.Bytecode createSpecialMethodBody(javassist.bytecode.ClassFile proxyClassType, MethodInformation method) throws javassist.NotFoundException
javassist.NotFoundException
protected javassist.bytecode.Bytecode addConstructedGuardToMethodBody(javassist.bytecode.ClassFile proxyClassType, javassist.bytecode.Bytecode existingMethod, MethodInformation 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.protected javassist.bytecode.Bytecode createForwardingMethodBody(javassist.bytecode.ClassFile proxyClassType, MethodInformation method) throws javassist.NotFoundException
javassist.NotFoundException
protected javassist.bytecode.Bytecode createInterceptorBody(javassist.bytecode.ClassFile file, MethodInformation method) throws javassist.NotFoundException
file
- the class filemethod
- any JLR methodjavassist.NotFoundException
protected static void invokeMethodHandler(javassist.bytecode.ClassFile file, javassist.bytecode.Bytecode b, MethodInformation method, boolean addReturnInstruction, BytecodeMethodResolver bytecodeMethodResolver)
file
- the current class fileb
- the bytecode to add the methodHandler.invoke call tomethod
- The method informationaddReturnInstruction
- set to true you want to return the result of
the method invocationbytecodeMethodResolver
- The resolver that returns the method to invokeprotected void addSpecialMethods(javassist.bytecode.ClassFile proxyClassType)
proxyClassType
- the Javassist class description for the proxy typepublic Class<?> getBeanType()
public javax.enterprise.inject.spi.Bean<?> getBean()
public static ClassLoader resolveClassLoaderForBeanProxy(javax.enterprise.inject.spi.Bean<?> bean, Proxies.TypeInfo typeInfo)
public static ClassLoader resolveClassLoaderForBeanProxy(javax.enterprise.inject.spi.Bean<?> bean)
Copyright © 2012 Seam Framework. All Rights Reserved.