diff --git a/README.md b/README.md
index ca2a662..cbbe5f5 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,8 @@
在这里,通过文章和代码,把这些知识点和技术的主要内容记录并汇总,供自己快速回顾,也分享给他人。
+注:部分例子基于JDK8。
+
## 关键字
* [transient与序列化](src/cn/aofeng/demo/java/lang/serialization/TransientDemo.java)
@@ -76,6 +78,7 @@
## 线程&并发
+* [守护线程](src/cn/aofeng/demo/thread/DaemonThreadDemo.java)
* [fork/join](src/cn/aofeng/demo/java/util/forkjoin/HelloForkJoin.java)
* [Future](src/cn/aofeng/demo/java/util/future/HelloFuture.java)
* [Future接口关系图](src/cn/aofeng/demo/java/util/future/Future.ucls)
@@ -93,6 +96,7 @@
## AOP
* [AspectJ-编译时织入和加载类时织入](src/cn/aofeng/demo/aspectj)
+* [Instrumentation入门](src/cn/aofeng/demo/java/lang/instrument)
## 脚本语言
* [在Java中执行JavaScript脚本](src/cn/aofeng/demo/script/ScriptRunPerformence.java)
@@ -106,6 +110,10 @@
* [HMAC-SHA1签名算法](src/cn/aofeng/demo/encrypt/HmacSha1.java)
## 开源组件
+
+### Slf4j
+* [slf4j使用示例](src/cn/aofeng/demo/slf4j/HelloSlf4j.java)
+
### Redis
* [Redis客户端Jedis使用示例](src/cn/aofeng/demo/redis/JedisDemo.java)
diff --git a/src/cn/aofeng/demo/java/lang/instrument/FirstInstrumentation.java b/src/cn/aofeng/demo/java/lang/instrument/FirstInstrumentation.java
new file mode 100644
index 0000000..d4319ca
--- /dev/null
+++ b/src/cn/aofeng/demo/java/lang/instrument/FirstInstrumentation.java
@@ -0,0 +1,25 @@
+package cn.aofeng.demo.java.lang.instrument;
+
+import java.lang.instrument.Instrumentation;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.aofeng.demo.util.LogUtil;
+
+/**
+ * Instrument入口类。
+ *
+ * @author 聂勇
+ */
+public class FirstInstrumentation {
+
+ public static void premain(String options, Instrumentation ins) {
+ if (StringUtils.isBlank(options)) {
+ LogUtil.log("instrument without options");
+ } else {
+ LogUtil.log("instrument with options:%s", options);
+ }
+
+ ins.addTransformer(new FirstTransformer());
+ }
+}
diff --git a/src/cn/aofeng/demo/java/lang/instrument/FirstTransformer.java b/src/cn/aofeng/demo/java/lang/instrument/FirstTransformer.java
new file mode 100644
index 0000000..48ce691
--- /dev/null
+++ b/src/cn/aofeng/demo/java/lang/instrument/FirstTransformer.java
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package cn.aofeng.demo.java.lang.instrument;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+
+import cn.aofeng.demo.util.LogUtil;
+
+/**
+ * 只输出问候语,不进行字节码修改的Class转换器。
+ *
+ * @author 聂勇
+ */
+public class FirstTransformer implements ClassFileTransformer {
+
+ @Override
+ public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined,
+ ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+ LogUtil.log(">>> %s", className);
+ return null;
+ }
+
+}
diff --git a/src/cn/aofeng/demo/java/lang/instrument/Hello.java b/src/cn/aofeng/demo/java/lang/instrument/Hello.java
new file mode 100644
index 0000000..01fd76f
--- /dev/null
+++ b/src/cn/aofeng/demo/java/lang/instrument/Hello.java
@@ -0,0 +1,14 @@
+package cn.aofeng.demo.java.lang.instrument;
+
+/**
+ * Instrumentation启动类。 *
+ *
+ * @author 聂勇
+ */
+public class Hello {
+
+ public static void main(String[] args) {
+ // nothing
+ }
+
+}
diff --git a/src/cn/aofeng/demo/java/lang/instrument/README.md b/src/cn/aofeng/demo/java/lang/instrument/README.md
new file mode 100644
index 0000000..53fe4e5
--- /dev/null
+++ b/src/cn/aofeng/demo/java/lang/instrument/README.md
@@ -0,0 +1,40 @@
+# 一、Instrumentation入门
+
+* [FirstTransformer.java](FirstTransformer.java) 处理字节码,由类FirstInstrumentation执行
+* [FirstInstrumentation.java](FirstInstrumentation.java) instrumentation入口类,由javaagent载入执行
+* [build.xml](build.xml) Ant脚本,负责编译、打包和运行
+
+在当前目录下执行命令:
+```bash
+ant
+```
+
+输出信息如下:
+> [java] instrument with options:"Hello, Instrumentation"
+> [java] >>> java/lang/invoke/MethodHandleImpl
+> [java] >>> java/lang/invoke/MethodHandleImpl$1
+> [java] >>> java/lang/invoke/MethodHandleImpl$2
+> [java] >>> java/util/function/Function
+> [java] >>> java/lang/invoke/MethodHandleImpl$3
+> [java] >>> java/lang/invoke/MethodHandleImpl$4
+> [java] >>> java/lang/ClassValue
+> [java] >>> java/lang/ClassValue$Entry
+> [java] >>> java/lang/ClassValue$Identity
+> [java] >>> java/lang/ClassValue$Version
+> [java] >>> java/lang/invoke/MemberName$Factory
+> [java] >>> java/lang/invoke/MethodHandleStatics
+> [java] >>> java/lang/invoke/MethodHandleStatics$1
+> [java] >>> sun/misc/PostVMInitHook
+> [java] >>> sun/usagetracker/UsageTrackerClient
+> [java] >>> java/util/concurrent/atomic/AtomicBoolean
+> [java] >>> sun/usagetracker/UsageTrackerClient$1
+> [java] >>> sun/usagetracker/UsageTrackerClient$4
+> [java] >>> sun/usagetracker/UsageTrackerClient$3
+> [java] >>> java/io/FileOutputStream$1
+> [java] >>> sun/launcher/LauncherHelper
+> [java] >>> cn/aofeng/demo/java/lang/instrument/Hello
+> [java] >>> sun/launcher/LauncherHelper$FXHelper
+> [java] >>> java/lang/Class$MethodArray
+> [java] >>> java/lang/Void
+> [java] >>> java/lang/Shutdown
+> [java] >>> java/lang/Shutdown$Lock
diff --git a/src/cn/aofeng/demo/java/lang/instrument/build.xml b/src/cn/aofeng/demo/java/lang/instrument/build.xml
new file mode 100644
index 0000000..2abfbb1
--- /dev/null
+++ b/src/cn/aofeng/demo/java/lang/instrument/build.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/cn/aofeng/demo/mybatis/README.md b/src/cn/aofeng/demo/mybatis/README.md
new file mode 100644
index 0000000..e214deb
--- /dev/null
+++ b/src/cn/aofeng/demo/mybatis/README.md
@@ -0,0 +1,5 @@
+* [MyBatisClien.java](MyBatisClient.java) 入口类。读取配置文件,生成SqlSessionFactory,使用DAO操作表。
+* [mybatis-config.xml](../../../../../conf/mybatis-config.xml) mybatis配置文件
+* [MonitNotifyHistoryDao](dao/MonitNotifyHistoryDao.java) DAO类
+* [MonitNotifyHisto.java](entity/MonitNotifyHistory.java) 实体类
+* [MonitNotifyHistoryMapper.xml](mapper/MonitNotifyHistoryMapper.xml) SQL模板映射配置文件
diff --git a/src/cn/aofeng/demo/slf4j/HelloSlf4j.java b/src/cn/aofeng/demo/slf4j/HelloSlf4j.java
new file mode 100644
index 0000000..dce7ffd
--- /dev/null
+++ b/src/cn/aofeng/demo/slf4j/HelloSlf4j.java
@@ -0,0 +1,31 @@
+package cn.aofeng.demo.slf4j;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * slf4j使用示例。
+ *
+ * @author 聂勇
+ */
+public class HelloSlf4j {
+
+ private static Logger _logger = LoggerFactory.getLogger(HelloSlf4j.class);
+
+ public static void main(String[] args) {
+ // 直接输出字符串
+ _logger.info("Hello, slf4j logger.");
+
+ // 输出格式字符串(携带多个填充参数)
+ _logger.info("{} + {} = {}", 1, 2, (1+2));
+
+ // 输出错误信息和异常堆栈
+ _logger.error("错误信息", new IOException("测试抛出IO异常信息"));
+
+ // 输出错误信息(携带多个填充参数)和异常堆栈
+ _logger.error("两个参数。agrs1:{};agrs2:{}的info级别日志", "args1", "args2", new IOException("测试抛出IO异常信息"));
+ }
+
+}
diff --git a/src/cn/aofeng/demo/thread/DaemonThreadDemo.java b/src/cn/aofeng/demo/thread/DaemonThreadDemo.java
new file mode 100644
index 0000000..541d133
--- /dev/null
+++ b/src/cn/aofeng/demo/thread/DaemonThreadDemo.java
@@ -0,0 +1,45 @@
+/**
+ * 公司:阿里游戏
+ * 创建时间:2018年11月2日下午5:56:43
+ */
+package cn.aofeng.demo.thread;
+
+import java.util.Date;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 守护线程DEMO。
+ *
+ * @author 聂勇
+ */
+public class DaemonThreadDemo extends Thread {
+
+ private static Logger logger = LoggerFactory.getLogger(DaemonThreadDemo.class);
+
+ @Override
+ public void run() {
+ while (true) {
+ System.out.println("守护线程运行, 时间:" + new Date());
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ logger.error("守护线程运行出错", e);
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ DaemonThreadDemo thread = new DaemonThreadDemo();
+ thread.setDaemon(true);
+ thread.start();
+
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ logger.error("主线程运行出错", e);
+ }
+ }
+
+}
diff --git a/src/cn/aofeng/demo/util/LogUtil.java b/src/cn/aofeng/demo/util/LogUtil.java
index 6046793..44558c9 100644
--- a/src/cn/aofeng/demo/util/LogUtil.java
+++ b/src/cn/aofeng/demo/util/LogUtil.java
@@ -7,8 +7,12 @@
*/
public class LogUtil {
+ public static void log(String msg) {
+ System.out.println(msg);
+ }
+
public static void log(String msg, Object... param) {
- System.out.println( String.format(msg, param) );
+ log( String.format(msg, param) );
}
}