diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a8dd26 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/out/ +/agent/agent.jar diff --git a/.idea/modules.xml b/.idea/modules.xml index 171e67d..d587a9a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..dffa447 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Agent + +### Compile the agent as JAR + +```shell +cd agent/src +find . -name '*.java' -print -exec javac -d ../../out/production/agent \{\} \; +cd .. +jar cfm agent.jar manifest.txt -C ../out/production/agent . +``` + +### Run application with agent + +```shell +java -javaagent:agent/agent.jar=hello -cp out/production/application ch.usi.inf.sp.dbi.Application +``` \ No newline at end of file diff --git a/agent/manifest.txt b/agent/manifest.txt new file mode 100644 index 0000000..66b9a72 --- /dev/null +++ b/agent/manifest.txt @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Premain-Class: ch.usi.inf.sp.dbi.agent.Agent diff --git a/agent/src/ch/usi/inf/sp/dbi/agent/Agent.java b/agent/src/ch/usi/inf/sp/dbi/agent/Agent.java new file mode 100644 index 0000000..534bebc --- /dev/null +++ b/agent/src/ch/usi/inf/sp/dbi/agent/Agent.java @@ -0,0 +1,10 @@ +package ch.usi.inf.sp.dbi.agent; + +import java.lang.instrument.Instrumentation; + +public class Agent { + public static void premain(String agentArgs, Instrumentation inst) { + System.out.println("Agent starting (arguments: '" + agentArgs + "')"); + inst.addTransformer(new ClassTransformer()); + } +} diff --git a/agent/src/ch/usi/inf/sp/dbi/agent/ClassTransformer.java b/agent/src/ch/usi/inf/sp/dbi/agent/ClassTransformer.java new file mode 100644 index 0000000..154be82 --- /dev/null +++ b/agent/src/ch/usi/inf/sp/dbi/agent/ClassTransformer.java @@ -0,0 +1,17 @@ +package ch.usi.inf.sp.dbi.agent; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.security.ProtectionDomain; + +public class ClassTransformer implements ClassFileTransformer { + @Override + public byte[] transform(ClassLoader loader, + String className, + Class classBeingRedefined, + ProtectionDomain protectionDomain, + byte[] classfileBuffer) throws IllegalClassFormatException { + System.out.println("About to transform class <" + loader + ", " + className + ">"); + return classfileBuffer; // no changes + } +} diff --git a/application/src/ch/usi/inf/sp/dbi/Application.java b/application/src/ch/usi/inf/sp/dbi/Application.java new file mode 100644 index 0000000..f667851 --- /dev/null +++ b/application/src/ch/usi/inf/sp/dbi/Application.java @@ -0,0 +1,11 @@ +package ch.usi.inf.sp.dbi; + +public class Application { + public static void main(String... args) { + sayHi(); + } + + public static void sayHi() { + System.out.println("Hello!"); + } +} diff --git a/lab-6-maggicl.iml b/lab-6-maggicl.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/lab-6-maggicl.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file