Skip to content

Commit dcee618

Browse files
wanghbxxxxbeiwei30
authored andcommitted
refactor loadClass method (apache#3410)
* refactor: expression is always true, remove it (names != null && names.length > 0) * Update dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java Co-Authored-By: wanghbxxxx <[email protected]> * Update ExtensionLoader.java * Update ExtensionLoader.java * Update ExtensionLoader.java * Update ExtensionLoader.java
1 parent 5146f6d commit dcee618

File tree

1 file changed

+77
-33
lines changed

1 file changed

+77
-33
lines changed

dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java

+77-33
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.dubbo.common.extension.support.ActivateComparator;
2222
import org.apache.dubbo.common.logger.Logger;
2323
import org.apache.dubbo.common.logger.LoggerFactory;
24+
import org.apache.dubbo.common.utils.ArrayUtils;
2425
import org.apache.dubbo.common.utils.ClassHelper;
2526
import org.apache.dubbo.common.utils.ConcurrentHashSet;
2627
import org.apache.dubbo.common.utils.ConfigUtils;
@@ -692,20 +693,9 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
692693
+ clazz.getName() + " is not subtype of interface.");
693694
}
694695
if (clazz.isAnnotationPresent(Adaptive.class)) {
695-
if (cachedAdaptiveClass == null) {
696-
cachedAdaptiveClass = clazz;
697-
} else if (!cachedAdaptiveClass.equals(clazz)) {
698-
throw new IllegalStateException("More than 1 adaptive class found: "
699-
+ cachedAdaptiveClass.getClass().getName()
700-
+ ", " + clazz.getClass().getName());
701-
}
696+
cacheAdaptiveClass(clazz);
702697
} else if (isWrapperClass(clazz)) {
703-
Set<Class<?>> wrappers = cachedWrapperClasses;
704-
if (wrappers == null) {
705-
cachedWrapperClasses = new ConcurrentHashSet<>();
706-
wrappers = cachedWrapperClasses;
707-
}
708-
wrappers.add(clazz);
698+
cacheWrapperClass(clazz);
709699
} else {
710700
clazz.getConstructor();
711701
if (StringUtils.isEmpty(name)) {
@@ -714,33 +704,87 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
714704
throw new IllegalStateException("No such extension name for the class " + clazz.getName() + " in the config " + resourceURL);
715705
}
716706
}
707+
717708
String[] names = NAME_SEPARATOR.split(name);
718-
if (names != null && names.length > 0) {
719-
Activate activate = clazz.getAnnotation(Activate.class);
720-
if (activate != null) {
721-
cachedActivates.put(names[0], activate);
722-
} else {
723-
// support com.alibaba.dubbo.common.extension.Activate
724-
com.alibaba.dubbo.common.extension.Activate oldActivate = clazz.getAnnotation(com.alibaba.dubbo.common.extension.Activate.class);
725-
if (oldActivate != null) {
726-
cachedActivates.put(names[0], oldActivate);
727-
}
728-
}
709+
if (ArrayUtils.isNotEmpty(names)) {
710+
cacheActivateClass(clazz, names[0]);
729711
for (String n : names) {
730-
if (!cachedNames.containsKey(clazz)) {
731-
cachedNames.put(clazz, n);
732-
}
733-
Class<?> c = extensionClasses.get(n);
734-
if (c == null) {
735-
extensionClasses.put(n, clazz);
736-
} else if (c != clazz) {
737-
throw new IllegalStateException("Duplicate extension " + type.getName() + " name " + n + " on " + c.getName() + " and " + clazz.getName());
738-
}
712+
cacheName(clazz, n);
713+
saveInExtensionClass(extensionClasses, clazz, name);
739714
}
740715
}
741716
}
742717
}
743718

719+
/**
720+
* cache name
721+
*/
722+
private void cacheName(Class<?> clazz, String name) {
723+
if (!cachedNames.containsKey(clazz)) {
724+
cachedNames.put(clazz, name);
725+
}
726+
}
727+
728+
/**
729+
* put clazz in extensionClasses
730+
*/
731+
private void saveInExtensionClass(Map<String, Class<?>> extensionClasses, Class<?> clazz, String name) {
732+
Class<?> c = extensionClasses.get(name);
733+
if (c == null) {
734+
extensionClasses.put(name, clazz);
735+
} else if (c != clazz) {
736+
throw new IllegalStateException("Duplicate extension " + type.getName() + " name " + name + " on " + c.getName() + " and " + clazz.getName());
737+
}
738+
}
739+
740+
/**
741+
* cache Activate class which is annotated with <code>Activate</code>
742+
* <p>
743+
* for compatibility, also cache class with old alibaba Activate annotation
744+
*/
745+
private void cacheActivateClass(Class<?> clazz, String name) {
746+
Activate activate = clazz.getAnnotation(Activate.class);
747+
if (activate != null) {
748+
cachedActivates.put(name, activate);
749+
} else {
750+
// support com.alibaba.dubbo.common.extension.Activate
751+
com.alibaba.dubbo.common.extension.Activate oldActivate = clazz.getAnnotation(com.alibaba.dubbo.common.extension.Activate.class);
752+
if (oldActivate != null) {
753+
cachedActivates.put(name, oldActivate);
754+
}
755+
}
756+
}
757+
758+
/**
759+
* cache Adaptive class which is annotated with <code>Adaptive</code>
760+
*/
761+
private void cacheAdaptiveClass(Class<?> clazz) {
762+
if (cachedAdaptiveClass == null) {
763+
cachedAdaptiveClass = clazz;
764+
} else if (!cachedAdaptiveClass.equals(clazz)) {
765+
throw new IllegalStateException("More than 1 adaptive class found: "
766+
+ cachedAdaptiveClass.getClass().getName()
767+
+ ", " + clazz.getClass().getName());
768+
}
769+
}
770+
771+
/**
772+
* cache wrapper class
773+
* <p>
774+
* like: ProtocolFilterWrapper, ProtocolListenerWrapper
775+
*/
776+
private void cacheWrapperClass(Class<?> clazz) {
777+
if (cachedWrapperClasses == null) {
778+
cachedWrapperClasses = new ConcurrentHashSet<>();
779+
}
780+
cachedWrapperClasses.add(clazz);
781+
}
782+
783+
/**
784+
* test if clazz is a wrapper class
785+
* <p>
786+
* which has Constructor with given class type as its only argument
787+
*/
744788
private boolean isWrapperClass(Class<?> clazz) {
745789
try {
746790
clazz.getConstructor(type);

0 commit comments

Comments
 (0)