From 37f0a8cd6c91ce6f6d82486b218a8e391539dcb0 Mon Sep 17 00:00:00 2001 From: NieYong Date: Mon, 16 Oct 2017 11:56:26 +0800 Subject: [PATCH 1/6] =?UTF-8?q?Instrumentation=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../lang/instrument/FirstInstrumentation.java | 25 ++++++++ .../lang/instrument/FirstTransformer.java | 26 +++++++++ .../demo/java/lang/instrument/Hello.java | 14 +++++ .../demo/java/lang/instrument/README.md | 40 +++++++++++++ .../demo/java/lang/instrument/build.xml | 57 +++++++++++++++++++ src/cn/aofeng/demo/util/LogUtil.java | 6 +- 7 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/cn/aofeng/demo/java/lang/instrument/FirstInstrumentation.java create mode 100644 src/cn/aofeng/demo/java/lang/instrument/FirstTransformer.java create mode 100644 src/cn/aofeng/demo/java/lang/instrument/Hello.java create mode 100644 src/cn/aofeng/demo/java/lang/instrument/README.md create mode 100644 src/cn/aofeng/demo/java/lang/instrument/build.xml diff --git a/README.md b/README.md index ca2a662..8c63af3 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,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) 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..5b67f3b --- /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/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) ); } } From d5f4a11dc878886e2bed2d3cb6faafcb94e8379e Mon Sep 17 00:00:00 2001 From: NieYong Date: Mon, 16 Oct 2017 11:59:13 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/java/lang/instrument/README.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/cn/aofeng/demo/java/lang/instrument/README.md b/src/cn/aofeng/demo/java/lang/instrument/README.md index 5b67f3b..53fe4e5 100644 --- a/src/cn/aofeng/demo/java/lang/instrument/README.md +++ b/src/cn/aofeng/demo/java/lang/instrument/README.md @@ -11,30 +11,30 @@ 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 +> [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 From 7796b7a451a91a5ca9cf44c722802b7cafe3fdc1 Mon Sep 17 00:00:00 2001 From: NieYong Date: Mon, 16 Oct 2017 18:43:18 +0800 Subject: [PATCH 3/6] =?UTF-8?q?mybatis=E7=A4=BA=E4=BE=8B=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E6=8F=8F=E8=BF=B0=E5=90=84=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E7=94=A8=E9=80=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cn/aofeng/demo/mybatis/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/cn/aofeng/demo/mybatis/README.md diff --git a/src/cn/aofeng/demo/mybatis/README.md b/src/cn/aofeng/demo/mybatis/README.md new file mode 100644 index 0000000..f5d24fc --- /dev/null +++ b/src/cn/aofeng/demo/mybatis/README.md @@ -0,0 +1,5 @@ +* [MyBatisClient.java](MyBatisClient.java) 入口类。读取配置文件,生成SqlSessionFactory,使用DAO操作表。 +* [mybatis-config.xml](../../../../../conf/mybatis-config.xml) mybatis配置文件 +* [MonitNotifyHistoryDao](dao/MonitNotifyHistoryDao) DAO类 +* [MonitNotifyHistory.java](entity/MonitNotifyHistory.java) 实体类 +* [MonitNotifyHistoryMapper.xml](mapper/MonitNotifyHistoryMapper.xml) SQL模板映射配置文件 From 9cb2075fcfcc00bdc1528aff1482b1e1fcb98b22 Mon Sep 17 00:00:00 2001 From: NieYong Date: Mon, 16 Oct 2017 18:47:31 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cn/aofeng/demo/mybatis/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cn/aofeng/demo/mybatis/README.md b/src/cn/aofeng/demo/mybatis/README.md index f5d24fc..e214deb 100644 --- a/src/cn/aofeng/demo/mybatis/README.md +++ b/src/cn/aofeng/demo/mybatis/README.md @@ -1,5 +1,5 @@ -* [MyBatisClient.java](MyBatisClient.java) 入口类。读取配置文件,生成SqlSessionFactory,使用DAO操作表。 +* [MyBatisClien.java](MyBatisClient.java) 入口类。读取配置文件,生成SqlSessionFactory,使用DAO操作表。 * [mybatis-config.xml](../../../../../conf/mybatis-config.xml) mybatis配置文件 -* [MonitNotifyHistoryDao](dao/MonitNotifyHistoryDao) DAO类 -* [MonitNotifyHistory.java](entity/MonitNotifyHistory.java) 实体类 +* [MonitNotifyHistoryDao](dao/MonitNotifyHistoryDao.java) DAO类 +* [MonitNotifyHisto.java](entity/MonitNotifyHistory.java) 实体类 * [MonitNotifyHistoryMapper.xml](mapper/MonitNotifyHistoryMapper.xml) SQL模板映射配置文件 From ef00c97c78bbeb169b1e5996097fdcabf0cd67a8 Mon Sep 17 00:00:00 2001 From: NieYong Date: Tue, 23 Jan 2018 15:03:18 +0800 Subject: [PATCH 5/6] =?UTF-8?q?slf4j=E4=BD=BF=E7=94=A8=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++ src/cn/aofeng/demo/slf4j/HelloSlf4j.java | 31 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/cn/aofeng/demo/slf4j/HelloSlf4j.java diff --git a/README.md b/README.md index 8c63af3..2e8d5d2 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ 在这里,通过文章和代码,把这些知识点和技术的主要内容记录并汇总,供自己快速回顾,也分享给他人。 +注:部分例子基于JDK8。 + ## 关键字 * [transient与序列化](src/cn/aofeng/demo/java/lang/serialization/TransientDemo.java) @@ -107,6 +109,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/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异常信息")); + } + +} From 89232b50238a94145024df48c9c8edf45b4c0405 Mon Sep 17 00:00:00 2001 From: NieYong Date: Fri, 2 Nov 2018 19:27:12 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=AE=88=E6=8A=A4=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../aofeng/demo/thread/DaemonThreadDemo.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/cn/aofeng/demo/thread/DaemonThreadDemo.java diff --git a/README.md b/README.md index 2e8d5d2..cbbe5f5 100644 --- a/README.md +++ b/README.md @@ -78,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) 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); + } + } + +}