AOP和IOC是J2EE的兩大基石,傳統的AOP是在代碼層面的,在bytecode層面也有aop技術,就是基於JVMTI(JVM TOOL INTERFACE)的instrument技術。這裏主要記錄下instrument入門使用。html
public class SimpleJavaAgent { public static void premain(String args, Instrumentation instrumentation){ System.out.println("Premain"); System.out.println("Number of classes loaded: "+instrumentation.getAllLoadedClasses().length); // instrumentation.addTransformer(new DemoTransformer()); } }
<build> <plugins> <!--<plugin>--> <!--<groupId>org.apache.maven.plugins</groupId>--> <!--<artifactId>maven-jar-plugin</artifactId>--> <!--<version>2.6</version>--> <!--<configuration>--> <!--<outputDirectory>${basedir}</outputDirectory>--> <!--<archive>--> <!--<!–<index>true</index>–>--> <!--<manifest>--> <!--<addClasspath>true</addClasspath>--> <!--</manifest>--> <!--<manifestEntries>--> <!--<Premain-Class>com.geekyarticles.instrumentation.SimpleJavaAgent</Premain-Class>--> <!--</manifestEntries>--> <!--</archive>--> <!--</configuration>--> <!--</plugin>--> <!--mvn assembly:single --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <outputDirectory>${basedir}</outputDirectory> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Premain-Class>com.geekyarticles.instrumentation.SimpleJavaAgent</Premain-Class> </manifestEntries> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build>
執行mvn assembly:singlejava
public class SimpleJavaAgentDemo { public static void main(String[] args) { System.out.println("Hello! its the main method"); } }
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <!--<argument>-Xmx128m</argument>--> <argument>-javaagent:"${project.parent.basedir}${file.separator}simple-agent${file.separator}simple-agent-1.0-SNAPSHOT-jar-with-dependencies.jar"</argument> <argument>-classpath</argument> <classpath/> <argument>com.geekyarticles.instrumentation.SimpleJavaAgentDemo</argument> </arguments> </configuration> </plugin> </plugins> </build>
執行mvn compile,而後mvn exec:execgit
工程githubgithub