|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.springframework.beans.CachedIntrospectionResults
public class CachedIntrospectionResults
Internal class that caches JavaBeans PropertyDescriptor
information for a Java class. Not intended for direct use by application code.
Necessary for own caching of descriptors within the application's ClassLoader, rather than rely on the JDK's system-wide BeanInfo cache (in order to avoid leaks on ClassLoader shutdown).
Information is cached statically, so we don't need to create new
objects of this class for every JavaBean we manipulate. Hence, this class
implements the factory design pattern, using a private constructor and
a static forClass(Class)
factory method to obtain instances.
acceptClassLoader(ClassLoader)
,
clearClassLoader(ClassLoader)
,
forClass(Class)
Field Summary | |
---|---|
(package private) static java.util.Set<java.lang.ClassLoader> |
acceptedClassLoaders
Set of ClassLoaders that this CachedIntrospectionResults class will always accept classes from, even if the classes do not qualify as cache-safe. |
private java.beans.BeanInfo |
beanInfo
The BeanInfo object for the introspected bean class |
(package private) static java.util.Map<java.lang.Class,java.lang.Object> |
classCache
Map keyed by class containing CachedIntrospectionResults. |
private static Log |
logger
|
private java.util.Map<java.lang.String,java.beans.PropertyDescriptor> |
propertyDescriptorCache
PropertyDescriptor objects keyed by property name String |
Constructor Summary | |
---|---|
private |
CachedIntrospectionResults(java.lang.Class beanClass,
boolean cacheFullMetadata)
Create a new CachedIntrospectionResults instance for the given class. |
Method Summary | |
---|---|
static void |
acceptClassLoader(java.lang.ClassLoader classLoader)
Accept the given ClassLoader as cache-safe, even if its classes would not qualify as cache-safe in this CachedIntrospectionResults class. |
private java.beans.PropertyDescriptor |
buildGenericTypeAwarePropertyDescriptor(java.lang.Class beanClass,
java.beans.PropertyDescriptor pd)
|
static void |
clearClassLoader(java.lang.ClassLoader classLoader)
Clear the introspection cache for the given ClassLoader, removing the introspection results for all classes underneath that ClassLoader, and deregistering the ClassLoader (and any of its children) from the acceptance list. |
(package private) static CachedIntrospectionResults |
forClass(java.lang.Class beanClass)
Create CachedIntrospectionResults for the given bean class. |
(package private) java.lang.Class |
getBeanClass()
|
(package private) java.beans.BeanInfo |
getBeanInfo()
|
(package private) java.beans.PropertyDescriptor |
getPropertyDescriptor(java.lang.String name)
|
(package private) java.beans.PropertyDescriptor[] |
getPropertyDescriptors()
|
private static boolean |
isClassLoaderAccepted(java.lang.ClassLoader classLoader)
Check whether this CachedIntrospectionResults class is configured to accept the given ClassLoader. |
private static boolean |
isUnderneathClassLoader(java.lang.ClassLoader candidate,
java.lang.ClassLoader parent)
Check whether the given ClassLoader is underneath the given parent, that is, whether the parent is within the candidate's hierarchy. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
private static final Log logger
static final java.util.Set<java.lang.ClassLoader> acceptedClassLoaders
static final java.util.Map<java.lang.Class,java.lang.Object> classCache
private final java.beans.BeanInfo beanInfo
private final java.util.Map<java.lang.String,java.beans.PropertyDescriptor> propertyDescriptorCache
Constructor Detail |
---|
private CachedIntrospectionResults(java.lang.Class beanClass, boolean cacheFullMetadata) throws BeansException
beanClass
- the bean class to analyze
BeansException
- in case of introspection failureMethod Detail |
---|
public static void acceptClassLoader(java.lang.ClassLoader classLoader)
This configuration method is only relevant in scenarios where the Spring classes reside in a 'common' ClassLoader (e.g. the system ClassLoader) whose lifecycle is not coupled to the application. In such a scenario, CachedIntrospectionResults would by default not cache any of the application's classes, since they would create a leak in the common ClassLoader.
Any acceptClassLoader
call at application startup should
be paired with a clearClassLoader(java.lang.ClassLoader)
call at application shutdown.
classLoader
- the ClassLoader to acceptpublic static void clearClassLoader(java.lang.ClassLoader classLoader)
classLoader
- the ClassLoader to clear the cache forstatic CachedIntrospectionResults forClass(java.lang.Class beanClass) throws BeansException
We don't want to use synchronization here. Object references are atomic, so we can live with doing the occasional unnecessary lookup at startup only.
beanClass
- the bean class to analyze
BeansException
- in case of introspection failureprivate static boolean isClassLoaderAccepted(java.lang.ClassLoader classLoader)
classLoader
- the ClassLoader to check
acceptClassLoader(java.lang.ClassLoader)
private static boolean isUnderneathClassLoader(java.lang.ClassLoader candidate, java.lang.ClassLoader parent)
candidate
- the candidate ClassLoader to checkparent
- the parent ClassLoader to check forjava.beans.BeanInfo getBeanInfo()
java.lang.Class getBeanClass()
java.beans.PropertyDescriptor getPropertyDescriptor(java.lang.String name)
java.beans.PropertyDescriptor[] getPropertyDescriptors()
private java.beans.PropertyDescriptor buildGenericTypeAwarePropertyDescriptor(java.lang.Class beanClass, java.beans.PropertyDescriptor pd)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |