refactor and add comments

This commit is contained in:
金戟 2020-07-22 23:57:23 +08:00
parent 9c757cebc1
commit 9c5be87f42
3 changed files with 15 additions and 16 deletions

View File

@ -1,16 +1,17 @@
package com.alibaba.testable;
import com.alibaba.testable.transformer.TestableFileTransformer;
import com.alibaba.testable.transformer.TestableClassTransformer;
import java.lang.instrument.Instrumentation;
/**
* Agent entry, dynamically modify the byte code of classes under testing
* @author flin
*/
public class PreMain {
public static void premain(String agentArgs, Instrumentation inst) {
inst.addTransformer(new TestableFileTransformer());
inst.addTransformer(new TestableClassTransformer());
}
}

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.transformer;
package com.alibaba.testable.handler;
import com.alibaba.testable.model.TravelStatus;
import com.alibaba.testable.util.ClassUtil;
@ -17,25 +17,22 @@ import static com.alibaba.testable.constant.Const.SYS_CLASSES;
/**
* @author flin
*/
public class TestableClassTransformer implements Opcodes {
public class TestableClassHandler implements Opcodes {
private static final String CONSTRUCTOR = "<init>";
private static final String TESTABLE_NE = "n/e";
private final ClassNode cn = new ClassNode();
public TestableClassTransformer(String className) throws IOException {
public byte[] getBytes(String className) throws IOException {
ClassReader cr = new ClassReader(className);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
}
public byte[] getBytes() {
transform();
transform(cn);
ClassWriter cw = new ClassWriter( 0);
cn.accept(cw);
return cw.toByteArray();
}
private void transform() {
private void transform(ClassNode cn) {
List<String> methodNames = new ArrayList<String>();
for (MethodNode m : cn.methods) {
if (!CONSTRUCTOR.equals(m.name)) {
@ -43,11 +40,11 @@ public class TestableClassTransformer implements Opcodes {
}
}
for (MethodNode m : cn.methods) {
transformMethod(m, methodNames);
transformMethod(cn, m, methodNames);
}
}
private void transformMethod(MethodNode mn, List<String> methodNames) {
private void transformMethod(ClassNode cn, MethodNode mn, List<String> methodNames) {
AbstractInsnNode[] instructions = mn.instructions.toArray();
TravelStatus status = TravelStatus.INIT;
String target = "";

View File

@ -1,5 +1,6 @@
package com.alibaba.testable.transformer;
import com.alibaba.testable.handler.TestableClassHandler;
import com.alibaba.testable.util.ClassUtil;
import java.io.IOException;
@ -13,7 +14,7 @@ import java.util.Set;
/**
* @author flin
*/
public class TestableFileTransformer implements ClassFileTransformer {
public class TestableClassTransformer implements ClassFileTransformer {
private static final String ENABLE_TESTABLE = "com.alibaba.testable.annotation.EnableTestable";
private static final String ENABLE_TESTABLE_INJECT = "com.alibaba.testable.annotation.EnableTestableInject";
@ -22,7 +23,7 @@ public class TestableFileTransformer implements ClassFileTransformer {
private static final Set<String> loadedClassNames = new HashSet<String>();
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) {
ProtectionDomain protectionDomain, byte[] classFileBuffer) {
if (isSystemClass(loader, className) || loadedClassNames.contains(className)) {
// Ignore system class and duplicate class
return null;
@ -37,7 +38,7 @@ public class TestableFileTransformer implements ClassFileTransformer {
try {
loadedClassNames.add(className);
return new TestableClassTransformer(className).getBytes();
return new TestableClassHandler().getBytes(className);
} catch (IOException e) {
return null;
}