diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/TestClassHandler.java b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/TestClassHandler.java index 907441c..fce19cd 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/TestClassHandler.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/TestClassHandler.java @@ -4,9 +4,11 @@ import com.alibaba.testable.agent.constant.ConstPool; import com.alibaba.testable.agent.tool.ImmutablePair; import com.alibaba.testable.agent.util.AnnotationUtil; import com.alibaba.testable.agent.util.ClassUtil; +import com.alibaba.testable.core.util.LogUtil; import org.objectweb.asm.tree.*; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import static com.alibaba.testable.agent.util.ClassUtil.toDotSeparateFullClassName; @@ -36,11 +38,19 @@ public class TestClassHandler extends BaseClassHandler { */ @Override protected void transform(ClassNode cn) { - for (MethodNode m : cn.methods) { - transformMethod(cn, m); + Iterator iterator = cn.fields.iterator(); + if (iterator.hasNext()) { + if (ConstPool.TESTABLE_INJECT_REF.equals(iterator.next().name)) { + // avoid duplicate injection + LogUtil.verbose("Duplicate injection found, ignore " + cn.name); + return; + } } cn.fields.add(new FieldNode(ACC_PUBLIC | ACC_STATIC, ConstPool.TESTABLE_INJECT_REF, ClassUtil.toByteCodeClassName(cn.name), null, null)); + for (MethodNode m : cn.methods) { + transformMethod(cn, m); + } } private void transformMethod(ClassNode cn, MethodNode mn) { diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java b/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java index 8a8aaa8..0d0cec1 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java @@ -1,14 +1,12 @@ package com.alibaba.testable.agent.util; import com.alibaba.testable.agent.constant.ConstPool; -import com.alibaba.testable.agent.tool.ComparableWeakRef; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.AnnotationNode; -import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static org.objectweb.asm.Opcodes.INVOKESTATIC; diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/LogUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/LogUtil.java index 97431cc..2e82b94 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/util/LogUtil.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/util/LogUtil.java @@ -30,7 +30,7 @@ public class LogUtil { } private static LogLevel defaultLogLevel = LogLevel.LEVEL_WARN; - private static LogLevel currentLogLevel; + private static LogLevel currentLogLevel = LogLevel.LEVEL_WARN; public static void verbose(String msg, Object... args) { if (currentLogLevel.level >= LogLevel.LEVEL_VERBOSE.level) {