Skip to content

Commit 37f0a8c

Browse files
committed
Instrumentation入门
1 parent bffaa51 commit 37f0a8c

7 files changed

Lines changed: 168 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393

9494
## AOP
9595
* [AspectJ-编译时织入和加载类时织入](src/cn/aofeng/demo/aspectj)
96+
* [Instrumentation入门](src/cn/aofeng/demo/java/lang/instrument)
9697

9798
## 脚本语言
9899
* [在Java中执行JavaScript脚本](src/cn/aofeng/demo/script/ScriptRunPerformence.java)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cn.aofeng.demo.java.lang.instrument;
2+
3+
import java.lang.instrument.Instrumentation;
4+
5+
import org.apache.commons.lang.StringUtils;
6+
7+
import cn.aofeng.demo.util.LogUtil;
8+
9+
/**
10+
* Instrument入口类。
11+
*
12+
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
13+
*/
14+
public class FirstInstrumentation {
15+
16+
public static void premain(String options, Instrumentation ins) {
17+
if (StringUtils.isBlank(options)) {
18+
LogUtil.log("instrument without options");
19+
} else {
20+
LogUtil.log("instrument with options:%s", options);
21+
}
22+
23+
ins.addTransformer(new FirstTransformer());
24+
}
25+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
*
3+
*/
4+
package cn.aofeng.demo.java.lang.instrument;
5+
6+
import java.lang.instrument.ClassFileTransformer;
7+
import java.lang.instrument.IllegalClassFormatException;
8+
import java.security.ProtectionDomain;
9+
10+
import cn.aofeng.demo.util.LogUtil;
11+
12+
/**
13+
* 只输出问候语,不进行字节码修改的Class转换器。
14+
*
15+
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
16+
*/
17+
public class FirstTransformer implements ClassFileTransformer {
18+
19+
@Override
20+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
21+
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
22+
LogUtil.log(">>> %s", className);
23+
return null;
24+
}
25+
26+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package cn.aofeng.demo.java.lang.instrument;
2+
3+
/**
4+
* Instrumentation启动类。 *
5+
*
6+
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
7+
*/
8+
public class Hello {
9+
10+
public static void main(String[] args) {
11+
// nothing
12+
}
13+
14+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 一、Instrumentation入门
2+
3+
* [FirstTransformer.java](FirstTransformer.java) 处理字节码,由类FirstInstrumentation执行
4+
* [FirstInstrumentation.java](FirstInstrumentation.java) instrumentation入口类,由javaagent载入执行
5+
* [build.xml](build.xml) Ant脚本,负责编译、打包和运行
6+
7+
在当前目录下执行命令:
8+
```bash
9+
ant
10+
```
11+
12+
输出信息如下:
13+
> [java] instrument with options:"Hello, Instrumentation"
14+
[java] >>> java/lang/invoke/MethodHandleImpl
15+
[java] >>> java/lang/invoke/MethodHandleImpl$1
16+
[java] >>> java/lang/invoke/MethodHandleImpl$2
17+
[java] >>> java/util/function/Function
18+
[java] >>> java/lang/invoke/MethodHandleImpl$3
19+
[java] >>> java/lang/invoke/MethodHandleImpl$4
20+
[java] >>> java/lang/ClassValue
21+
[java] >>> java/lang/ClassValue$Entry
22+
[java] >>> java/lang/ClassValue$Identity
23+
[java] >>> java/lang/ClassValue$Version
24+
[java] >>> java/lang/invoke/MemberName$Factory
25+
[java] >>> java/lang/invoke/MethodHandleStatics
26+
[java] >>> java/lang/invoke/MethodHandleStatics$1
27+
[java] >>> sun/misc/PostVMInitHook
28+
[java] >>> sun/usagetracker/UsageTrackerClient
29+
[java] >>> java/util/concurrent/atomic/AtomicBoolean
30+
[java] >>> sun/usagetracker/UsageTrackerClient$1
31+
[java] >>> sun/usagetracker/UsageTrackerClient$4
32+
[java] >>> sun/usagetracker/UsageTrackerClient$3
33+
[java] >>> java/io/FileOutputStream$1
34+
[java] >>> sun/launcher/LauncherHelper
35+
[java] >>> cn/aofeng/demo/java/lang/instrument/Hello
36+
[java] >>> sun/launcher/LauncherHelper$FXHelper
37+
[java] >>> java/lang/Class$MethodArray
38+
[java] >>> java/lang/Void
39+
[java] >>> java/lang/Shutdown
40+
[java] >>> java/lang/Shutdown$Lock
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project name="Instrumentation" default="run" basedir="../../../../../../../">
3+
4+
<property name="project.src.dir" value="${basedir}/src" />
5+
<property name="project.lib.dir" value="${basedir}/lib" />
6+
<property name="project.conf.dir" value="${basedir}/conf" />
7+
<property name="project.target.dir" value="${basedir}/classes" />
8+
<property name="project.dist.dir" value="${basedir}/dist" />
9+
10+
<path id="project.classpath">
11+
<fileset dir="${project.lib.dir}">
12+
<include name="*.jar" />
13+
</fileset>
14+
</path>
15+
16+
<target name="prepare">
17+
<delete dir="${project.target.dir}" />
18+
<mkdir dir="${project.target.dir}"/>
19+
<copy todir="${project.target.dir}">
20+
<fileset dir="${project.conf.dir}">
21+
<include name="**/*.properties" />
22+
<include name="**/*.xml" />
23+
</fileset>
24+
</copy>
25+
26+
<delete dir="${project.dist.dir}" />
27+
<mkdir dir="${project.dist.dir}" />
28+
</target>
29+
30+
<target name="compileWithJavac" depends="prepare">
31+
<echo message="compile with javac" />
32+
<javac destdir="${project.target.dir}" srcdir="${project.src.dir}" source="1.8" target="1.8"
33+
encoding="UTF-8" debug="true" includeantruntime="false">
34+
<classpath refid="project.classpath" />
35+
</javac>
36+
</target>
37+
38+
<target name="package" depends="compileWithJavac">
39+
<jar destfile="${project.dist.dir}/hello.jar">
40+
<fileset dir="${project.target.dir}">
41+
<include name="cn/aofeng/demo/java/lang/instrument/*.class" />
42+
</fileset>
43+
<manifest>
44+
<attribute name="Premain-Class" value="cn.aofeng.demo.java.lang.instrument.FirstInstrumentation" />
45+
</manifest>
46+
</jar>
47+
</target>
48+
49+
<target name="run" depends="package">
50+
<java classname="cn.aofeng.demo.java.lang.instrument.Hello" fork="true">
51+
<classpath refid="project.classpath" />
52+
<classpath location="${project.target.dir}" />
53+
<jvmarg value="-javaagent:${project.dist.dir}/hello.jar=&quot;Hello, Instrumentation&quot;" />
54+
</java>
55+
</target>
56+
57+
</project>

src/cn/aofeng/demo/util/LogUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
*/
88
public class LogUtil {
99

10+
public static void log(String msg) {
11+
System.out.println(msg);
12+
}
13+
1014
public static void log(String msg, Object... param) {
11-
System.out.println( String.format(msg, param) );
15+
log( String.format(msg, param) );
1216
}
1317

1418
}

0 commit comments

Comments
 (0)