This commit is contained in:
@@ -10,6 +10,7 @@ import java.net.*;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.AbstractMap.SimpleEntry;
|
import java.util.AbstractMap.SimpleEntry;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
import java.util.logging.*;
|
||||||
import org.redkale.asm.*;
|
import org.redkale.asm.*;
|
||||||
import org.redkale.asm.Type;
|
import org.redkale.asm.Type;
|
||||||
import static org.redkale.asm.Opcodes.*;
|
import static org.redkale.asm.Opcodes.*;
|
||||||
@@ -71,6 +72,18 @@ public interface Creator<T> {
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
static class CreatorInner {
|
static class CreatorInner {
|
||||||
|
|
||||||
|
static final Logger logger = Logger.getLogger(Creator.class.getSimpleName());
|
||||||
|
|
||||||
|
static final Map<Class, Creator> creatorCacheMap = new HashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
creatorCacheMap.put(ArrayList.class, (params) -> new ArrayList<>());
|
||||||
|
creatorCacheMap.put(HashMap.class, (params) -> new HashMap<>());
|
||||||
|
creatorCacheMap.put(HashSet.class, (params) -> new HashSet<>());
|
||||||
|
creatorCacheMap.put(ConcurrentHashMap.class, (params) -> new ConcurrentHashMap<>());
|
||||||
|
creatorCacheMap.put(CompletableFuture.class, (params) -> new CompletableFuture<>());
|
||||||
|
}
|
||||||
|
|
||||||
static class SimpleClassVisitor extends ClassVisitor {
|
static class SimpleClassVisitor extends ClassVisitor {
|
||||||
|
|
||||||
private final String constructorDesc;
|
private final String constructorDesc;
|
||||||
@@ -158,6 +171,7 @@ public interface Creator<T> {
|
|||||||
if (field == null) return null;
|
if (field == null) return null;
|
||||||
se[i] = new SimpleEntry<>(field.getName(), field.getType());
|
se[i] = new SimpleEntry<>(field.getName(), field.getType());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
if (logger.isLoggable(Level.FINE)) logger.log(Level.FINE, clazz + " getConstructorField error", e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,6 +220,8 @@ public interface Creator<T> {
|
|||||||
} else if (clazz.isAssignableFrom(ConcurrentHashMap.class)) {
|
} else if (clazz.isAssignableFrom(ConcurrentHashMap.class)) {
|
||||||
clazz = (Class<T>) ConcurrentHashMap.class;
|
clazz = (Class<T>) ConcurrentHashMap.class;
|
||||||
}
|
}
|
||||||
|
Creator creator = CreatorInner.creatorCacheMap.get(clazz);
|
||||||
|
if (creator != null) return creator;
|
||||||
if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) {
|
if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) {
|
||||||
throw new RuntimeException("[" + clazz + "] is a interface or abstract class, cannot create it's Creator.");
|
throw new RuntimeException("[" + clazz + "] is a interface or abstract class, cannot create it's Creator.");
|
||||||
}
|
}
|
||||||
@@ -246,7 +262,7 @@ public interface Creator<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (constructor0 == null) { // 2、查找public带ConstructorProperties注解的构造函数
|
if (constructor0 == null) { // 2、查找public带ConstructorParameters注解的构造函数
|
||||||
for (Constructor c : clazz.getConstructors()) {
|
for (Constructor c : clazz.getConstructors()) {
|
||||||
ConstructorParameters cp = (ConstructorParameters) c.getAnnotation(ConstructorParameters.class);
|
ConstructorParameters cp = (ConstructorParameters) c.getAnnotation(ConstructorParameters.class);
|
||||||
if (cp == null) continue;
|
if (cp == null) continue;
|
||||||
@@ -276,7 +292,7 @@ public interface Creator<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (constructor0 == null) { // 4、查找非private带ConstructorProperties的构造函数
|
if (constructor0 == null) { // 4、查找非private带ConstructorParameters的构造函数
|
||||||
for (Constructor c : clazz.getDeclaredConstructors()) {
|
for (Constructor c : clazz.getDeclaredConstructors()) {
|
||||||
if (Modifier.isPublic(c.getModifiers()) || Modifier.isPrivate(c.getModifiers())) continue;
|
if (Modifier.isPublic(c.getModifiers()) || Modifier.isPrivate(c.getModifiers())) continue;
|
||||||
ConstructorParameters cp = (ConstructorParameters) c.getAnnotation(ConstructorParameters.class);
|
ConstructorParameters cp = (ConstructorParameters) c.getAnnotation(ConstructorParameters.class);
|
||||||
@@ -289,7 +305,7 @@ public interface Creator<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (constructor0 == null) { // 5、查找非private且不带ConstructorProperties的构造函数
|
if (constructor0 == null) { // 5、查找非private且不带ConstructorParameters的构造函数
|
||||||
List<Constructor> cs = new ArrayList<>();
|
List<Constructor> cs = new ArrayList<>();
|
||||||
for (Constructor c : clazz.getDeclaredConstructors()) {
|
for (Constructor c : clazz.getDeclaredConstructors()) {
|
||||||
if (Modifier.isPublic(c.getModifiers()) || Modifier.isPrivate(c.getModifiers())) continue;
|
if (Modifier.isPublic(c.getModifiers()) || Modifier.isPrivate(c.getModifiers())) continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user