1 package dst.ass2.di.agent;
3 import dst.ass2.di.annotation.Component;
6 import java.io.ByteArrayInputStream;
7 import java.io.IOException;
8 import java.lang.instrument.ClassFileTransformer;
9 import java.lang.instrument.IllegalClassFormatException;
10 import java.lang.instrument.Instrumentation;
11 import java.security.ProtectionDomain;
13 public class InjectorAgent implements ClassFileTransformer {
14 public static void premain(String args, Instrumentation instrumentation) {
15 instrumentation.addTransformer(new InjectorAgent());
19 public byte[] transform(ClassLoader loader, String className,
20 Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
21 byte[] classfileBuffer) throws IllegalClassFormatException {
23 ClassPool classPool = new ClassPool();
24 classPool.appendClassPath(new LoaderClassPath(loader));
26 CtClass ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
29 // only @Components may continue.
30 if (!ctClass.hasAnnotation(Component.class)) {
31 return classfileBuffer;
34 // insert our code into constructors
35 for (CtConstructor ctor : ctClass.getConstructors()) {
37 ctor.insertAfter("dst.ass2.di.InjectionControllerFactory.getTransparentInstance().initialize(this);");
38 } catch (CannotCompileException e) {
40 return classfileBuffer;
44 // output new bytecode.
45 return ctClass.toBytecode();
46 } catch (IOException | CannotCompileException e) {
48 return classfileBuffer;