diff options
author | Decebal Suiu <decebal.suiu@gmail.com> | 2019-11-15 17:30:12 +0200 |
---|---|---|
committer | Decebal Suiu <decebal.suiu@gmail.com> | 2019-11-15 17:30:12 +0200 |
commit | 909af08634350910ec23dd7040a526dd3595cdbf (patch) | |
tree | 10c6224a2f15ce6073b235aa2cbccec1d9f01b2d | |
parent | 0312fc26005e6a1ec605c2230d21f088d2607be4 (diff) | |
download | pf4j-#347.tar.gz pf4j-#347.zip |
Search recursively through all annotations to find @Extension#347
-rw-r--r-- | pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java b/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java index b260c39..3cfbc7e 100644 --- a/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java +++ b/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java @@ -20,6 +20,7 @@ import org.pf4j.util.ClassUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -340,15 +341,30 @@ public abstract class AbstractExtensionFinder implements ExtensionFinder, Plugin } private ExtensionWrapper createExtensionWrapper(Class<?> extensionClass) { - int ordinal = 0; - if (extensionClass.isAnnotationPresent(Extension.class)) { - ordinal = extensionClass.getAnnotation(Extension.class).ordinal(); - } + Extension extensionAnnotation = findExtensionAnnotation(extensionClass); + int ordinal = extensionAnnotation != null ? extensionAnnotation.ordinal() : 0; ExtensionDescriptor descriptor = new ExtensionDescriptor(ordinal, extensionClass); return new ExtensionWrapper<>(descriptor, pluginManager.getExtensionFactory()); } + private Extension findExtensionAnnotation(Class<?> clazz) { + if (clazz.isAnnotationPresent(Extension.class)) { + return clazz.getAnnotation(Extension.class); + } + + // search recursively through all annotations + for (Annotation annotation : clazz.getAnnotations()) { + Class<? extends Annotation> annotationClass = annotation.annotationType(); + Extension extensionAnnotation = findExtensionAnnotation(annotationClass); + if (extensionAnnotation != null) { + return extensionAnnotation; + } + } + + return null; + } + private void checkDifferentClassLoaders(Class<?> type, Class<?> extensionClass) { ClassLoader typeClassLoader = type.getClassLoader(); // class loader of extension point ClassLoader extensionClassLoader = extensionClass.getClassLoader(); |