MessageAsmMethodBoost优化
This commit is contained in:
@@ -91,6 +91,7 @@ public abstract class AsmMethodBoost<T> {
|
||||
*
|
||||
* @param classLoader ClassLoader
|
||||
* @param cw 动态字节码Writer
|
||||
* @param serviceImplClass 原始实现类
|
||||
* @param newDynName 动态新类名
|
||||
* @param fieldPrefix 动态字段的前缀
|
||||
* @param filterAnns 需要过滤的注解
|
||||
@@ -101,6 +102,7 @@ public abstract class AsmMethodBoost<T> {
|
||||
public abstract String doMethod(
|
||||
ClassLoader classLoader,
|
||||
ClassWriter cw,
|
||||
Class serviceImplClass,
|
||||
String newDynName,
|
||||
String fieldPrefix,
|
||||
List<Class<? extends Annotation>> filterAnns,
|
||||
@@ -180,7 +182,10 @@ public abstract class AsmMethodBoost<T> {
|
||||
for (Annotation ann : anns) {
|
||||
if (ann.annotationType() != selfAnnType
|
||||
&& (filterAnns == null || !filterAnns.contains(ann.annotationType()))) {
|
||||
Asms.visitAnnotation(mv.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann);
|
||||
Asms.visitAnnotation(
|
||||
mv.visitAnnotation(Type.getDescriptor(ann.annotationType()), true),
|
||||
ann.annotationType(),
|
||||
ann);
|
||||
}
|
||||
}
|
||||
// 给参数加上原有的Annotation
|
||||
@@ -188,7 +193,9 @@ public abstract class AsmMethodBoost<T> {
|
||||
for (int k = 0; k < annss.length; k++) {
|
||||
for (Annotation ann : annss[k]) {
|
||||
Asms.visitAnnotation(
|
||||
mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), ann);
|
||||
mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true),
|
||||
ann.annotationType(),
|
||||
ann);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -301,6 +308,7 @@ public abstract class AsmMethodBoost<T> {
|
||||
public String doMethod(
|
||||
ClassLoader classLoader,
|
||||
ClassWriter cw,
|
||||
Class serviceImplClass,
|
||||
String newDynName,
|
||||
String fieldPrefix,
|
||||
List<Class<? extends Annotation>> filterAnns,
|
||||
@@ -309,7 +317,15 @@ public abstract class AsmMethodBoost<T> {
|
||||
String newName = newMethodName;
|
||||
for (AsmMethodBoost item : items) {
|
||||
if (item != null) {
|
||||
newName = item.doMethod(classLoader, cw, newDynName, fieldPrefix, filterAnns, method, newName);
|
||||
newName = item.doMethod(
|
||||
classLoader,
|
||||
cw,
|
||||
serviceImplClass,
|
||||
newDynName,
|
||||
fieldPrefix,
|
||||
filterAnns,
|
||||
method,
|
||||
newName);
|
||||
}
|
||||
}
|
||||
return newName;
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
*/
|
||||
package org.redkale.asm;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import static org.redkale.asm.Opcodes.BIPUSH;
|
||||
import static org.redkale.asm.Opcodes.CHECKCAST;
|
||||
import static org.redkale.asm.Opcodes.GETSTATIC;
|
||||
@@ -10,9 +14,6 @@ import static org.redkale.asm.Opcodes.ICONST_0;
|
||||
import static org.redkale.asm.Opcodes.INVOKESTATIC;
|
||||
import static org.redkale.asm.Opcodes.INVOKEVIRTUAL;
|
||||
import static org.redkale.asm.Opcodes.SIPUSH;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Method;
|
||||
import org.redkale.util.RedkaleException;
|
||||
|
||||
/**
|
||||
@@ -36,9 +37,18 @@ public final class Asms {
|
||||
false);
|
||||
}
|
||||
|
||||
public static void visitAnnotation(final AnnotationVisitor av, final Annotation ann) {
|
||||
// annType与annValue不一定是同一类型
|
||||
public static <T extends Annotation> void visitAnnotation(
|
||||
final AnnotationVisitor av, final Class<T> annType, final Annotation annValue) {
|
||||
try {
|
||||
for (Method anm : ann.annotationType().getMethods()) {
|
||||
Set<String> methods = null;
|
||||
if (annType != annValue.annotationType()) {
|
||||
methods = new HashSet<>();
|
||||
for (Method anm : annType.getMethods()) {
|
||||
methods.add(anm.getName());
|
||||
}
|
||||
}
|
||||
for (Method anm : annValue.annotationType().getMethods()) {
|
||||
final String mname = anm.getName();
|
||||
if ("equals".equals(mname)
|
||||
|| "hashCode".equals(mname)
|
||||
@@ -46,7 +56,10 @@ public final class Asms {
|
||||
|| "annotationType".equals(mname)) {
|
||||
continue;
|
||||
}
|
||||
final Object r = anm.invoke(ann);
|
||||
if (methods != null && !methods.contains(mname)) {
|
||||
continue;
|
||||
}
|
||||
final Object r = anm.invoke(annValue);
|
||||
if (r instanceof String[]) {
|
||||
AnnotationVisitor av1 = av.visitArray(mname);
|
||||
for (String item : (String[]) r) {
|
||||
@@ -62,14 +75,15 @@ public final class Asms {
|
||||
} else if (r instanceof Enum[]) {
|
||||
AnnotationVisitor av1 = av.visitArray(mname);
|
||||
for (Enum item : (Enum[]) r) {
|
||||
av1.visitEnum(null, Type.getDescriptor(item.getClass()), ((Enum) item).name());
|
||||
av1.visitEnum(null, Type.getDescriptor(item.getClass()), item.name());
|
||||
}
|
||||
av1.visitEnd();
|
||||
} else if (r instanceof Annotation[]) {
|
||||
AnnotationVisitor av1 = av.visitArray(mname);
|
||||
for (Annotation item : (Annotation[]) r) {
|
||||
visitAnnotation(
|
||||
av1.visitAnnotation(null, Type.getDescriptor(((Annotation) item).annotationType())),
|
||||
av1.visitAnnotation(null, Type.getDescriptor(((Annotation) r).annotationType())),
|
||||
item.annotationType(),
|
||||
item);
|
||||
}
|
||||
av1.visitEnd();
|
||||
@@ -80,6 +94,7 @@ public final class Asms {
|
||||
} else if (r instanceof Annotation) {
|
||||
visitAnnotation(
|
||||
av.visitAnnotation(null, Type.getDescriptor(((Annotation) r).annotationType())),
|
||||
((Annotation) r).annotationType(),
|
||||
(Annotation) r);
|
||||
} else {
|
||||
av.visit(mname, r);
|
||||
|
||||
@@ -340,6 +340,16 @@ public final class ClassFilter<T> {
|
||||
if (className.startsWith("java.") || className.startsWith("javax.")) {
|
||||
return false;
|
||||
}
|
||||
return acceptPattern(className);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断class是否符合正则表达式
|
||||
*
|
||||
* @param className Class
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean acceptPattern(String className) {
|
||||
if (excludePatterns != null) {
|
||||
for (Pattern reg : excludePatterns) {
|
||||
if (reg.matcher(className).matches()) {
|
||||
|
||||
@@ -63,6 +63,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost {
|
||||
public String doMethod(
|
||||
final ClassLoader classLoader,
|
||||
final ClassWriter cw,
|
||||
final Class serviceImplClass,
|
||||
final String newDynName,
|
||||
final String fieldPrefix,
|
||||
final List filterAnns,
|
||||
@@ -105,7 +106,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost {
|
||||
// mv.setDebug(true);
|
||||
AnnotationVisitor av = mv.visitAnnotation(cacheDynDesc, true);
|
||||
av.visit("dynField", dynFieldName);
|
||||
Asms.visitAnnotation(av, cached);
|
||||
Asms.visitAnnotation(av, DynForCached.class, cached);
|
||||
visitRawAnnotation(method, newMethodName, mv, Cached.class, filterAnns);
|
||||
|
||||
Label l0 = new Label();
|
||||
|
||||
@@ -39,6 +39,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost {
|
||||
public String doMethod(
|
||||
ClassLoader classLoader,
|
||||
ClassWriter cw,
|
||||
Class serviceImplClass,
|
||||
String newDynName,
|
||||
String fieldPrefix,
|
||||
List filterAnns,
|
||||
@@ -75,7 +76,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost {
|
||||
mv.visitLabel(l0);
|
||||
AnnotationVisitor av = mv.visitAnnotation(lockDynDesc, true);
|
||||
av.visit("dynField", dynFieldName);
|
||||
Asms.visitAnnotation(av, locked);
|
||||
Asms.visitAnnotation(av, DynForLocked.class, locked);
|
||||
visitRawAnnotation(method, newMethodName, mv, Locked.class, filterAnns);
|
||||
mv.visitVarInsn(ALOAD, 0);
|
||||
List<Integer> insns = visitVarInsnParamTypes(mv, method, 0);
|
||||
|
||||
@@ -550,10 +550,10 @@ public abstract class MessageAgent implements MessageManager {
|
||||
}
|
||||
|
||||
public Future onMessage(MessageConext context, String traceid, byte[] message) {
|
||||
Convert c = this.convert;
|
||||
MessageConsumer m = this.consumer;
|
||||
return messageAgent.submit(() -> {
|
||||
Traces.computeIfAbsent(traceid);
|
||||
Convert c = this.convert;
|
||||
MessageConsumer m = this.consumer;
|
||||
try {
|
||||
m.onMessage(context, (T) c.convertFrom(messageType, message));
|
||||
} catch (Throwable t) {
|
||||
@@ -563,12 +563,17 @@ public abstract class MessageAgent implements MessageManager {
|
||||
Level.SEVERE,
|
||||
m.getClass().getSimpleName()
|
||||
+ " onMessage error, topic: " + context.getTopic()
|
||||
+ ", messages: " + new String(message, StandardCharsets.UTF_8));
|
||||
+ ", messages: " + new String(message, StandardCharsets.UTF_8),
|
||||
t);
|
||||
}
|
||||
Traces.removeTraceid();
|
||||
});
|
||||
}
|
||||
|
||||
public MessageConsumer getConsumer() {
|
||||
return consumer;
|
||||
}
|
||||
|
||||
public void destroy(AnyValue config) {
|
||||
consumer.destroy(config);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.asm.AnnotationVisitor;
|
||||
import org.redkale.asm.AsmMethodBean;
|
||||
import org.redkale.asm.AsmMethodBoost;
|
||||
@@ -83,6 +84,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
|
||||
public String doMethod(
|
||||
ClassLoader classLoader,
|
||||
ClassWriter cw,
|
||||
Class serviceImplClass,
|
||||
String newDynName,
|
||||
String fieldPrefix,
|
||||
List filterAnns,
|
||||
@@ -183,7 +185,12 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
|
||||
new String[] {messageConsumerName});
|
||||
{
|
||||
AnnotationVisitor av = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(ResourceConsumer.class), true);
|
||||
Asms.visitAnnotation(av, messaged);
|
||||
Asms.visitAnnotation(av, ResourceConsumer.class, messaged);
|
||||
av.visitEnd();
|
||||
}
|
||||
{ // 必须设置成@AutoLoad(false), 否则预编译打包后会被自动加载
|
||||
AnnotationVisitor av = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(AutoLoad.class), true);
|
||||
av.visit("value", false);
|
||||
av.visitEnd();
|
||||
}
|
||||
cw.visitInnerClass(innerFullName, newDynName, innerClassName, ACC_PUBLIC + ACC_STATIC);
|
||||
|
||||
@@ -18,6 +18,7 @@ import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.logging.Level;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.asm.AsmMethodBoost;
|
||||
import org.redkale.boot.Application;
|
||||
import org.redkale.boot.ClassFilter;
|
||||
@@ -266,6 +267,10 @@ public class MessageModuleEngine extends ModuleEngine {
|
||||
List<ClassFilter.FilterEntry<? extends MessageConsumer>> allEntrys = new ArrayList(allFilter.getFilterEntrys());
|
||||
for (ClassFilter.FilterEntry<? extends MessageConsumer> en : allEntrys) {
|
||||
Class<? extends MessageConsumer> clazz = en.getType();
|
||||
AutoLoad auto = clazz.getAnnotation(AutoLoad.class);
|
||||
if (auto != null && !auto.value()) {
|
||||
continue;
|
||||
}
|
||||
ResourceConsumer res = clazz.getAnnotation(ResourceConsumer.class);
|
||||
if (res != null && res.required() && findMessageAgent(res.mq()) == null) {
|
||||
throw new RedkaleException("Not found " + MessageAgent.class.getSimpleName() + "(name = " + res.mq()
|
||||
@@ -461,6 +466,11 @@ public class MessageModuleEngine extends ModuleEngine {
|
||||
|| !Objects.equals(agent.getName(), environment.getPropertyValue(res.mq()))) {
|
||||
continue;
|
||||
}
|
||||
AutoLoad auto = clazz.getAnnotation(AutoLoad.class);
|
||||
if ((auto != null && !auto.value())
|
||||
&& (filter.getIncludePatterns() == null || !filter.acceptPattern(clazz.getName()))) {
|
||||
continue;
|
||||
}
|
||||
RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName());
|
||||
final MessageConsumer consumer =
|
||||
clazz.getDeclaredConstructor().newInstance();
|
||||
|
||||
@@ -563,7 +563,8 @@ public abstract class Sncp {
|
||||
if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) {
|
||||
continue;
|
||||
}
|
||||
Asms.visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann);
|
||||
Asms.visitAnnotation(
|
||||
cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann.annotationType(), ann);
|
||||
}
|
||||
}
|
||||
{
|
||||
@@ -658,7 +659,7 @@ public abstract class Sncp {
|
||||
methodKeys.add(mk);
|
||||
List<Class<? extends Annotation>> filterAnns = methodBoost.filterMethodAnnotations(method);
|
||||
String newMethodName =
|
||||
methodBoost.doMethod(classLoader, cw, newDynName, FIELDPREFIX, filterAnns, method, null);
|
||||
methodBoost.doMethod(classLoader, cw, clazz, newDynName, FIELDPREFIX, filterAnns, method, null);
|
||||
if (newMethodName != null) {
|
||||
String desc = Type.getMethodDescriptor(method);
|
||||
AsmMethodBean methodBean = AsmMethodBean.get(methodBeans, method);
|
||||
@@ -1030,7 +1031,8 @@ public abstract class Sncp {
|
||||
if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) {
|
||||
continue;
|
||||
}
|
||||
Asms.visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann);
|
||||
Asms.visitAnnotation(
|
||||
cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann.annotationType(), ann);
|
||||
}
|
||||
}
|
||||
{
|
||||
@@ -1107,8 +1109,8 @@ public abstract class Sncp {
|
||||
String newMethodName = null;
|
||||
if (methodBoost != null) {
|
||||
List<Class<? extends Annotation>> filterAnns = methodBoost.filterMethodAnnotations(method);
|
||||
newMethodName =
|
||||
methodBoost.doMethod(classLoader, cw, newDynName, FIELDPREFIX, filterAnns, method, null);
|
||||
newMethodName = methodBoost.doMethod(
|
||||
classLoader, cw, serviceTypeOrImplClass, newDynName, FIELDPREFIX, filterAnns, method, null);
|
||||
}
|
||||
if (newMethodName != null) {
|
||||
acc = ACC_PRIVATE;
|
||||
@@ -1125,7 +1127,9 @@ public abstract class Sncp {
|
||||
for (int k = 0; k < anns.length; k++) {
|
||||
for (Annotation ann : anns[k]) {
|
||||
Asms.visitAnnotation(
|
||||
mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), ann);
|
||||
mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true),
|
||||
ann.annotationType(),
|
||||
ann);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user