1、一个主入口
public static void premain(String ages, Instrumentation instrumentation){ System.out.println("启动加载..."); instrumentation.addTransformer(new ClassFileTransformer() { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if(className == null || (!className.contains("Controller") && !className.contains("ServiceImpl"))){ return null; } System.out.println("className:"+className); try { CtClass newClass = ClassPool.getDefault().get(className.replaceAll("/",".")); CtMethod[] methods = newClass.getDeclaredMethods(); for (CtMethod method : methods) { if(isNative(method)){ continue; } method.insertBefore("\nSystem.out.println(\"这是新增加的输入\");"); } return newClass.toBytecode(); } catch (NotFoundException e) { e.printStackTrace(); } catch (CannotCompileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return new byte[0]; } }); } /** * 判断方法是否本地方法 * @param method * @return */ public static boolean isNative(CtMethod method) { return Modifier.isNative(method.getModifiers()) || Modifier.isAbstract(method.getModifiers()); }
2、配置pom.xml
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> <manifestEntries> <Premain-Class>com.agent.JxwAgnet</Premain-Class> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.1</version> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3、配置assembly.xml
<id>bin</id> <formats> <format>zip</format> </formats> <dependencySets> <dependencySet> <!-- 是否把本项目添加到依赖lib中 --> <useProjectArtifact>false</useProjectArtifact> <outputDirectory>/lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>target</directory> <outputDirectory>/</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets>
4、运行java -javaagent:XXX.jar