@Test public void metaAnnotationOverridesUsingAnnotationMetadataReadingVisitor() throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(ComposedConfigurationWithAttributeOverridesClass.class.getName()); AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); assertMetaAnnotationOverrides(metadata); }
@Override public ClassMetadata getClassMetadataFor(Class<?> clazz) { try { MetadataReader reader = new SimpleMetadataReaderFactory().getMetadataReader(clazz.getName()); return reader.getAnnotationMetadata(); } catch (IOException ex) { throw new IllegalStateException(ex); } }
/** * Create the meta-data reader. * @param resource the source resource. * @return the meta-data reader * @throws IOException on error */ protected MetadataReader createMetadataReader(Resource resource) throws IOException { return super.getMetadataReader(resource); }
@Override public MetadataReader getMetadataReader(Resource resource) throws IOException { if (this.metadataReaderCache instanceof ConcurrentMap) { // No synchronization necessary... MetadataReader metadataReader = this.metadataReaderCache.get(resource); if (metadataReader == null) { metadataReader = super.getMetadataReader(resource); this.metadataReaderCache.put(resource, metadataReader); } return metadataReader; } else if (this.metadataReaderCache != null) { synchronized (this.metadataReaderCache) { MetadataReader metadataReader = this.metadataReaderCache.get(resource); if (metadataReader == null) { metadataReader = super.getMetadataReader(resource); this.metadataReaderCache.put(resource, metadataReader); } return metadataReader; } } else { return super.getMetadataReader(resource); } }
/** * https://jira.spring.io/browse/SPR-11649 */ @Test public void composedAnnotationWithMetaAnnotationsWithIdenticalAttributeNamesUsingAnnotationMetadataReadingVisitor() throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(NamedComposedAnnotationClass.class.getName()); AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); assertMultipleAnnotationsWithIdenticalAttributeNames(metadata); }
@Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { SimpleMetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(applicationContext); DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory; String resolvedPath = resolvePackageToScan(); logger.debug("Scanning '{}' for JSON-RPC service interfaces.", resolvedPath); try { for (Resource resource : applicationContext.getResources(resolvedPath)) { if (resource.isReadable()) { MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); ClassMetadata classMetadata = metadataReader.getClassMetadata(); AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); String jsonRpcPathAnnotation = JsonRpcService.class.getName(); if (annotationMetadata.isAnnotated(jsonRpcPathAnnotation)) { String className = classMetadata.getClassName(); String path = (String) annotationMetadata.getAnnotationAttributes(jsonRpcPathAnnotation).get("value"); logger.debug("Found JSON-RPC service to proxy [{}] on path '{}'.", className, path); registerJsonProxyBean(defaultListableBeanFactory, className, path); } } } } catch (IOException e) { throw new IllegalStateException(format("Cannot scan package '%s' for classes.", resolvedPath), e); } }
@Override public MetadataReader getMetadataReader(String className) throws IOException { try { String resourcePath = ResourceLoader.CLASSPATH_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(className) + ClassUtils.CLASS_FILE_SUFFIX; Resource resource = this.resourceLoader.getResource(resourcePath); return getMetadataReader(resource); } catch (FileNotFoundException ex) { // Maybe an inner class name using the dot name syntax? Need to use the dollar syntax here... // ClassUtils.forName has an equivalent check for resolution into Class references later on. int lastDotIndex = className.lastIndexOf('.'); if (lastDotIndex != -1) { String innerClassName = className.substring(0, lastDotIndex) + '$' + className.substring(lastDotIndex + 1); String innerClassResourcePath = ResourceLoader.CLASSPATH_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(innerClassName) + ClassUtils.CLASS_FILE_SUFFIX; Resource innerClassResource = this.resourceLoader.getResource(innerClassResourcePath); if (innerClassResource.exists()) { return getMetadataReader(innerClassResource); } } throw ex; } }
private void assertNoMatch(String type, String typePattern) throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(type); AspectJTypeFilter filter = new AspectJTypeFilter(typePattern, getClass().getClassLoader()); assertFalse(filter.match(metadataReader, metadataReaderFactory)); ClassloadingAssertions.assertClassNotLoaded(type); }
private boolean isConfigClass(BeanDefinition beanDef) { BeanDefinition beanDefinition = beanDef; String className = beanDefinition.getBeanClassName(); MetadataReader reader; try { reader = new SimpleMetadataReaderFactory().getMetadataReader(className); } catch (IOException e) { throw new BeanCreationException("problem reading class " + className, e); } return reader.getAnnotationMetadata().hasAnnotation(Configuration.class.getName()); }
@Override public MetadataReader getMetadataReader(Resource resource) throws IOException { if (this.metadataReaderCache instanceof ConcurrentMap) { // No synchronization necessary... MetadataReader metadataReader = this.metadataReaderCache.get(resource); if (metadataReader == null) { metadataReader = super.getMetadataReader(resource); this.metadataReaderCache.put(resource, metadataReader); } return metadataReader; } else if (this.metadataReaderCache != null) { synchronized (this.metadataReaderCache) { MetadataReader metadataReader = this.metadataReaderCache.get(resource); if (metadataReader == null) { metadataReader = super.getMetadataReader(resource); this.metadataReaderCache.put(resource, metadataReader); } return metadataReader; } } else { return super.getMetadataReader(resource); } }
@Test public void asmAnnotationMetadataForAnnotation() throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(Component.class.getName()); AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); doTestMetadataForAnnotationClass(metadata); }
public static void main(String[] args) throws IOException { ClassPathResource resource = new ClassPathResource( ClassUtils.convertClassNameToResourcePath( WebMvcAutoConfiguration.class.getName()) + ".class"); SimpleMetadataReaderFactory factory = new SimpleMetadataReaderFactory(); while (true) { long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { factory.getMetadataReader(resource).getAnnotationMetadata(); } long end = System.currentTimeMillis(); System.out.println("Duration: " + (end - start)); } }
@Override public MetadataReader getMetadataReader(String className) throws IOException { try { String resourcePath = ResourceLoader.CLASSPATH_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(className) + ClassUtils.CLASS_FILE_SUFFIX; Resource resource = this.resourceLoader.getResource(resourcePath); return getMetadataReader(resource); } catch (FileNotFoundException ex) { // Maybe an inner class name using the dot name syntax? Need to use the dollar syntax here... // ClassUtils.forName has an equivalent check for resolution into Class references later on. int lastDotIndex = className.lastIndexOf('.'); if (lastDotIndex != -1) { String innerClassName = className.substring(0, lastDotIndex) + '$' + className.substring(lastDotIndex + 1); String innerClassResourcePath = ResourceLoader.CLASSPATH_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(innerClassName) + ClassUtils.CLASS_FILE_SUFFIX; Resource innerClassResource = this.resourceLoader.getResource(innerClassResourcePath); if (innerClassResource.exists()) { return getMetadataReader(innerClassResource); } } throw ex; } }
@Test public void asmAnnotationMetadataForInterface() throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(AnnotationMetadata.class.getName()); AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); doTestMetadataForInterfaceClass(metadata); }
public class Scanner { private static final Log log = LogFactory.getLog(Scanner.class); public static void main(String[] args) throws IOException { SimpleMetadataReaderFactory metadataFactory = new SimpleMetadataReaderFactory(); ResourcePatternResolver scaner = new PathMatchingResourcePatternResolver(); Resource[] resources = scaner.getResources("classpath*:/base.package/**/*.class"); for (Resource r : resources) { log.info("Scanning [" + r.getDescription() + "]"); MetadataReader metadataReader = metadataFactory.getMetadataReader(r); if (metadataReader.getAnnotationMetadata().isAnnotated("org.example.Annotation")) log.info("found annotation in [" + r.getDescription() + "]"); } }
@Override public MetadataReader getMetadataReader(Resource resource) throws IOException { if (getCacheLimit() <= 0) { return super.getMetadataReader(resource); } synchronized (this.classReaderCache) { MetadataReader metadataReader = this.classReaderCache.get(resource); if (metadataReader == null) { metadataReader = super.getMetadataReader(resource); this.classReaderCache.put(resource, metadataReader); } return metadataReader; } }
/** * https://jira.spring.io/browse/SPR-11649 */ @Test public void multipleAnnotationsWithIdenticalAttributeNamesUsingAnnotationMetadataReadingVisitor() throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(NamedAnnotationsClass.class.getName()); AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); assertMultipleAnnotationsWithIdenticalAttributeNames(metadata); }
SimpleMetadataReaderFactory simpleMetadataReaderFactory = new SimpleMetadataReaderFactory(); getLogger().debug( "springresource " + resources.length + " for pattern " + patternFinder ); for ( Resource resource : resources ) MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader( resource );
public MetadataReader getMetadataReader(String className) throws IOException { String resourcePath = ResourceLoader.CLASSPATH_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(className) + ClassUtils.CLASS_FILE_SUFFIX; return getMetadataReader(this.resourceLoader.getResource(resourcePath)); }
private void assertMatch(String type, String typePattern) throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(type); AspectJTypeFilter filter = new AspectJTypeFilter(typePattern, getClass().getClassLoader()); assertTrue(filter.match(metadataReader, metadataReaderFactory)); ClassloadingAssertions.assertClassNotLoaded(type); }