{"@attributes":{"version":"2.0"},"channel":{"title":"Java\/JEE on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","link":"https:\/\/yanbin.blog\/categories\/java\/jee\/","description":"Recent content in Java\/JEE on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","generator":"Hugo -- gohugo.io","language":"en-us","managingEditor":"yabqiu@gmail.com (Yanbin Qiu)","webMaster":"yabqiu@gmail.com (Yanbin Qiu)","copyright":"Yanbin \u9694\u53f6\u9ec4\u83ba","lastBuildDate":"Tue, 24 Feb 2026 15:04:20 -0600","item":[{"title":"Docker \u5bb9\u5668\u4e2d Java \u8c03\u7528 C++ \u52a8\u6001\u5e93\u95ee\u9898\u8bca\u65ad","link":"https:\/\/yanbin.blog\/docker-java-cpp-dll-core-dump\/","pubDate":"Tue, 24 Feb 2026 15:04:20 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/docker-java-cpp-dll-core-dump\/","description":"\n<p>\u672c\u60f3\u7528\u4e00\u7bc7\u65e5\u5fd7\u8bb0\u5f55\u4e0b\u5728 Docker \u5bb9\u5668\u4e2d\u4f7f\u7528 Java \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\uff0c\u5f53 C++ Crash \u65f6\u5982\u4f55\u81ea\u52a8\u751f\u6210 core dump, \u4e0d\u60f3\u5206\u6210\u4e86\u81f3\u5c11\u4e09\u7bc7\u6765\u5b8c\u6210\u8fd9\u4e00\u7814\u7a76\u3002\n\u53ef\u4ee5\u56de\u987e\u4e00\u4e0b\u524d\u4e24\u7bc7\u65e5\u5fd7<\/p>\n<ol>\n<li><a href=\"https:\/\/yanbin.blog\/cpp-shared-library-trouble-shooting\/\">C++ \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\u95ee\u9898\u8bca\u65ad<\/a><\/li>\n<li><a href=\"https:\/\/yanbin.blog\/java-jna-cpp-trouble-shooting\/\">Java \u4f7f\u7528 JNA \u8c03\u7528 C++ \u52a8\u6001\u5e93\u95ee\u9898\u8bca\u65ad<\/a><\/li>\n<\/ol>\n<p>\u672c\u6587\u662f\u57fa\u4e8e\u7b2c\u4e8c\u7bc7\u8fdb\u4e00\u6b65\u63a8\u8fdb\uff0c\u7ee7\u7eed\u63a2\u7d22\u5982\u4f55\u5728 Docker \u5bb9\u5668\u4e2d Java \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\u7684 core dump \u5982\u4f55\u751f\u6210\u3002\u9996\u5148\u6d4b\u8bd5\u7684\u5e73\u53f0\u4f9d\u7136\u662f AWS EC2 \u5b9e\u4f8b\uff0c\nOS \u4e3a Amazon Linux 2023, Docker \u7248\u672c\u4e3a 25.0.14\u3002\u4e3a\u53d9\u4e8b\u65b9\u4fbf\uff0c\u672c\u6587\u6240\u7528\u4ee3\u7801\u4e0e\u4e0a\u7bc7\u4e00\u6837\uff0c\u4f46\u8fd8\u662f\u91cd\u590d\u4e00\u904d\uff0c\u7701\u5374\u4e86\u8fde\u63a5\u8df3\u8f6c\u3002<\/p>"},{"title":"Java \u901a\u8fc7 JNA \u8c03\u7528 C++ \u52a8\u6001\u5e93\u5b9a\u4f4d\u9519\u8bef","link":"https:\/\/yanbin.blog\/java-jna-cpp-trouble-shooting\/","pubDate":"Sun, 22 Feb 2026 22:29:37 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-jna-cpp-trouble-shooting\/","description":"\n<p>\u5728 Java \u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7 JNA \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\uff0cC++ \u4ee3\u7801\u8fd0\u884c\u5728\u4e0e Java \u540c\u4e00\u8fdb\u7a0b\u4e2d\uff0c\u5f53 C++ \u4ee3\u7801 Crash \u7684\u65f6\u5019\uff0c\u5c06\u4f1a\u5bfc\u81f4\u6574\u4e2a Java \u5e94\u7528\u7a0b\u5e8f\u5d29\u6e83\u3002\n\u5bf9\u4e8e\u4e00\u4e2a Web \u5e94\u7528\uff0c\u8fd9\u4e0d\u662f\u6211\u4eec\u671f\u671b\u7684\u7ed3\u679c\uff0c\u7531\u4e8e\u67d0\u4e00\u4e2a\u8bf7\u6c42\u8f93\u5165\u7684\u6570\u636e\u5bfc\u81f4 C++ \u4ee3\u7801\u5d29\u6e83\u4e86\u5f53\u524d Java \u8fdb\u7a0b\uff0c\u4ece\u800c\u9020\u6210\u8be5 Web \u670d\u52a1\u5df2\u63a5\u53d7\u5230\u7684\u6240\u6709\u8bf7\u6c42\u5168\u90e8\u5931\u8d25\uff0c\n\u8fd9\u662f\u975e\u5e38\u7cdf\u7cd5\u7684\u7528\u6237\u4f53\u9a8c\u3002\u5982\u679c\u662f Java \u4ee3\u7801\u672c\u8eab\u7684\u5f02\u5e38\u6211\u4eec\u53ef\u7528 try\/catch \u8fdb\u884c\u4fdd\u62a4\uff0c\u5f71\u54cd\u53ea\u9650\u5236\u5728\u5f53\u524d\u8bf7\u6c42\u3002\u5982\u679c\u662f C++ \u4ee3\u7801\u5d29\u6e83\u7684\u8bdd\uff0cJava\n\u5e94\u7528\u7a0b\u5e8f\u65e0\u6cd5\u6355\u83b7\u5230\u8fd9\u4e2a\u5f02\u5e38\uff0c\u4ee5\u81f4\u4e8e\u6574\u4e2a Java \u5e94\u7528\u7a0b\u5e8f\u5d29\u6e83\uff0c\u751a\u81f3\u53d1\u751f\u8fd9\u79cd\u60c5\u51b5\u65f6\u8fde hs_err.log \u6587\u4ef6\u90fd\u6765\u4e0d\u53ca\u751f\u6210\uff0c\u66f4\u522b\u8bf4\u751f\u6210 HeapDump, \u6216 CoreDump \u4e86\u3002<\/p>\n<p>\u5982\u679c\u662f\u7528\u539f\u59cb JNI \u7684\u65b9\u5f0f\u6765\u8c03\u7528\u52a8\u6001\u5e93\uff0c\u6211\u4eec\u8fd8\u80fd\u5728 JNI \u76f8\u5173\u7684 C++ \u4ee3\u7801\u4e2d\u6355\u83b7\u5230\u5f02\u5e38\uff0c\u5e76\u629b\u7ed9 Java \u53bb\u5904\u7406\u3002\u800c\u7528 JNA, \u6211\u4eec\u8d2a\u56fe\u4e86\u5b83\u7684\u65b9\u4fbf\uff0c\n\u6bd4\u5982\u4e00\u4e2a Java \u8fdb\u7a0b\u4e2d\u540c\u65f6\u52a0\u8f7d\u540c\u4e00\u63a5\u53e3\u7684\u4e0d\u540c\u52a8\u6001\u5e93\u7248\u672c(JNI \u8981\u540c\u6837\u7684\u5b9e\u73b0\u5fc5\u987b\u7528\u81ea\u5b9a\u4e49\u7684 ClassLoader)\uff0c\u4f46\u5728 C++ \u4ee3\u7801\u5d29\u6e83\u65f6\uff0c Java \u5c31\u663e\u5f97\u65e0\u80fd\u4e3a\u529b\u4e86\uff0c\n\u53ea\u80fd\u8ddf\u968f\u7740\u7acb\u5373\u6b7b\u4ea1, \u5e76\u4e14\u5728\u63a7\u5236\u53f0\u4e0b\u627e\u4e0d\u5230\u5173\u4e8e C++ \u56e0\u4f55\u5931\u8d25\u7684\u7ebf\u7d22\u3002\u6bd4\u5982 C++ \u4e2d\u5185\u5b58\u88ab\u591a\u6b21\u91ca\u653e\uff0c\u6216\u5730\u5740\u8d8a\u754c\u8bbf\u95ee\u7834\u574f\u4e86\u5185\u5b58\u6570\u636e\u7b49\u3002<\/p>"},{"title":"C++ \u8c03\u7528 C++ \u52a8\u6001\u5e93\u51fa\u9519\u65f6\u751f\u6210 core dump","link":"https:\/\/yanbin.blog\/cpp-shared-library-trouble-shooting\/","pubDate":"Sun, 22 Feb 2026 16:40:26 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/cpp-shared-library-trouble-shooting\/","description":"\n<p>\u672c\u6587\u521d\u8877\u662f\u4e3a\u4e86\u89e3\u51b3 Java \u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7 JNA \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\uff0cC++ \u4ee3\u7801\u8fd0\u884c\u5d29\u6e83\u5bfc\u81f4\u6574\u4e2a Java \u5e94\u7528\u7a0b\u5e8f\u5d29\u6e83\u800c\u8fdb\u884c\u7684\u7814\u7a76\u3002\u4ece\u4e00\u4e2a C++ \u8c03\u7528 C++\n\u5199\u7684\u52a8\u6001\u5e93\u8d77\u6b65\uff0c\u8bb0\u5f55\u5b83\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4ea7\u751f core dump \u6587\u4ef6\uff0c\u5982\u4f55\u5206\u6790 core dump \u6587\u4ef6\u7b49\u8fc7\u7a0b\u3002\u53ef\u60dc\u7bc7\u5e45\u65e0\u6cd5\u63a7\u5236\uff0c\u4e0d\u8db3\u4ee5\u518d\u52a0\u5165 Java-&gt;JNA-&gt;C++\n\u52a8\u6001\u5e93\u5185\u5bb9\u4e86\uff0c\u6240\u4ee5\u4e0d\u5f97\u4e0d\u5355\u5217\u6b64\u7bc7\uff0c\u5e76\u66f4\u540d\u4e3a 'C++ \u8c03\u7528 C++ \u52a8\u6001\u5e93\u65f6\u95ee\u9898\u8bca\u65ad'. \u5173\u4e8e Java JNA \u5230 C++ \u7684\u95ee\u9898\u8bca\u65ad\u53ea\u80fd\u53e6\u7acb\u4e00\u7bc7\u4e86\u3002<\/p>\n<p>\u4e0b\u9762\u6211\u4eec\u6765\u7528 JNA \u7684\u65b9\u5f0f\u6765\u8c03\u7528 C++ \u52a8\u6001\u5e93\uff0c\u6f14\u793a\u5f53 C++ \u4ee3\u7801\u5d29\u6e83\u65f6\u4f1a\u53d1\u751f\u4ec0\u4e48\uff0c\u5e76\u8bd5\u56fe\u627e\u5230\u597d\u7684\u8bca\u65ad\u529e\u6cd5\u3002\u4ee5\u4e0b\u6f14\u793a\u5728 Linux \u4e0b\u8fdb\u884c, \u5e76\u4e14 Linux\n\u53d1\u884c\u7248\u662f Amazon Linux 2023.<\/p>"},{"title":"Java 19, 20 \u65b0\u7279\u6027\u5b66\u4e60","link":"https:\/\/yanbin.blog\/java-19-20-new-features\/","pubDate":"Tue, 30 Sep 2025 16:52:20 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-19-20-new-features\/","description":"\n\u4e4b\u6240\u4ee5\u628a Java 19 \u4e0e 20 \u653e\u4e00\u5757\u662f\u56e0\u4e3a\u8fd9\u4e24\u4e2a\u7248\u672c\u90fd\u6ca1\u6709\u4e00\u4e2a\u7b97\u5f97\u4e0a\u6b63\u5f0f\u7684\u7279\u6027\u3002\u90fd\u662f\u4e9b\u9884\u89c8\u7684\uff0c\u5b75\u5316\u4e2d\u7684\uff0c\u552f\u6709\u4e00\u4e2a\u652f\u6301 Linux \u4e0b RISC-V \u6307\u4ee4\u96c6\u4e0e\u6211\u4eec\u57fa\u672c\u65e0\u5173\u3002\u6240\u4ee5 Java 19 \u548c\u00a0 Java 20 \u7eaf\u7cb9\u7684\u8fc7\u5ea6\u7248\u672c\uff0c\u6839\u672c\u4e0d\u8be5\u88ab\u6b63\u5f0f\u9879\u76ee\u91c7\u7528\uff0c\u5728 IntelliJ IDEA \u4e2d\u4e5f\u662f\u6807\u5b83\u4eec\u4e3a No new language features\u3002\u5728\u6211\u4eec\u7684\u5b9e\u8df5\u4e2d\u6b63\u5f0f\u9879\u76ee\u53ea\u7528 LTS \u7248\u3002<\/p>\n<br\/>\n\u8fd8\u662f\u5206\u522b\u4ece <a href=\"https:\/\/openjdk.org\/projects\/jdk\/19\/\">https:\/\/openjdk.org\/projects\/jdk\/19\/<\/a> \u548c <a href=\"https:\/\/openjdk.org\/projects\/jdk\/20\/\">https:\/\/openjdk.org\/projects\/jdk\/20\/<\/a>\u00a0\u6293\u5173\u6ce8\u70b9<br\/><br\/>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 50%;\">\nJava 19\u00a0\u65b0\u7279\u6027\n<ul>\n<li>405: <a href=\"https:\/\/openjdk.org\/jeps\/405\">Record Patterns (Preview)<\/a><\/li>\n<li>422: <a href=\"https:\/\/openjdk.org\/jeps\/422\">Linux\/RISC-V Port<\/a><\/li>\n<li>424: <a href=\"https:\/\/openjdk.org\/jeps\/424\">Foreign Function &amp; Memory API (Preview)<\/a><\/li>\n<li>425: <a href=\"https:\/\/openjdk.org\/jeps\/425\">Virtual Threads (Preview)<\/a><\/li>\n<li>426: <a href=\"https:\/\/openjdk.org\/jeps\/426\">Vector API (Fourth Incubator)<\/a><\/li>\n<li>427: <a href=\"https:\/\/openjdk.org\/jeps\/427\">Pattern Matching for switch (Third Preview)<\/a><\/li>\n<li>428: <a href=\"https:\/\/openjdk.org\/jeps\/428\">Structured Concurrency (Incubator)<\/a><\/li>\n<\/ul>\n<\/td>\n<td style=\"width: 50%;\">\nJava 20\u00a0\u65b0\u7279\u6027\n<ul>\n<li>429: <a href=\"https:\/\/openjdk.org\/jeps\/429\">Scoped Values (Incubator)<\/a><\/li>\n<li>432: <a href=\"https:\/\/openjdk.org\/jeps\/432\">Record Patterns (Second Preview)<\/a><\/li>\n<li>433: <a href=\"https:\/\/openjdk.org\/jeps\/433\">Pattern Matching for switch (Fourth Preview)<\/a><\/li>\n<li>434: <a href=\"https:\/\/openjdk.org\/jeps\/434\">Foreign Function &amp; Memory API (Second Preview)<\/a><\/li>\n<li>436: <a href=\"https:\/\/openjdk.org\/jeps\/436\">Virtual Threads (Second Preview)<\/a><\/li>\n<li>437: <a href=\"https:\/\/openjdk.org\/jeps\/437\">Structured Concurrency (Second Incubator)<\/a><\/li>\n<li>438: <a href=\"https:\/\/openjdk.org\/jeps\/438\">Vector API (Fifth Incubator)<\/a><\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\u4ece\u4e0a\u9762\u53ef\u4ee5\u6311\u51e0\u4e2a\u7a0d\u52a0\u4e86\u89e3\uff0c\u8be6\u7ec6\u7684\u4ecb\u7ecd\u5e94\u8be5\u5728\u5b66\u4e60 Java 21 \u65f6\u3002\u5b83\u4eec\u662f"},{"title":"\u5b66\u4e60 Java 18 \u7684\u65b0\u7279\u6027","link":"https:\/\/yanbin.blog\/java-18-new-features\/","pubDate":"Sat, 27 Sep 2025 20:33:26 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-18-new-features\/","description":"\n\u6709\u4e86 AI \u662f\u4e0d\u662f\u5c31\u7528\u4e0d\u7740\u4e86\u89e3\u8bed\u8a00\u7279\u6027\u672c\u8eab\u5462\uff1f\u7528 Vibe Coding \u96be\u9053\u5c31\u65e0\u6240\u4e0d\u80fd\u5462\uff1f\u5982\u679c\u662f\u7684\u8bdd\u90a3\u4e9b\u627e\u5de5\u4f5c\u7684\u4e5f\u5c31\u65e0\u9700\u5237 LeetCode \u4e86\u3002\u8bd5\u60f3 Vibe Coding \u4ea7\u751f\u4e86\u6210\u5806\u7684\u4ee3\u7801\uff0c\u5373\u4f7f\u521b\u5efa\u4e86 Pull Request, \u4e5f\u4e0d\u662f\u7ed9\u4eba Review \u7684\uff0c\u4e5f\u53ea\u80fd\u7531 AI \u6765 Review, \u5230\u5934\u6765\u5c31\u662f AI \u4e0e AI \u81ea\u5df1\u73a9\uff0c\u6709 Bug \u4e5f\u53ea\u6709 AI \u770b\u5f97\u61c2\u3002\u4ee5\u540e\u7684\u5c4e\u5c71\u4ee3\u7801\u662f\u4e00\u8f66\u4e00\u8f66\u7684\u6765\u3002<br\/><br\/>\n\u9664\u4e86\u4ece JDK \u5b98\u65b9\u6bcf\u4e2a\u7248\u672c\u7684 <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/18all-relnotes.html#NewFeature\">What's New in JDK 18 - New Features and Enhancements<\/a>,\u00a0\u8fd8\u53ef\u4ee5\u770b <a href=\"https:\/\/openjdk.org\/projects\/jdk\/18\/\">OpenJDK JDK 18<\/a> \u5217\u51fa\u7684\u66f4\u7b80\u660e\u7684\u65b0\u7279\u6027\u3002\u81ea JDK 10 \u4e4b\u540e\uff0c\u6bcf\u4e00\u7248\u7684\u65b0\u7279\u6027\u7531\u94fe\u63a5 https:\/\/openjdk.org\/projects\/jdk\/&lt;version&gt;\/ \u67e5\u770b\uff0c\u5982 JDK 10 \u65b0\u7279\u6027\u94fe\u63a5\u4e3a <a href=\"https:\/\/openjdk.org\/projects\/jdk\/10\/\">https:\/\/openjdk.org\/projects\/jdk\/10\/<\/a>\u3002<br\/><br\/>\n\u5728 <a href=\"https:\/\/openjdk.org\/projects\/jdk\/18\/\">https:\/\/openjdk.org\/projects\/jdk\/18\/<\/a> \u5217\u51fa\u4e86 JDK 18\u00a0\u5982\u4e0b\u65b0\u7279\u6027<br\/>\n<ul>\n<li>400: <a href=\"https:\/\/openjdk.org\/jeps\/400\">UTF-8 by Default<\/a><\/li>\n<li>408: <a href=\"https:\/\/openjdk.org\/jeps\/408\">Simple Web Server<\/a><\/li>\n<li>413: <a href=\"https:\/\/openjdk.org\/jeps\/413\">Code Snippets in Java API Documentation<\/a><\/li>\n<li>416: <a href=\"https:\/\/openjdk.org\/jeps\/416\">Reimplement Core Reflection with Method Handles<\/a><\/li>\n<li>417: <a href=\"https:\/\/openjdk.org\/jeps\/417\">Vector API (Third Incubator)<\/a><\/li>\n<li>418: <a href=\"https:\/\/openjdk.org\/jeps\/418\">Internet-Address Resolution SPI<\/a><\/li>\n<li>419: <a href=\"https:\/\/openjdk.org\/jeps\/419\">Foreign Function &amp; Memory API (Second Incubator)<\/a><\/li>\n<li>420: <a href=\"https:\/\/openjdk.org\/jeps\/420\">Pattern Matching for switch (Second Preview)<\/a><\/li>\n<li>421: <a href=\"Deprecate%20Finalization for Removal\">Deprecate Finalization for Removal<\/a><\/li>\n<\/ul><br\/>\n\u627e\u51e0\u4e2a\u6709\u4ee3\u8868\u6027\u7684\u7740\u91cd\u52a0\u4e86\u5b66\u4e60"},{"title":"Java 17 \u65b0\u7279\u6027","link":"https:\/\/yanbin.blog\/java-17-new-features\/","pubDate":"Sat, 12 Jul 2025 16:39:19 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-17-new-features\/","description":"\n\u6628\u5929\u5355\u5217\u4e86 <a href=\"https:\/\/yanbin.blog\/java-17-new-features-sealed-classes\">Java 17 \u65b0\u7279\u6027\u4e4b\u5bc6\u5c01\u7c7b\u578b<\/a>, \u7ee7\u7eed\u5237 <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/17-relnote-issues.html\">What's New in JDK 17 - New Features and Enhancements<\/a>.<\/p>\n<br\/>\n<h3>switch \u6a21\u5f0f\u5339\u914d(\u9884\u89c8)<\/h3>\n\u5728 Java 21 \u624d\u6b63\u5f0f\u653e\u51fa\uff0c\u4e3b\u52a8\u5c31\u662f\u539f\u6765\u7684 switch...case \u8bed\u53e5\u53ef\u4ee5\u5199\u6210\u8868\u8fbe\u5f0f\u7684\u65b9\u5f0f\uff0c\u6709\u8fd4\u56de\u503c, \u65e0\u9700\u6bcf\u4e2a\u5206\u652f\u7684 break, \u5e76\u589e\u52a0\u6a21\u5f0f\u5339\u914d\u529f\u80fd\uff0c\u6bd4\u5982\u5339\u914d\u7c7b\u578b\uff0c\u5e26\u7ea6\u675f\u5b50\u6761\u4ef6\uff0c\u5339\u914d record \u7684\u5b57\u6bb5\u503c\u7b49\uff0c\u8fd9\u91cc\u4e0d\u5c55\u5f00\u8bf4\u660e\uff0c\u5f85\u5230\u8be6\u7ec6\u4e86\u89e3 Java 21 \u65b0\u7279\u6027\u65f6\u518d\u6df1\u5165\u7814\u7a76\u3002<br\/><br\/>\n<h3>\u65b0\u7684 macOS\u00a0\u6e32\u67d3\u7ba1\u9053<\/h3>\n\u82f1\u6587\u662f New macOS Rendering Pipeline, \u4e3b\u8981\u662f Swing API \u5982\u679c\u914d\u7f6e\u7cfb\u7edf\u5c5e\u6027 <code>-Dsun.java2d.meta=true<\/code> \u5c31\u53ef\u4ee5\u7528 Apple Metal \u66ff\u4ee3 OpenGL \u52a0\u901f\u6e32\u67d3\u754c\u9762\uff0c\u5f88\u5c11\u5199 Java Swing \u684c\u9762\u5e94\u7528\u7684\u7565\u8fc7\u3002<br\/><br\/>\n<h3>\u65b0\u7684 API\u00a0\u53ef\u8bbf\u95ee\u5927\u56fe\u6807\u00a0<\/h3>\n\u540c\u6837\u662f\u5728\u5bf9 Swing \u7684\u6539\u8fdb\uff0c\u53ef\u7528 FileSystemView \u52a0\u8f7d\u89e3\u6790\u5ea6\u7684\u56fe\u6807"},{"title":"Java 17 \u65b0\u7279\u6027\u4e4b\u5bc6\u5c01\u7c7b\u578b","link":"https:\/\/yanbin.blog\/java-17-new-features-sealed-classes\/","pubDate":"Thu, 10 Jul 2025 00:35:12 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-17-new-features-sealed-classes\/","description":"\n\u5de5\u4f5c\u4e2d\u6240\u6709\u9879\u76ee\u90fd\u5df2\u5347\u7ea7\u5230\u4e86\u5f53\u524d\u7684 LTS \u7248 Java 21, \u773c\u770b Java \u5feb\u8981\u6765\u5230\u4e86\u4e0b\u4e00\u4e2a LTS \u7248\u672c - Java 25\uff0c\u5c06\u4e8e\u4eca\u5e74 9 \u6708\u4efd\u53d1\u5e03\u3002\u56db\u5e74\u524d\u8bb0\u5f55\u8fc7\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-10-16-new-features\/\">Java 10 ~ 16 \u4e00\u8def\u5411\u524d\u51b2(\u65b0\u7279\u6027\u4e00\u7ba9\u7b50)<\/a>\uff0c\u5176\u4e2d\u5939\u6742\u7740\u5b75\u5316\uff0c\u9884\u89c8\u4e2d\u7684\u4ee5\u53ca\u6b63\u5f0f\u7684\u7279\u6027\u3002\u73b0\u5728\u7ee7\u7eed\u8ddf\u968f\u7740 Java 16 \u4e4b\u540e\u7248\u672c\u7684\u7279\u6027\uff0c\u4e3b\u8981\u8bb2\u8ff0\u6b63\u5f0f\u7684\uff0c\u53ef\u76f4\u89c2\u4f53\u9a8c\u5230\u7684\u7279\u6027\uff0c\u5b75\u5316\u4e0e\u9884\u89c8\u4e2d\u7684\u7279\u6027\u53ea\u4f1a\u7b80\u5355\u63d0\u53ca\u3002<\/p>\n<br\/>\n\u5148\u8fd8\u662f\u770b\u4e0b Java \u7684\u53d1\u5e03\u65e5\u671f\u5b89\u6392\u00a0<a href=\"https:\/\/www.oracle.com\/java\/technologies\/java-se-support-roadmap.html\">Oracle Java SE Support Roadmap<\/a><br\/>\n<blockquote>\n\u7248\u672c\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u53d1\u5e03\u65e5\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u539f\u5b9a\u652f\u6301\u81f3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u5ef6\u671f\u652f\u6301\u81f3<br \/>\nJava 17(LTS)\u00a0 \u00a0 \u00a0 2021\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02026\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 2029\/12<\/strong><br \/>\nJava 18-20\u00a0 \u00a0 \u00a0 \u00a0 \u00a02022\/3 - 2023\/3\u00a0 \u00a0 \u00a0 2022\/9 - 2023\/9\u00a0 \u00a0 \u00a0N\/A<br \/>\nJava 21(LTS)\u00a0 \u00a0 \u00a0 2023\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02028\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<strong>2031\/9<br \/>\n<\/strong>Java 22\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02024\/3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02024\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 N\/A<br \/>\nJava 23\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02024\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02025\/3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 N\/A<br \/>\nJava 24\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02025\/3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02025\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 N\/A<br \/>\nJava 25(LTS)\u00a0 \u00a0 \u00a0 2025\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a02030\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<strong>2033\/9<\/strong>\n<\/blockquote>\n\u4e5f\u5c31\u662f\u6bcf\u4e24\u5e74(9\u6708\u4efd)\u4f1a\u6709\u4e00\u4e2a LTS \u7248\u672c\uff0c\u4e2d\u95f4\u82e5\u5e72\u8fc7\u5ea6\u7248\u672c\u3002\u5728\u6b63\u5f0f\u9879\u76ee\u4e2d\u5c3d\u53ef\u80fd\u53ea\u7528 LTS \u7248\u672c\uff0c\u56e0\u4e3a LTS \u7248\u66f4\u7a33\u5b9a\uff0c\u4e14\u6709\u957f\u671f\u7684\u8865\u4e01\uff0c\u4e0d\u80fd\u9879\u76ee\u8fdb\u884c\u4e2d\u4e0d\u5f97\u4e0d\u5728\u8fdb\u884c\u975e LTS\u00a0\u4e3b\u7248\u672c\u5347\u7ea7\u3002"},{"title":"\u5b9e\u6d4b Tomcat maxThreads, acceptCount, maxConnections \u53c2\u6570\u53ca\u5173\u7cfb","link":"https:\/\/yanbin.blog\/how-tomcat-maxthreads-acceptcount-maxconnections\/","pubDate":"Wed, 21 May 2025 19:41:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/how-tomcat-maxthreads-acceptcount-maxconnections\/","description":"\n\u4f7f\u7528 Tomcat \u65f6\u5e94\u6839\u636e\u670d\u52a1\u5668\u7684\u8d1f\u8f7d\u548c\u5ba2\u6237\u7aef\u80fd\u63a5\u53d7\u7684\u7b49\u5f85\u60c5\u53ef\u9002\u5f53\u7684\u8c03\u8282 maxThreads, acceptCount, maxConnections \u7684\u503c\u3002\u8fd9\u4e09\u4e2a\u53c2\u6570\u53ea\u6709 maxThreads \u662f\u6700\u5bb9\u6613\u7406\u89e3\uff0c\u5373 Tomcat \u5f53\u524d\u6700\u5927\u540c\u65f6\u5904\u7406\u8bf7\u6c42\u7684\u6570\u76ee\uff0c\u5176\u4ed6\u4e24\u4e2a\u53c2\u6570\u6709\u4e9b\u6a21\u7cca\u3002\u800c\u641c\u7d22\u7f51\u7edc\u76f8\u5173\u7684\u89e3\u91ca\u53d1\u73b0\u4e00\u4e9b\u76f8\u4e92\u77db\u76fe\u7684\u5730\u65b9\uff0c\u672c\u6587\u5c06\u901a\u8fc7\u8c03\u6574\u8fd9\u51e0\u4e2a\u503c\uff0c\u5b9e\u9645\u4f53\u9a8c\u5b83\u4eec\u5bf9\u8bf7\u6c42\u8fde\u63a5\u7684\u5f71\u54cd\u3002<br\/><br\/>\n\u5728\u6d4b\u8bd5\u4e4b\u524d\uff0c\u5148\u770b\u770b Tomcat \u5b98\u7f51\u7684\u89e3\u91ca\uff0c\u4f60\u53ef\u80fd\u4e0d\u4fe1 AI \u7684\u80e1\u8bf4\u516b\u9053\uff0c\u5b98\u7f51\u4ecd\u7136\u662f\u6700\u53ef\u4fe1\u7684\u3002\u5728\u5173\u4e8e <a href=\"https:\/\/tomcat.apache.org\/tomcat-10.0-doc\/config\/http.html\">The HTTP Connector<\/a> \u4e00\u7ae0\u4e2d\uff0c\u627e\u5230\u5b83\u4eec\u4e09\u8005\u4e4b\u95f4\u7684\u8bf4\u660e\u539f\u6587\u662f<br\/>\n<blockquote>\nEach incoming, non-asynchronous request requires a thread for the duration of that request. If more simultaneous requests are received than can be handled by the currently available request processing threads, additional threads will be created up to the configured maximum (the value of the\u00a0<code>maxThreads<\/code>\u00a0attribute). If still more simultaneous requests are received, Tomcat will accept new connections until the current number of connections reaches\u00a0<code>maxConnections<\/code>. Connections are queued inside the server socket created by the\u00a0<strong>Connector<\/strong>\u00a0until a thread becomes available to process the connection. Once\u00a0<code>maxConnections<\/code>\u00a0has been reached the operating system will queue further connections. The size of the operating system provided connection queue may be controlled by the\u00a0<code>acceptCount<\/code>\u00a0attribute. If the operating system queue fills, further connection requests may be refused or may time out.\n<\/blockquote>\n\u7528 Google\u00a0\u7ffb\u8bd1\u540e"},{"title":"Java ArrayList \u9ed8\u8ba4\u5bb9\u91cf\u53ca\u589e\u957f\u7b56\u7565","link":"https:\/\/yanbin.blog\/java-arraylist-default-capacity-increase-policy\/","pubDate":"Tue, 06 May 2025 00:32:44 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-arraylist-default-capacity-increase-policy\/","description":"\n\u65e9\u5148\u5bf9 Java ArrayList \u7684\u6269\u5bb9\u7406\u89e3\u662f\u5728 new ArrayList() \u65f6\u4f1a\u9ed8\u8ba4\u5efa\u7acb\u4e00\u4e2a\u5185\u90e8\u5bb9\u91cf\u4e3a 16(\u8fd9\u4e2a\u6570\u503c\u8fd8\u662f\u9519\u7684\uff0c\u5f80\u540e\u770b) \u5927\u5c0f\u7684\u6570\u7ec4\uff0c\u7136\u800c\u63d2\u5165\u6570\u636e\u5bb9\u91cf\u4e0d\u8db3\u65f6\u4f1a\u6269\u5bb9\u4e3a\u539f\u6765\u7684 1.5 \u500d\uff0c\u5e76\u7528 System.arraycopy()\u00a0 \u79fb\u52a8\u539f\u6765\u7684\u6570\u7ec4\u5230\u65b0\u7684\u5927\u6570\u7ec4\u4e2d\uff0c\u6240\u4ee5\u4e3a\u4e86\u9891\u7e41\u7684\u5185\u90e8\u6269\u5bb9\u64cd\u4f5c\uff0c\u5728\u5df2\u77e5 ArrayList \u5c06\u6765\u5927\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u5e94\u8be5\u5728\u521b\u5efa ArrayList \u65f6\u6307\u5b9a\u5927\u5c0f\uff0c\u5982 new ArrayList(1000)\u3002\u90a3\u4e48\u662f\u5426\u6307\u5b9a\u521d\u59cb\u5bb9\u91cf\u5bf9\u6027\u80fd\u4f1a\u6709\u591a\u5927\u7684\u5f71\u54cd\u4ecd\u7f3a\u4e4f\u611f\u6027\u7684\u8ba4\u8bc6\u3002<\/p>\n<br\/>\n\u672c\u6587\u901a\u8fc7\u5177\u4f53\u7684\u6d4b\u8bd5\u4e3b\u8981\u638c\u63e1\u4ee5\u4e0b\u77e5\u8bc6<br\/>\n<ol>\n<li>new ArrayList() \u9ed8\u8ba4\u5bb9\u91cf\u5927\u5c0f(JDK 8 \u4ee5\u524d\u662f 10, JDK 8 \u53ca\u4ee5\u540e\u4e3a 0)<\/li>\n<li>ArrayList \u4f55\u65f6\u8fdb\u884c\u6269\u5bb9\uff0c\u4ee5\u53ca\u6bcf\u6b21\u6269\u5bb9\u591a\u5c11<\/li>\n<li>new ArrayList() \u65f6\u662f\u5426\u6307\u5b9a\u521d\u59cb\u5bb9\u91cf\u503c\u7684\u6027\u80fd\u5bf9\u6bd4<\/li>\n<li>\u9664\u4e86 ArrayList \u81ea\u52a8\u6269\u5bb9\u5916\uff0c\u5b83\u4f1a\u4e0d\u4f1a\u81ea\u52a8\u7f29\u5bb9\u5462\uff1f<\/li>\n<\/ol>\n<br\/>\n<h3>new ArrayList() \u7684\u9ed8\u8ba4\u5bb9\u91cf\u591a\u5c11\u53ca\u589e\u5bb9\u7b56\u7565<\/h3>\n\u5c31\u50cf JDK 8 \u7684 HashMap \u5f15\u5165\u4e86\u7ea2\u9ed1\u6811\u6539\u5584\u6027\uff0c\u968f\u7740 JDK \u7248\u672c\u7684\u5347\u7ea7 ArrayList \u7684\u5185\u90e8\u5b9e\u73b0\u4e5f\u5728\u6f14\u8fdb\u3002\u56de\u5230 JDK 7, \u5f53\u6211\u4eec\u4e0d\u6307\u5b9a\u5bb9\u91cf new ArrayList() \u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u65f6\u7684\u5b9e\u73b0\u662f"},{"title":"Java \u4e2d\u663e\u5f0f throw \u4e0e\u8c03\u7528\u53ea throw \u5f02\u5e38\u65b9\u6cd5\u7684\u533a\u522b","link":"https:\/\/yanbin.blog\/java-explicitly-throw-and-call-only-throw-function\/","pubDate":"Wed, 16 Apr 2025 14:14:53 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-explicitly-throw-and-call-only-throw-function\/","description":"\nJava \u4ee3\u7801\u4e2d\u5982\u679c\u663e\u5f0f\u7684\u7528 <code>throw<\/code> \u5173\u952e\u5b57\u629b\u51fa\u5f02\u5e38\uff0c\u90a3\u4e48\u5728\u8be5\u5206\u652f\u4e2d\u5176\u540e\u7684\u8bed\u53e5\u4e0d\u53ef\u5230\u8fbe\uff0c\u5e76\u4e14\u5373\u4f7f\u5bf9\u4e8e\u6709\u8fd4\u56de\u503c\u7684\u51fd\u6570\u4e5f\u4e0d\u5fc5\u5199\u00a0<code>return<\/code>\u00a0 \u8bed\u53e5\u4e86\u3002\u50cf\u4e0b\u9762\u7684\u4ee3\u7801<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">num<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">num<\/span><span class=\"w\"> <\/span><span class=\"o\">==<\/span><span class=\"w\"> <\/span><span class=\"n\">0<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">throw<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">RuntimeException<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">num<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">1<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u4ee5\u4e0a\u4ee3\u7801\u662f\u5408\u6cd5\u7684\u3002\u8981\u6e05\u6d01\u4ee3\u7801\u7684\u8bdd\uff0c\u6700\u540e\u7684 <code>return num + 1<\/code>\u00a0 \u4e0d\u5fc5\u5199\u5728 <code>else<\/code> \u6761\u4ef6\u4e2d\uff0c\u8fd9\u6837\u5199\u53ea\u662f\u4e3a\u4e86\u9a8c\u8bc1\u629b\u51fa\u5f02\u5e38\u540e\u4e0d\u5fc5\u6709\u8fd4\u56de\u503c\u3002<br\/><br\/>\n\u6bd4\u5982\u6211\u4eec\u60f3\u5bf9\u8be5\u4ee3\u7801\u8fdb\u884c\u91cd\u6784\uff0c\u628a <code>throw<\/code> \u8bed\u53e5\u62bd\u53d6\u5230\u4e00\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u4ee5\u4fbf\u4e8e\u5728\u8be5\u65b9\u6cd5\u4e2d\u96c6\u4e2d\u5904\u7406\u9519\u8bef\u4fe1\u606f\uff0c\u4e8e\u662f\u53d8\u6210\u4e86"},{"title":"\u4f7f\u7528 Cucumber Java \u8fdb\u884c BDD \u6d4b\u8bd5\u5faa\u5e8f\u6e10\u8fdb","link":"https:\/\/yanbin.blog\/cucumber-java-bdd-steps-in\/","pubDate":"Thu, 27 Mar 2025 14:32:14 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/cucumber-java-bdd-steps-in\/","description":"\n\u4e0d\u5f97\u4e0d\u627f\u8ba4\u56e0\u4e3a ChatGPT \u4e3a\u4ee3\u8868\u7684 AI \u7684\u51fa\u73b0\uff0c\u8ba9\u8bb8\u591a\u6280\u672f\u535a\u5ba2\u7684\u5199\u4f5c\u8005\u79ef\u6781\u6027\u5927\u5927\u964d\u4f4e\u3002\u4f46\u672c\u7740\u4ee5\u5b66\u4e60\u638c\u63e1\u77e5\u8bc6\u4e3a\u76ee\u7684\uff0c\u5b9e\u6218\uff0c\u5199\u4e0b\u6765\u5bf9\u52a0\u5f3a\u5b66\u4e60\u4ecd\u7136\u662f\u975e\u5e38\u6709\u610f\u4e49\u7684\u3002\u5982\u679c\u4e00\u76f4\u4f7f\u7528 AI \u6765\u89e3\u51b3\u6280\u672f\u95ee\u9898\uff0c\u77e5\u8bc6\u6c38\u8fdc\u662f AI \u7684\uff0c\u81f3\u4e8e\u8bf4\u6709\u4e86 AI \u672c\u5e94\u6ca1\u6709\u4e3b\u52a8\u5b66\u4e60\u5fc5\u8981\u7684\u6027\u7684\u8bdd\uff0c\u6c38\u8fdc\u4fdd\u6301\u50cf\u4e00\u5f20\u767d\u7eb8\uff0cA4\u00a0\u5927\u5c0f\uff0c\u90a3\u771f\u5c31\u65e0\u8bdd\u53ef\u8bf4\u4e86\u3002<\/p>\n<br\/>\n\u5f00\u53d1\u8fc7\u7a0b\u9a71\u52a8\u6709\u5206 TDD(Test-Driven Development) \u548c BDD(Behavior-Driven Development)\uff0c\u5927\u81f4\u7684\u7406\u89e3\u662f TDD \u66f4\u5173\u6ce8\u5b9e\u73b0\u7ec6\u8282\uff0cBDD \u66f4\u63a5\u8fd1\u4e8e QA \u7684\u6d4b\u8bd5\uff0c\u5bf9\u9886\u57df\u7684\u6d4b\u8bd5\u3002BDD\u00a0\u4ece\u62bd\u8c61\u4e2d\u6765\u8bb2\u66f4\u9002\u4e8e\u505a\u9762\u5411\u7528\u6237\u7684\u96c6\u6210\u6d4b\u8bd5\u3002\u5f53\u7136\u5728 AI \u751f\u6210\u4ee3\u7801\u7684\u5e74\u4ee3\u53ef\u80fd\u5355\u73a9\u6d4b\u8bd5\u53cd\u800c\u4e0d\u90a3\u4e48\u91cd\u8981\uff0c\u56e0\u4e3a\u66f4\u591a\u662f\u4e00\u6b21\u6027\u4ee3\u7801\u3002<br\/><br\/>\nBDD \u7ed9\u4eba\u6700\u5178\u578b\u7684\u5370\u8c61\u662f Scenario\/Given\/When\/Then, BDD \u6700\u6d41\u884c\u7684\u6d4b\u8bd5\u6846\u67b6\u5f53\u5c5e <a href=\"https:\/\/cucumber.io\">Cucumber<\/a>, \u5b83\u4ee5\u63d2\u4ef6\u7684\u65b9\u5f0f\u652f\u6301\u4f17\u591a\u7f16\u7a0b\u8bed\u65b9\uff0c\u5982\u5b98\u65b9\u652f\u6301\u7684\u7528 JavaScript, Java, Kotlin, Ruby, Lua, Scala, C++, Go, OCaml, \u8fd8\u6709\u5176\u4ed6\u534a\u5b98\u652f\u6301\u7684 Python, Swift\/ObjC, Perl, .NET(C#, F#, VB), \u4ee5\u53ca\u975e\u5b98\u65b9\u652f\u6301\u7684 Rust, D, Groovy \u7b49\u3002<br\/><br\/>\n\u53e6\u5916\u8fd8\u6709\u4e00\u4e2a\u4e13\u4f9b Java \u7684\u8f7b\u91cf\u7ea7 <a href=\"https:\/\/jbehave.org\/\">JBehave<\/a>, \u4e0d\u8fc7\u4e2a\u4eba\u66f4\u63a8\u8350\u7528 Cucumber, \u56e0\u4e3a Cucumber \u5f97\u5230\u66f4\u591a IDE \u5982 IntelliJ, Eclipse, VS Code \u7b49\u7684\u652f\u6301\uff0c\u5e76\u80fd\u4e0e JUnit 4, JUnit 5, TestNG, \u4ee5\u53ca\u00a0 Spring Boot \u9879\u76ee\u96c6\u6210\uff0c\u5185\u7f6e\u7684\u6d4b\u8bd5\u62a5\u544a\u63d2\u4ef6\uff0c\u591a\u8bed\u8a00\u5f53\u7136\u662f\u4e2a\u4eae\u70b9\u3002<br\/><br\/>\n\u672c\u6587\u4e3b\u8981\u5173\u6ce8 Maven \u9879\u76ee\u4e2d\u5982\u4f55\u4f7f\u7528 Cucumber, \u5faa\u5e8f\u6e10\u8fdb\u7684\u4ece\u7b80\u5355\u7684\u6d4b\u8bd5\u5f00\u59cb\uff0c\u7136\u540e\u8dc3\u8fdb\u5230\u4e0e JUnit 5\/ JUnit 4 \u7684\u7ed3\u5408\uff0c\u4ee5\u53ca\u666e\u901a Unit Test \u548c BDD \u6d4b\u8bd5\u5982\u4f55\u5e76\u5b58\u4e14\u53ef\u533a\u5206\u7684\u6267\u884c\uff0c\u6216\u8005\u5728 Maven \u4e2d\u521b\u5efa\u72ec\u7acb\u7684\u00a0 src\/bdd \u76ee\u5f55\u5355\u72ec\u5b58\u653e BDD \u6d4b\u8bd5\u7528\u4f8b\u3002"},{"title":"\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\u4f7f\u7528 Mockito \u6765 Mock \u9759\u6001\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/mockito-mock-static-method-in-multiple-threading-env\/","pubDate":"Thu, 10 Oct 2024 11:26:03 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-mock-static-method-in-multiple-threading-env\/","description":"\n\u56de\u770b\u4e09\u5e74\u524d\u7684\u4e00\u7bc7\u65e5\u5fd7 <a href=\"https:\/\/yanbin.blog\/mockito-3-4-0-mock-static-method\/\">Mockito 3.4.0 \u5f00\u59cb\u53ef Mock\u00a0 \u9759\u6001\u65b9\u6cd5<\/a>\uff0c\u6700\u540e\u5bf9 Mockito\u00a0\u4ea7\u751f\u7684\u7f3a\u61be\u662f\u5b83\u65e0\u6cd5\u7528\u6765 Mock \u975e\u6d4b\u8bd5\u7ebf\u7a0b(\u4e3b\u7ebf\u7a0b)\u4e2d\u7684\u9759\u6001\u65b9\u6cd5\u8c03\u7528\u3002\u5176\u5b9e\u8fd9\u4e5f\u662f\u53ef\u4ee5\u53d8\u901a\u7684\uff0c\u4e0b\u9762\u6162\u6162\u9053\u6765\u3002<\/p>\n<br\/>\n\u9996\u5148\u56de\u987e\u4e00\u4e0b Mockito\u00a0 \u7684\u9759\u6001\u65b9\u6cd5 Mock \u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u968f\u7740 Mockito \u7248\u672c\u7684\u5347\u7ea7\uff0c\u5f15\u5165\u4f9d\u8d56\u7684\u65b9\u5f0f\u4e5f\u53d1\u751f\u4e86\u4e9b\u8bb8\u7684\u53d8\u5316\uff0c\u4ee5 Maven \u9879\u76ee\u4e3a\u4f8b\uff0c\u5982\u679c\u5728 JUnit 5 \u4e0b\u7528 Mockito \u7684 pom.xml \u4f9d\u8d56\u4e2d\u4e3a<br\/><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nt\">&lt;dependency&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"nt\">&lt;groupId&gt;<\/span>org.mockito<span class=\"nt\">&lt;\/groupId&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"nt\">&lt;artifactId&gt;<\/span>mockito-junit-jupiter<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> <span class=\"nt\">&lt;version&gt;<\/span>5.14.1<span class=\"nt\">&lt;\/version&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> <span class=\"nt\">&lt;scope&gt;<\/span>test<span class=\"nt\">&lt;\/scope&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/dependency&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u7531\u5b83\u5f15\u5165\u7684\u5168\u90e8\u76f8\u5173\u4f9d\u8d56<br\/>\n<a href=\"https:\/\/yanbin.blog\/posts\/2024\/mockito-mock-static-method-in-multiple-threading-env\/mockito-dependencies.png\" target=\"_blank\" rel=\"noreferrer\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2024\/mockito-mock-static-method-in-multiple-threading-env\/mockito-dependencies-800x435.png\"\nwidth=\"405px\"\n\/>\n<\/a>"},{"title":"Java, Python \u4e24\u79cd\u5f62\u5f0f\u7684 base64encode","link":"https:\/\/yanbin.blog\/java-python-two-styles-base64encode\/","pubDate":"Thu, 19 Sep 2024 13:21:49 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-python-two-styles-base64encode\/","description":"\n\u5728\u7528 Python \u5199 Web \u670d\u52a1\u7aef\u4ee3\u7801\u65f6\uff0c\u7528 base64.encodebytes() \u51fd\u6570\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884c\u7f16\u7801\uff0c\u7136\u540e\u5728 Java \u7aef\u7528 Base64.getDecoder().decode() \u65f6\u65e0\u6cd5\u89e3\u7801\uff0c\u96be\u9053 base64 \u7f16\u7801\u5728\u4e24\u79cd\u8bed\u8a00\u95f4\u8fd8\u6709\u8fd9\u7b49\u5dee\u5f02\u3002Google \u4e00\u4e0b\uff0c\u5f97\u5230\u7684\u7b54\u6848\u662f\u5728 Java \u7aef\u8981\u7528 Base64.getMimeDecoder().decode() \u51fd\u6570\u89e3\u7801\u3002\u8fd9\u4e00\u95ee\u9898\u7b97\u662f\u89e3\u51b3\u4e86, \u4e0d\u8fc7\u540e\u6765\u53c8\u5728 Python \u5199\u7684 AWS Lambda\u00a0\u4e2d\u8f93\u51fa<\/p>\n<blockquote>\nreturn {<br \/>\n\u00a0 \u00a0 \"statusCode\": 200,<br \/>\n\u00a0 \u00a0 \"body\": base64.encodebytes(b\"short message\"),<br \/>\n\u00a0 \u00a0 \"isBase64Encoded\": True<br \/>\n}\n<\/blockquote>\n\u4ee5 AWS Lambda functionURL \u7684\u65b9\u5f0f\u6765\u8bbf\u95ee\uff0c\u5bf9\u4e8e body \u4e2d\u7684\u5c0f\u5b57\u7b26\u4e32\u662f\u6ca1\u95ee\u9898\uff0c\u4e00\u65e6 body \u591f\u5927\u65f6\u5728 Postman \u6216 curl \u547d\u4ee4\u4e2d\u65e0\u6cd5\u76f4\u63a5\u5c55\u793a\u51fa\u6765\uff0c\u7528 curl --output a.out \u5b58\u6210\u672c\u5730\u6587\u4ef6\uff0c\u6253\u5f00\u540e\u770b\u5230\u7684\u662f\u5e26\u6362\u884c\u7684\u683c\u5f0f<br\/>\n<blockquote>\nH4sIAAZi7GYC\/+19WXfcOLLmX+HxwxzXOS6b2AhiprvnyFtZt7yoJbdr6r74UEpKyq5UpjoXL\/fX<br \/>\nD8AlkysIkCFmpo2H7pJJEBkAAsCHQMQXf\/t6HX\/YrO83a++P168+xcvVdDH\/+yP6lOGnzEciCNHn<br \/>\ngD7yTufT9evpLD6L1rd\/f3Q6n03nsXexXk7nN4+8F4v59fRms4zW8uNtHdjH9KkfPEXoM6JPsf8U<br \/>\n......\n<\/blockquote>"},{"title":"ThreadLocal, InheritableThreadLocal \u4ee5\u53ca TransmittableThreadLocal","link":"https:\/\/yanbin.blog\/threadlocal-inheritablethreadlocal-transmittablethreadlocal\/","pubDate":"Fri, 23 Aug 2024 21:53:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/threadlocal-inheritablethreadlocal-transmittablethreadlocal\/","description":"\nThreadLocal \u662f Java \u7f16\u7a0b\u4eba\u5458\u8981\u638c\u63e1\u7684\u4e00\u4e2a\u57fa\u672c\u7c7b\uff0c\u4f3c\u4e4e\u6ca1\u4ec0\u4e48\u592a\u591a\u8981\u8bf4\u3002\u4f46\u56e0\u4e3a\u672c\u6587\u8981\u7275\u51fa TransmittableThreadlLocal, \u518d\u987a\u5e26\u8bf4\u4e0b\u51e0\u4e4e\u9690\u5f62\u7684 InheritableThreadLocal\u3002<\/p>\n<br\/>\nThreadLocal \u7528\u4e8e\u4fdd\u5b58\u4e0e\u7ebf\u7a0b\u7ed1\u5b9a\u7684\u6570\u636e\uff0c\u5b83\u5728\u6846\u67b6\u5185\u90e8\u4f7f\u7528\u7684\u5f88\u9891\u7e41\uff0c\u4f46\u51e1\u89c1\u5230 XxxContextHolder.currentContext() \u4e4b\u7c7b\u7684\u5341\u4e4b\u516b\u4e5d\u7528\u5230\u4e86 ThreadLocal, \u5982 Spring \u6846\u67b6\u4e2d\u7684<br\/><br\/>\nRequestContextHolder<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">abstract<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">RequestContextHolder<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kd\">final<\/span><span class=\"w\"> <\/span><span class=\"n\">ThreadLocal<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">RequestAttributes<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">requestAttributesHolder<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">NamedThreadLocal<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Request attributes&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kd\">final<\/span><span class=\"w\"> <\/span><span class=\"n\">ThreadLocal<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">RequestAttributes<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">inheritableRequestAttributesHolder<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">NamedInheritableThreadLocal<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Request context&#34;<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"Dubbo \u6700\u57fa\u7840\u7684 RPC \u5e94\u7528(\u4f7f\u7528 ZooKeeper)","link":"https:\/\/yanbin.blog\/dubbo-basic-rpc-call-with-zookeeper\/","pubDate":"Fri, 23 Aug 2024 11:17:39 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dubbo-basic-rpc-call-with-zookeeper\/","description":"\n\u770b\u56fd\u5185\u7684\u4e00\u4e9b\u9879\u76ee\u65f6 Dubbo \u8fd9\u4e2a\u8bcd\u7ecf\u5e38\u95ea\u73b0\uff0c\u4e00\u76f4\u4e5f\u4e0d\u4ee5\u4e3a\u7136\uff0c\u672a\u4f5c\u641c\u7d22\uff0c\u5f53\u7136\u4e5f\u4e0d\u77e5\u9053\u5b83\u662f\u505a\u4ec0\u4e48\u7528\u7684\u3002\u76f4\u5230\u6700\u8fd1\u9605\u8bfb\u5173\u4e8e\u5927\u578b\u7f51\u7ad9\u67b6\u6784\u76f8\u5173\u7684\u4e66\u4e2d\u53cd\u590d\u63d0\u5230 Dubbo \u540e\uff0c\u89c9\u5f97\u4e0d\u80fd\u518d\u5bf9\u5b83\u89c6\u800c\u4e0d\u89c1\u3002Google \u4e86\u4e00\u4e0b\uff0c\u5b83\u662f\u5728\u963f\u91cc\u5df4\u5df4\u521b\u5efa\u8d21\u732e\u7ed9\u4e86 Apache \u7684\u5f00\u6e90\u9879\u76ee\uff0c\u5728\u963f\u91cc\u5df4\u5df4\u7684\u5927\u578b\u5e94\u7528\u4e2d\u4e45\u7ecf\u8003\u9a8c\u8fc7\u7684\u3002Dubbo \u662f\u4ec0\u4e48\u5462\uff1f\u501f\u7528\u5b98\u65b9 <a href=\"https:\/\/dubbo.apache.org\/zh-cn\/overview\/what\/\">Dubbo\u00a0\u4ecb\u7ecd<\/a><\/p>\n<blockquote>\nApache Dubbo \u662f\u4e00\u6b3e RPC \u670d\u52a1\u5f00\u53d1\u6846\u67b6\uff0c\u7528\u4e8e\u89e3\u51b3\u5fae\u670d\u52a1\u67b6\u6784\u4e0b\u7684\u670d\u52a1\u6cbb\u7406\u4e0e\u901a\u4fe1\u95ee\u9898\uff0c\u5b98\u65b9\u63d0\u4f9b\u4e86 Java\u3001Golang \u7b49\u591a\u8bed\u8a00 SDK \u5b9e\u73b0\u3002\u4f7f\u7528 Dubbo \u5f00\u53d1\u7684\u5fae\u670d\u52a1\u539f\u751f\u5177\u5907\u76f8\u4e92\u4e4b\u95f4\u7684\u8fdc\u7a0b\u5730\u5740\u53d1\u73b0\u4e0e\u901a\u4fe1\u80fd\u529b\uff0c \u5229\u7528 Dubbo \u63d0\u4f9b\u7684\u4e30\u5bcc\u670d\u52a1\u6cbb\u7406\u7279\u6027\uff0c\u53ef\u4ee5\u5b9e\u73b0\u8bf8\u5982\u670d\u52a1\u53d1\u73b0\u3001\u8d1f\u8f7d\u5747\u8861\u3001\u6d41\u91cf\u8c03\u5ea6\u7b49\u670d\u52a1\u6cbb\u7406\u8bc9\u6c42\u3002Dubbo \u88ab\u8bbe\u8ba1\u4e3a\u9ad8\u5ea6\u53ef\u6269\u5c55\uff0c\u7528\u6237\u53ef\u4ee5\u65b9\u4fbf\u7684\u5b9e\u73b0\u6d41\u91cf\u62e6\u622a\u3001\u9009\u5740\u7684\u5404\u79cd\u5b9a\u5236\u903b\u8f91\u3002\n<\/blockquote>\nDubbo \u662f\u56fd\u5185\u4f01\u4e1a\u8d21\u732e\u7684\uff0c\u6240\u4ee5\u5b98\u65b9\u6709\u539f\u751f\u7684\u4e2d\u6587\u6587\u6863\uff0c\u5b83\u67d0\u4e9b\u65f6\u5019\u4e0e Spring Cloud \u9f50\u540d\uff0c\u53c8\u6709\u4e9b\u50cf AWS \u7684 ECS Service Discovery, Service Connect \u52a0\u4e0a ELB \u7684\u529f\u80fd\u3002"},{"title":"Java \u4f7f\u7528\u5806\u5916\u5185\u5b58(off-heap memory) \u4f5c\u4e3a\u7f13\u5b58","link":"https:\/\/yanbin.blog\/java-off-heap-memory-cache\/","pubDate":"Mon, 19 Aug 2024 16:58:50 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-off-heap-memory-cache\/","description":"\n\u6211\u4eec\u901a\u5e38\u7528\u7684 Java \u7f13\u5b58\u57fa\u672c\u53ef\u8ba4\u4e3a\u662f\u6269\u5c55\u4e86 HashMap \u6216 ConcurrentHashMap \u7684\u5b9e\u73b0\uff0c\u5b83\u4eec\u5404\u81ea\u5b9e\u73b0\u81ea\u5df1\u7684\u7f13\u5b58\u7b56\u7565\uff0c\u5982\u65f6\u95f4\u4e0e\u7a7a\u95f4\u7684\u63a7\u5236\uff0c\u751f\u547d\u5468\u671f\u7ba1\u7406\uff0c\u662f\u5426\u652f\u6301\u5206\u5e03\u5f0f\uff0c\u6ea2\u51fa\u65f6\u80fd\u5426\u8f6c\u50a8\u5230\u78c1\u76d8\u3002\u5173\u4e8e Java \u672c\u5730\u7f13\u5b58\u7684\u5b58\u50a8\u5206\u4e3a\u5185\u5b58\u4e0e\u78c1\u76d8\uff0c\u5185\u5b58\u591a\u6570\u60c5\u51b5\u4e0b\u6307\u7684\u662f\u5806\u5185\u5185\u5b58(on-heap), \u800c\u4ecb\u4e8e\u5806\u5185\u5185\u5b58\u4e0e\u6587\u4ef6\u5b58\u50a8\u4e4b\u95f4\u7684\u5c31\u662f\u5806\u5916\u5185\u5b58(off-heap)<br\/><br\/>\n<ol>\n<li>\u5806\u5185\u5b58\u50a8(on-heap): \u64cd\u4f5c\u6700\u5feb\uff0c\u65e0\u9700\u5e8f\u5217\u5316\uff0c\u4f46\u5927\u91cf\u6570\u636e\u65f6\u4f1a\u5f71\u54cd\u5230 GC \u7684\u6548\u7387<\/li>\n<li>\u5806\u5916\u5b58\u50a8(off-heap): \u5b58\u50a8\u5728 Java \u8fdb\u7a0b\u5185\u5b58\u4f46\u975e JVM \u5806\u5185(\u4e0d\u5728 -Xmx \u6307\u5b9a\u7684\u5185\u5b58\u8303\u56f4\u5185)\uff0c\u4f7f\u7528\u6216\u4fdd\u5b58\u65f6\u9700\u8fdb\u884c\u5e8f\u5217\u5316\/\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b(\u5728\u5806\u5185\u4e0e\u5806\u5916\u8f6c\u6362)\uff0c\u4f46\u4e0d\u53d7 GC \u5f71\u54cd\uff0c\u6709\u52a9\u4e8e\u63d0\u5b83\u6765 GC \u7684\u6548\u7387<\/li>\n<li>\u6587\u4ef6\u5b58\u50a8\uff1a\u4e0d\u4ec5\u5b58\u5728\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b\uff0c\u8fd8\u5e26 IO \u64cd\u4f5c\uff0c\u6240\u4ee5\u6700\u6162\uff0c\u552f\u4e00\u4f18\u70b9\u5c31\u662f\u5927<\/li>\n<\/ol>\n<br\/>\n\u6211\u4eec\u67e5\u770b\u4e00\u4e0b\u5f53\u524d Spring \u652f\u6301\u7684\u7f13\u5b58\u5b9e\u73b0, <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/2.0.x\/reference\/html\/boot-features-caching.html#boot-features-caching-provider\">Supported Cache Providers<\/a>, \u5217\u6709 Generic, JCache(JSR-107), EhCache 2.x, Hazelcast, Infinispan, Couchbase, Redis, Caffeine, Simple\uff0c \u8fd9\u5176\u4e2d\u65e0\u4e00\u652f\u6301\u5806\u5916\u7f13\u5b58\uff0c\u5176\u4e2d\u7684 EhCache \u8981\u4ed8\u8d39\u4f7f\u7528 EhCache 3(Big Memory) \u624d\u80fd\u652f\u6301 off-heap\u3002"},{"title":"Java \u7ebf\u7a0b\u6c60\u6709\u9650\u5927\u5c0f\u5de5\u4f5c\u961f\u5217 - \u4e0d\u4e22\u5f03\u4efb\u52a1\u7684\u5b9e\u73b0","link":"https:\/\/yanbin.blog\/java-threadpool-bounded-workqueue-block-wait\/","pubDate":"Thu, 09 May 2024 13:47:27 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-threadpool-bounded-workqueue-block-wait\/","description":"\n\u6211\u4eec\u5728\u521b\u5efa Java \u7ebf\u7a0b\u6c60\uff0c\u65e0\u8bba\u662f\u7528 Executors, ThreadPoolExecutor, \u8fd8\u662f Spring \u7684 ThreadPoolTaskExecutor, \u5982\u679c\u4e0d\u6307\u5b9a\u5de5\u4f5c\u961f\u5217\u7684\u5927\u5c0f\u7684\u8bdd\uff0c\u9ed8\u8ba4\u4e3a Integer.MAX_VALUE(2147483647), \u57fa\u672c\u4e0d\u4f1a\u628a\u5b83\u7206\u6ee1\uff0c\u4f46\u662f\u5728\u8bb8\u591a\u7684\u4efb\u52a1\u8981\u6267\u884c\u65f6\u5927\u91cf Runnable \u5bf9\u8c61\u7684\u521b\u5efa\u5374\u8db3\u4ee5\u628a\u5185\u5b58\u6491\u7206\u6389\u3002\u6240\u4ee5\u624d\u6709\u5fc5\u8981\u4f7f\u7528\u4e00\u4e2a\u6709\u9650\u5927\u5c0f\u7684\u5de5\u4f5c\u961f\u5217\uff0c\u5982 5000, \u518d\u914d\u4e0a RejectedExecutionHandler(DiscardOldestPolicy, DiscardPolicy, \u6216 CallerRunsPolicy)\u3002\u524d\u4e24\u79cd\u7b56\u7565\u4f1a\u4e3b\u52a8\u653e\u5f03\u6700\u65e7\u6700\u65b0\u7684\u4efb\u52a1\uff0c\u4e00\u822c\u4e0d\u662f\u6211\u4eec\u60f3\u8981\u7684\uff0cCallerRunsPolicy \u8fd8\u80fd\u4e3b\u52a8\u53d1\u6325\u4efb\u52a1\u63d0\u4ea4\u8005\u7684\u8ba1\u7b97\u80fd\u529b\uff0c\u662f\u4e00\u79cd\u4e0d\u9519\u7684\u9009\u62e9(\u53ea\u53ef\u80fd\u4f1a\u53d1\u751f\u5de5\u4f5c\u961f\u5217\u592a\u5c0f\u4e14\u63d0\u4ea4\u8005\u6267\u884c\u7684\u4efb\u52a1\u592a\u5fd9\u65f6\u4ea7\u751f\u7ebf\u7a0b\u6c60\u4e00\u65f6\u7684\u7a7a\u95f2\u3002<\/p>\n<br\/>\n\u6240\u4ee5\u603b\u7ed3\u8d77\u6765\u6211\u4eec\u53ef\u4ee5\u6709\u4ee5\u4e0b\u51e0\u79cd\u5b9e\u73b0<br\/><br\/>\n<h3>\u76f4\u63a5\u4f7f\u7528 CallerRunsPolicy<\/h3>\n\u5728\u5de5\u4f5c\u961f\u5217\u6ee1\u65f6\u6709\u6548\u5229\u7528\u63d0\u4ea4\u4efb\u52a1\u7684\u7ebf\u7a0b\uff0c\u4e0d\u8ba9\u5b83\u95f2\u7740\uff0c\u8fd9\u79cd\u5b9e\u73b0\u6700\u7b80\u5355,\u00a0\u50cf\u4e0b\u9762\u90a3\u6837\u58f0\u660e\u7ebf\u7a0b\u6c60<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">var<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPool<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ThreadPoolExecutor<\/span><span class=\"p\">(<\/span><span class=\"n\">2<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">5<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">0L<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">TimeUnit<\/span><span class=\"p\">.<\/span><span class=\"na\">SECONDS<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">LinkedBlockingQueue<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">10<\/span><span class=\"p\">),<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ThreadPoolExecutor<\/span><span class=\"p\">.<\/span><span class=\"na\">CallerRunsPolicy<\/span><span class=\"p\">());<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Java 9 \u524d\/\u540e\u4f7f\u7528 JAXB (\u5305\u62ec\u652f\u6301 javax.* \u6216 jakarta.*)","link":"https:\/\/yanbin.blog\/java-9-jaxb-including-javax-jakarta\/","pubDate":"Fri, 22 Mar 2024 22:13:28 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-9-jaxb-including-javax-jakarta\/","description":"\n\u4f7f\u7528 Java \u5904\u7406 Object \u4e0e XML \u4e4b\u95f4\u7684\u8f6c\u6362\u65f6 JAXB(Java Architecture for XML Binding) \u4ecd\u7136\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002\u4f46\u968f\u7740 Java 9 \u6a21\u5757\u5316\u540e\u628a JAXB \u4ece\u6807\u51c6 JDK \u4e2d\u79fb\u9664\u540e\uff0c\u548c Java EE 8(Jakarta EE 8) \u5230 Jakarta EE 9 \u7684\u53d8\u8fc1\u65f6\u547d\u540d\u7a7a\u95f4\u7531 <code>javax.*<\/code>\u00a0\u53d8\u6210\u4e86 <code>jakarta.*<\/code>\uff0c\u6211\u4eec\u5728\u4f7f\u7528 JAXB \u65f6\u9700\u4f5c\u51fa\u76f8\u5e94\u7684\u9002\u914d\u3002<\/p>\n<br\/>\n\u672c\u6587\u5206\u522b\u4f7f\u7528 Java 1.8, 17\uff0c\u901a\u8fc7 Maven \u63d2\u4ef6 jaxb2-maven-plugin \u7684 xjc (\u4ece xsd \u6587\u4ef6\u751f\u6210 Java \u7c7b), \u548c\u5982\u4f55\u5207\u6362\u00a0<code>jakarta.*<\/code> \u547d\u540d\u7a7a\u95f4\uff0c\u7531\u6b64\u53ef\u7ed9\u6211\u4eec\u5bf9\u4f7f\u7528\u4e86 JAXB \u7684\u9879\u76ee\u5347\u7ea7 JDK \u65f6\u6307\u660e\u65b9\u5411\u3002\u4ece\u800c\u4e0d\u81f4\u4e8e\u56e0\u4e0d\u4e86\u89e3\u6bcf\u90e8\u5206\u7ec4\u4ef6\u7684\u5177\u4f53\u529f\u6548\u800c\u5728 pom.xml \u4e2d\u80e1\u4e71\u914d\u7f6e\uff0c\u6bd4\u5982\u4e4b\u524d\u5bf9 jaxb2-maven-plugin \u63d2\u4ef6\u672c\u8eab\u914d\u7f6e\u4e86\u591a\u4f59\u7684 org.glassfish.jaxb:jaxb-xjc \u548c org.glassfish.jaxb:jaxb-runtime \u4f9d\u8d56\uff0c\u4e5f\u672a\u80fd\u7406\u89e3 jaxb2-maven-plugin \u4e0e org.glassfish.jaxb:jaxb-runtime \u4e4b\u95f4\u7684\u7248\u672c\u5bf9\u5e94\u5173\u7cfb\u3002<br\/><br\/>\n\u00a0\u5b9e\u9a8c\u51c6\u5907\uff0c\u521b\u5efa\u7b80\u5355\u7684 Maven \u9879\u76ee\uff0c\u5e76\u5728\u8def\u5f84 src\/main\/xsd\/ \u4e0b\u65b0\u5efa Schema\u00a0\u6587\u4ef6\u00a0sample.xsd\uff0c\u5185\u5bb9\u4e3a"},{"title":"Java StackOverflowError \u4e0e\u9012\u5f52\u53ca\u5c3e\u9012\u5f52\u4f18\u5316","link":"https:\/\/yanbin.blog\/stackoverflowerror-recursion-tail-recursion\/","pubDate":"Sat, 30 Dec 2023 18:33:20 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/stackoverflowerror-recursion-tail-recursion\/","description":"\n\u672c\u7bc7\u540c\u6837\u662f\u9605\u8bfb\u300a100 Java Mistakes and How to Avoid Them\u300b\u7684\u4e00\u5219\u7b14\u8bb0\uff0c\u53ea\u662f\u706b\u529b\u5168\u96c6\u4e2d\u5728 StackOverflowError \u8fd9\u4e2a\u5355\u4e00\u4e3b\u9898\u4e4b\u4e0a, \u4e14\u4e3b\u8981\u4e0e\u9012\u5f52\u53ca\u5c3e\u9012\u5f52\u4f18\u5316\u76f8\u5173\u3002\u4e00\u63d0\u5230 StackOverflow, \u6050\u6015\u9996\u5148\u662f\u60f3\u5230\u90a3\u4e2a\u4ee3\u7801\u642c\u8fd0\u6e90\u7f51\u7ad9 stackoverflow.com\uff0c\u5176\u6b21\u624d\u662f\u4ee3\u7801\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684 StackOverflowError \u9519\u8bef\u3002<br\/><br\/>\n\u4ec0\u4e48\u662f StackOverflow, \u51c6\u786e\u6765\u8bf4\u662f\u6307\u7ebf\u7a0b\u7684\u6808\u5185\u5b58\u4e0d\u8db3\uff0c\u65e0\u6cd5\u5728\u6808\u4e2d\u5206\u914d\u65b0\u7684\u5185\u5b58(\u6216\u521b\u5efa\u65b0\u7684\u6808\u5e27)\u3002\u6211\u4eec\u901a\u5e38\u4f1a\u628a\u5b83\u4e0e\u65b9\u6cd5\u8c03\u7528\u5173\u8054\u8d77\u6765\uff0c\u56e0\u4e3a\u4e00\u6b21\u65b9\u6cd5\u8c03\u7528\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6808\u5e27\uff0c\u5206\u914d\u5728\u6808\u4e0a\u7684\u5c40\u90e8\u53d8\u91cf(\u5305\u62ec\u57fa\u672c\u7c7b\u578b\u4e0e\u5bf9\u8c61\u5f15\u7528)\uff0c\u548c\u6808\u5e27\u90fd\u8981\u5360\u7528\u7ebf\u7a0b\u6808\u5185\u5b58\u3002\u800c\u6211\u4eec\u5e73\u65f6\u6240\u8bf4\u7684\u65b9\u6cd5\u8c03\u7528\u6808\uff0c\u6216\u51fa\u73b0\u5f02\u5e38\u65f6\u6253\u5370\u51fa\u7684\u5f02\u5e38\u6808\u90fd\u662f\u4e00\u4e2a\u6982\u5ff5\u3002<br\/><br\/>\nStackOverflowError \u4e00\u822c\u51fa\u73b0\u5728\u65b9\u6cd5\u8c03\u7528\u592a\u6df1(\u65b9\u6cd5\u8c03\u65b9\u6cd5)\uff0c\u624b\u52a8\u7f16\u5199\u7684\u65b9\u6cd5\u8c03\u7528\u4e00\u822c\u4e0d\u5bb9\u6613\u8fbe\u5230\u8fd9\u4e2a\u9650\u5236\uff0c\u6240\u4ee5\u5b83\u4e0e\u9012\u5f52\u8c03\u7528\u5173\u7cfb\u6700\u4e3a\u5bc6\u5207\uff0c\u9012\u5f52\u8c03\u7528\u6b21\u6570\u592a\u591a\u6216\u751a\u81f3\u6ca1\u6709\u51fa\u53e3\u6761\u4ef6\u65e0\u9650\u9012\u5f52; \u4e5f\u53ef\u80fd\u662f\u7ecf\u8fc7\u4e00\u756a\u9012\u5f52\u8c03\u7528\u540e\uff0c\u518d\u6b63\u5e38\u8c03\u7528\u540e\u7eed\u65b9\u6cd5\u65f6\u51fa\u73b0 StackOverflowError(\u56e0\u4e3a\u524d\u9762\u7684\u9012\u5f52\u8c03\u7528\u8d44\u6e90\u6d88\u8017\u7684\u5dee\u4e0d\u591a)<br\/><br\/>\n\u4f55\u8c13\u9012\u5f52\u8c03\u7528\uff0c\u7b80\u5355\u7684\u8bf4\u5c31\u662f\u65b9\u6cd5\u81ea\u5df1\u8c03\u7528\u81ea\u5df1\uff0c\u4ece\u800c\u5b9e\u73b0\u5faa\u73af\u7684\u6548\u679c\uff0c\u6216\u4f7f\u4ee3\u7801\u66f4\u7cbe\u7ec3\uff0c\u4f8b\u5982\u7ecf\u5178\u6392\u5e8f\u4e2d\u7684\u5feb\u901f\u548c\u5f52\u5e76\u6392\u5e8f\u5c31\u8981\u7528\u5230\u9012\u5f52\u3002\u4f46\u5faa\u73af\u4e0e\u9012\u5f52\u53c8\u6709\u672c\u8d28\u4e0a\u7684\u533a\u522b\uff0c\u5faa\u73af\u4e0d\u589e\u52a0\u8c03\u7528\u6df1\u5ea6\uff1b\u9012\u5f52\u5374\u4e0d\u540c\uff0c\u9012\u5f52\u5206\u9012\u8fdb\u4e0e\u56de\u5f52\u4e24\u4e2a\u8fc7\u7a0b\uff0c\u9012\u8fdb\u8c03\u7528\u65f6\u6bcf\u6b21\u8c03\u7528\u524d\u90fd\u9700\u901a\u8fc7\u538b\u6808\u6765\u4fdd\u7559\u73b0\u573a\uff0c\u9006\u5411\u56de\u5f52\u65f6\u518d\u9010\u7ea7\u6062\u590d\u73b0\u573a\uff0c\u4fdd\u7559\u73b0\u573a\u7684\u8fc7\u7a0b\u5c31\u8981\u4ece\u7ebf\u7a0b\u6808\u4e2d\u5206\u914d\u5185\u5b58\u7a7a\u95f4; \u6b7b\u5faa\u73af\u53ef\u80fd\u4e0d\u4f1a\u9020\u6210\u7a0b\u5e8f\u5f02\u5e38\uff0c\u4f46\u6b7b(\u65e0\u9650)\u9012\u5f52\u5fc5\u5b9a\u51fa\u73b0 StackOverflowError\u3002"},{"title":"\u300a100 Java Mistakes and How to Avoid Them\u300b\u7b14\u8bb0 3","link":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-3\/","pubDate":"Thu, 28 Dec 2023 00:56:44 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-3\/","description":"\n\u672c\u4e66\u7684\u9605\u8bfb\u53c8\u6401\u7f6e\u4e86\u8bb8\u4e45\uff0c\u867d\u7136\u611f\u89c9 Manning \u51fa\u7248\u793e\u7684\u8fd9\u4e00 <code>100 Mistakes<\/code> \u7cfb\u5217\u4ece\u4e66\u7684\u8d28\u91cf\u4e0d\u662f\u90a3\u4e48\u7684\u9ad8\uff0c\u4f46\u5f00\u4e86\u5934\u8fd8\u662f\u7ee7\u7eed\u4ece\u672c\u4e66 40% \u7684\u4f4d\u7f6e\u5f80\u4e0b\u3002<\/p>\n<br\/>\n\u5f00\u59cb\u8981\u8bb2\u8ff0\u5230\u5f02\u5e38\u4e86\uff0c\u5f02\u5e38\u8fd8\u662f\u6709\u5fc5\u8981\u8ba4\u771f\u5bf9\u5f85\u7684\uff0c\u6bd4\u5982<br\/><br\/>\n<ol>\n<li>Java \u4e2d\u5f88\u5bb9\u6613\u88ab CheckedException \u5f04\u5f97\u4ee3\u7801\u4e0d\u6574\u6d01<\/li>\n<li>\u7f3a\u5c11\u5fc5\u8981\u7684\u53c2\u6570\u68c0\u67e5\uff0c\u4e0d\u820d\u5f97\u629b\u51fa\u5f02\u5e38\uff0c\u89c6\u5f02\u5e38\u4e3a Bug<\/li>\n<li>\u4e0d\u660e\u786e\u51fa\u73b0\u5f02\u5e38\u65f6\u540e\u7eed\u5982\u4f55\u5904\u7406\uff0c<\/li>\n<li>\u6216\u8005\u662f\u6355\u83b7\u800c\u9690\u85cf\u4e86\u5f02\u5e38\u81f4\u4f7f\u5b9a\u4f4d\u9519\u8bef\u53d8\u5f97\u66f4\u96be\u3002<\/li>\n<\/ol><br\/>\nJava \u7684\u4e3b\u8981\u5f02\u5e38\u5927\u5206\u7c7b\u662f<br\/>\n<blockquote>\nThrowable<br \/>\n\u251c\u2500\u2500 Error<br \/>\n\u2514\u2500\u2500 Exception<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 RuntimeException\n<\/blockquote>\nNullPointerException, \u8fd9\u6050\u6015\u662f\u4e00\u4e2a\u6700\u5e38\u89c1\u7684\u5f02\u5e38\uff0cJava \u5bf9\u4e00\u4e2a\u5bf9\u8c61\u662f\u5426\u80fd\u4e3a null \u503c\u6ca1\u4ec0\u4e48\u7ea6\u675f\uff0c\u751a\u81f3\u7528 null \u6765\u8868\u793a\u4e1a\u52a1\u4e0a\u7684\u7a7a\u3002\u6bd4\u5982\u8bf4\u65b9\u6cd5\u7684\u53c2\u6570\u4e0e\u8fd4\u56de\u503c\uff0cJava \u90fd\u53ef\u4ee5\u662f null \u503c\uff0c\u800c\u5728 Kotlin \u4e2d\u975e\u660e\u786e\u53ef\u4e3a null \u7684\u65f6\u4e0d\u80fd\u4e3a null"},{"title":"\u7406\u89e3 JUnit, JaCoCo \u5230 SonarQube \u7684\u8fc7\u7a0b\u53ca Maven \u914d\u7f6e","link":"https:\/\/yanbin.blog\/junit-jacoco-sonarqube-maven\/","pubDate":"Wed, 22 Nov 2023 00:09:58 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-jacoco-sonarqube-maven\/","description":"\nJava \u9879\u76ee\u9700\u8981\u4ea7\u751f\u5355\u5143\u6d4b\u8bd5\u53ca\u4ee3\u7801\u8986\u76d6\u7387\u7684\u8bdd\u4e00\u76f4\u90fd\u662f\u8d70\u7684 JUnit \u5355\u5143\u6d4b\u8bd5\uff0cJaCoCo \u57fa\u4e8e\u6d4b\u8bd5\u4ea7\u751f\u6d4b\u8bd5\u8986\u76d6\u7387\uff0c\u7136\u540e\u9001\u5230 SonarQube \u53bb\u5c55\u793a\u8fd9\u6761\u8def\u5b50\u3002\u5f53\u7136 SonarQube \u8fd8\u53ef\u4ee5\u5e2e\u6211\u4eec\u8fdb\u884c\u4ee3\u7801\u7684\u9759\u6001\u5206\u6790\u3002\u4f46\u5bf9\u5176\u4e2d\u7684\u5177\u4f53\u4f7f\u7528\u53ca\u8fc7\u7a0b\u77e5\u6653\u7684\u5e76\u4e0d\u6df1\uff0c\u57fa\u672c\u5c31\u662f\u5728 pom.xml \u4e2d\u4f9d\u846b\u82a6\u753b\u74e2\u3002\u672c\u6587\u7a0d\u52a0\u6df1\u5165\u7684\u7406\u89e3\u6bcf\u4e00\u6b65\u7684\u529f\u6548\u4e0e\u914d\u7f6e\uff0c\u4ee5 Maven \u7ba1\u7406\u7684 Java \u9879\u76ee\u4e3a\u4f8b\uff0cJUnit \u91c7\u7528\u662f\u4f17\u591a\u65e7\u9879\u76ee\u4ecd\u7136\u65e0\u6cd5\u6446\u8131\u7684 JUnit 4\u3002<br\/><br\/>\n\u793a\u4f8b\u9879\u76ee\u540d\u79f0\u4e3a JaCoCoSonar, \u521b\u5efa\u4e00\u4e2a Calc \u7c7b\uff0c\u5176\u4e2d\u6709 int add(int op1, int op2) \u65b9\u6cd5\uff0c\u4e3a\u5176\u5199\u4e00\u4e2a\u5355\u5143\u6d4b\u8bd5 CalcTest<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">CalcTest<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">testAdd<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Assert<\/span><span class=\"p\">.<\/span><span class=\"na\">assertEquals<\/span><span class=\"p\">(<\/span><span class=\"n\">3<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">Calc<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">2<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n<h3>\u5355\u5143\u6d4b\u8bd5\u5b9e\u9645\u662f\u88ab maven-surefire-plugin \u63d2\u4ef6\u6267\u884c\u7684<\/h3>\n\u73b0\u5728\u5f00\u59cb\u7b2c\u4e00\u6b65\uff0c\u6267\u884c <code>mvn test<\/code> \u770b\u4f1a\u53d1\u751f\u4ec0\u4e48\uff0c\u6267\u884c\u8fc7\u7a0b\u4e2d\u63a7\u5236\u53f0\u663e\u793a"},{"title":"\u300a100 Java Mistakes and How to Avoid Them\u300b\u7b14\u8bb0 2","link":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-2\/","pubDate":"Wed, 25 Oct 2023 15:59:21 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-2\/","description":"\n\u7ee7\u7eed\u9605\u8bfb\u672c\u4e66\uff0c\u7f16\u7a0b\u8bed\u8a00\u5904\u7406\u6570\u503c\u90fd\u6709\u53ef\u80fd\u51fa\u73b0\u95ee\u9898\uff0c\u5982\u6ea2\u51fa\uff0c\u6574\u6570\u7684\u6700\u5927\u6700\u5c0f\u503c\u4e0d\u5bf9\u79f0\uff0cDouble.NaN \u7b49\u3002<\/p>\n<br\/>\n\u7531\u4e8e Java \u5b66\u4e86 C\uff0c\u4e5f\u7528 0 \u5f00\u59cb\u7684\u6570\u5b57\u6765\u8868\u793a 8 \u8fdb\u5236\u6570\uff0c\u5982 037, 010 \u5206\u522b\u662f\u5341\u8fdb\u5236\u7684 31 \u548c 8\uff0c\u8fd9\u4e0e\u73b0\u5b9e\u4e0d\u76f8\u7b26\u3002\u56e0\u4e3a\u5982\u679c\u4f60\u5728\u7eb8\u4e0a\u5199\u4e0b 037, 010, \u51e0\u4e4e\u6240\u6709\u4eba(\u9664\u4e86\u67d0\u4e9b\u7a0b\u5e8f\u5458)\u90fd\u4f1a\u8ba4\u4e3a\u5b83\u4eec\u5c31\u662f\u5341\u8fdb\u5236\u7684 37 \u548c 10\u3002\u4f46\u662f Java \u8868\u793a 2 \u8fdb\u5236, 16 \u8fdb\u5236\u7684\u65b9\u5f0f\u6ca1\u6709\u95ee\u9898\u7684\uff0c\u5982 0b10, 0x37\u3002IntelliJ IDEA \u770b\u5230\u4f7f\u7528 0 \u5f00\u5934\u7684 8 \u8fdb\u5236\u6570\u4f1a\u4e0d\u5efa\u8bae\u90a3\u4e48\u4f7f\u7528. 8 \u8fdb\u5236\u6570\u5b57\u7684\u8303\u56f4\u662f 0~8, \u6240\u4ee5 09 \u662f\u9519\u8bef\u7684, \u4f46\u662f Java \u7f16\u8bd1\u5668\u4f3c\u4e4e\u5bf9\u6b64\u5f88\u964c\u751f.<br\/><br\/>\nint a = 09;<br\/><br\/>\nIntelliJ IDEA \u4f1a\u63d0\u793a <code>Integer number too large<\/code>, \u7f16\u8bd1\u5668\u63d0\u793a\u8bf4 <code>java: ';' expected<\/code>, \u6709\u70b9\u9a74\u5507\u4e0d\u5bf9\u9a6c\u5634.<br\/><br\/>\n\u73b0\u5728\u51e0\u4e4e\u6ca1\u6709\u5fc5\u8981\u4f7f\u7528 0 \u5f00\u59cb\u7684 8 \u8fdb\u5236\u6570\u7684\u65b9\u5f0f, \u6216\u8bb8\u8fd8\u6709\u7528\u7684\u5c31\u662f\u8868\u793a Unix \u4e0b\u6587\u4ef6\u6743\u9650, \u5982<br\/><br\/>\nint fileMode = 0644<br\/><br\/>\n\u6240\u4ee5\u4efb\u4f55\u65f6\u5019\u770b\u5230 0 \u5f00\u5934\u7684\u6570\u5b57\u90fd\u5fc5\u987b\u4ed4\u7ec6\u68c0\u89c6, \u57fa\u672c\u53ef\u4ee5\u7981\u6b62\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f"},{"title":"\u300a100 Java Mistakes and How to Avoid Them\u300b\u7b14\u8bb0 1","link":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-1\/","pubDate":"Sun, 17 Sep 2023 23:46:46 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/100-java-mistakes-and-how-to-avoid-them-notes-1\/","description":"\n\u8fd9\u51e0\u65e5\u5728\u9605\u8bfb Manning \u51fa\u7248\u793e\u7684 \u300a100 Java Mistakes and How to Avoid Them\u300b, \u5176\u4e2d\u5217\u4e3e\u7684\u786e\u5b9e\u662f\u4e00\u4e9b\u5bb9\u6613\u5e26\u5165\u5230\u4ee3\u7801\u4e2d\u7684\u9519\u8bef\uff0c\u4e0d\u5c11\u8fd8\u662f\u901a\u8fc7\u4ee3\u7801 Review \u6216\u5355\u5143\u6d4b\u8bd5\u5f88\u96be\u53d1\u73b0\u7684\u95ee\u9898\u3002\u4e5f\u6709\u4e9b\u770b\u4f3c\u5f88\u5f31\u667a\uff0c\u5374\u53ef\u80fd\u662f\u9690\u533f\u8bb8\u4e45\u7684\u5b9a\u65f6\u70b8\u5f39\uff0c\u53ea\u7b49\u67d0\u4e00\u7279\u5b9a\u6761\u4ef6\u51fa\u73b0\u65f6\u5373\u7206\u3002<\/p>\n<br\/>\n\u9605\u8bfb\u7684\u540c\u65f6\u7b80\u5355\u7684\u4f5c\u4e86\u7b14\u8bb0\u53ca\u5c11\u8bb8\u8054\u60f3\uff0c\u6240\u4ee5\u5185\u5bb9\u6709\u4e9b\u6742\u4e71\u65e0\u6761\u7406\u3002\u6700\u524d\u9762\u4ecb\u7ecd\u4e86\u4e00\u4e9b\u9759\u6001\u4ee3\u7801\u5206\u6790\u5de5\u5177\uff0c\u4e5f\u6709\u4e24\u4e2a\u52a8\u6001\u5206\u6790\u5de5\u5177\u3002\u672c\u4e66\u76ee\u524d\u8fd8\u662f Manning \u7684 MEAP \u4f53\u9a8c\u7248\uff0c\u672a\u6b63\u5f0f\u53d1\u552e\u3002\u4e00\u5171\u8bb2\u4e86 100 \u4e2a\u5e38\u89c1\u9519\u8bef\u5982\u4f55\u907f\u514d(\u4f8b\u5982\uff0c\u600e\u4e48\u7528\u6700\u65b0 Java(Java 9 -- Java 21) \u8bed\u6cd5, API \u6765\u6539\u8fdb)\uff0c\u4ee5\u53ca\u7528\u9759\u6001\u5206\u6790\u5de5\u5177\uff0c\u5355\u5143\u6d4b\u8bd5\u53ca\u65e9\u53d1\u73b0\u3002<br\/><br\/>\n\u8fd9\u662f\u8bfb\u5b8c\u4e86 1\/4 \u6570\u91cf\u7684\u8bb0\u5f55\uff0c\u7b14\u8bb0\u5f00\u59cb"},{"title":"Lombok @With \u7684\u7eaf\u5f0a\u7aef\u53ca\u5982\u4f55\u907f\u514d","link":"https:\/\/yanbin.blog\/lombok-with-evil-and-how-avoid\/","pubDate":"Sun, 10 Sep 2023 11:52:38 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/lombok-with-evil-and-how-avoid\/","description":"\n\u7531\u4e8e\u662f\u7b2c\u4e00\u7bc7\u5199\u5173\u4e8e Lombok \u7684\u65e5\u5fd7\uff0c\u6240\u4ee5\u6709\u4e9b\u4e0d\u60c5\u613f\u53bb\u5f00\u95e8\u89c1\u5c71\u76f4\u63a5\u89e6\u53ca @With, \u800c\u8981\u5148\u63d0\u4e00\u63d0\u672c\u4eba\u5bf9 Lombok \u7684\u63a5\u89e6\u8fc7\u7a0b\u3002<\/p>\n<br\/>\n\u4e24\u4e09\u5e74\u4e4b\u524d\u5199 Java \u4ee3\u7801\u4e00\u76f4\u90fd\u662f\u5168\u624b\u5de5\u6253\u9020\u3002\u4e00\u4e2a\u6570\u636e\u7c7b\uff0c\u6240\u6709\u5fc5\u987b\u7684 setter\/getter, toString, hashcode() \u7b49\u5168\u4f53\u73b0\u5728\u6e90\u4ee3\u7801\u4e2d\uff0c\u5f53\u7136\u662f\u5728 IDE \u4e2d\u81ea\u52a8\u751f\u6210\u7684\u3002\u542c\u8bf4\u8fc7 Lombok\uff0c\u4f46\u89c9\u5f97\u5b83\u7528\u4e86\u4f1a\u5f71\u54cd\u5230\u5bf9\u6e90\u4ee3\u7801\u7684\u9605\u8bfb\uff0c\u56e0\u4e3a\u9020\u6210\u4ee3\u7801\u7684\u884c\u4e3a\u4e0e\u6e90\u4ee3\u7801\u6240\u5c55\u793a\u7684\u4e0d\u4e00\u81f4\uff0c\u8fd8\u53ef\u80fd\u4f9d\u8d56\u4e8e\u7279\u5b9a\u7684 IDE \u6216\u6784\u5efa\u5de5\u5177\u63d2\u4ef6\uff0c\u6240\u4ee5\u4e00\u76f4\u672a\u771f\u6b63\u5e94\u7528\u3002<br\/><br\/>\n\u7136\u800c\u73b0\u4ee3\u8bed\u8a00\u4e00\u76f4\u5728\u907f\u514d\u4e0d\u65ad\u4e66\u5199\u8c61 JavaBean \u91cc\u90a3\u4e00\u5927\u7247\u6837\u672c\u4ee3\u7801\uff0c\u540c\u65f6\u89e3\u51b3\u8bd5\u56fe\u63d0\u9ad8\u8986\u76d6\u7387\u5199\u51fa\u6beb\u65e0\u610f\u4e49\u5355\u5143\u6d4b\u8bd5\u7684\u70e6\u607c\u3002\u6bd4\u5982 Scala \u53d1\u5c55\u51fa\u4e86 case class, Kotlin \u7684 data class, Python \u7684 @dataclass\uff0c\u8fd8\u6709 JDK 14 \u5f15\u5165\u7684\u53ca\u81f3 JDK 16 \u8f6c\u6b63\u7684 \u00a0record, \u90fd\u662f\u4e3a\u4e86\u81ea\u52a8\u751f\u6210 Java \u7c7b\u7684 setter\/getter\/toSring\/hashcode\/equals \u7b49\u65b9\u6cd5\u3002 \u6240\u4ee5\u6e90\u4ee3\u7801\u4e2d\u770b\u4e0d\u5230\u5b9e\u9645\u53ef\u8c03\u7528\u65b9\u6cd5\u4e0d\u8be5\u518d\u662f\u95ee\u9898\uff0c\u51b5\u4e14\u5728 JDK 5 \u52a0\u5165\u7684 enum \u7c7b\u578b\u672c\u8d28\u4e0a\u4e5f\u662f\u5728\u6e90\u4ee3\u7801\u7684\u80cc\u540e\u751f\u6210\u4e86\u4e00\u7cfb\u5217\u7684\u65b9\u6cd5\u548c\u7c7b\u578b\u58f0\u660e\u7684\u3002"},{"title":"postgres in (?,?) \u548c =any(?) \u7528\u6cd5\/\u6027\u80fd\u5bf9\u6bd4","link":"https:\/\/yanbin.blog\/postgres-in-vs-any-comparison\/","pubDate":"Wed, 09 Aug 2023 11:29:20 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/postgres-in-vs-any-comparison\/","description":"\n<p>\u521a\u521a\u56de\u987e\u4e86\u4e00\u4e0b <a href=\"https:\/\/yanbin.blog\/jdbc-sql-server-pass-list-parameter\/\">JDBC \u64cd\u4f5c SQL Server \u65f6\u5982\u4f55\u4f20\u5165\u5217\u8868\u53c2\u6570<\/a>\uff0c\u5373\u5982\u4f55\u7ed9 in (?) \u6761\u4ef6\u76f4\u63a5\u4f20\u5165\u4e00\u4e2a\u5217\u8868\u53c2\u6570\uff0c\u7136\u800c\u672c\u8d28\u4e0a\u662f\u4e0d\u652f\u6301\uff0c\u6700\u7ec8\u4e0d\u5f97\u4e0d\u5c55\u5f00\u4e3a in (?, ?,...?) \u9488\u5bf9\u6bcf\u4e2a\u5143\u7d20\u5355\u72ec\u8bbe\u7f6e\u53c2\u6570\uff0c\u4e0d\u5b9a\u957f\u7684\u53c2\u6570\u5bf9\u4e8e\u91cd\u7528\u5df2\u7f16\u8bd1 PreparedStatement \u8bed\u53e5\u7684\u5e2e\u52a9\u4e0d\u5927\u3002<\/p>\n<p>\u90a3\u4e48 JDBC \u64cd\u4f5c PostgreSQL \u662f\u4f55\u79cd\u72b6\u6001\u5462\uff1f\u5c55\u5f00\u4e3a\u591a\u4e2a\u53c2\u6570\u5f53\u7136\u662f\u6709\u6548\u7684\u3002\u7ee7\u7eed\u5c1d\u8bd5 Spring \u63d0\u4f9b\u7684 NamedParameterJdbcTemplate\u00a0\u7684\u64cd\u4f5c\u65b9\u5f0f<\/p>\n<blockquote>\nString query = \"select * from users where id in (:ids)\";<br \/>\nMap&lt;String, Object&gt; parameters = new HashMap&lt;&gt;();<br \/>\nparameters.put(\"ids\", IntStream.rangeClosed(1, 5).boxed().collect(toList()));<br \/>\nList&lt;Map&lt;String, Object&gt;&gt; maps = namedParameterJdbcTemplate.queryForList(query, parameters);\n<\/blockquote>\n<p>\u6267\u884c\u540e\u67e5\u770b\u5230\u5b9e\u9645\u6267\u884c\u7684\u8bed\u53e5\u662f<\/p>\n<blockquote>\nselect * from users where id in (?, ?, ?, ?, ?)\n<\/blockquote>"},{"title":"\u7406\u89e3 Java \u7ebf\u7a0b\u6c60 ThreadPoolExecutor","link":"https:\/\/yanbin.blog\/understand-java-thread-pool-executor\/","pubDate":"Wed, 19 Apr 2023 10:32:10 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-thread-pool-executor\/","description":"\n\u4f7f\u7528 JDK 5 \u7684\u7ebf\u7a0b\u6c60\u5b9e\u73b0\u6709\u8fd1 20 \u5e74\u7684\u65f6\u95f4\u4e86\uff0c\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b\u6c60\u7ecf\u5e38\u662f\u8c03\u7528 Executors \u4e2d\u7684\u5de5\u5382\u65b9\u6cd5\u3002\u4f46\u662f\u6d89\u53ca\u8fc7\u66f4\u7cbe\u7ec6\u7684\u7ebf\u7a0b\u6c60\u7ba1\u7406\u63a7\u5236\u65f6\u4e0d\u5f97\u4e0d\u7528 ThreadPoolExecutor \u7684\u6784\u9020\u65b9\u6cd5\uff0c\u8fd9\u4e5f\u5c31\u662f\u4e3a\u4ec0\u4e48\u6709\u4e9b\u516c\u53f8\u4e0d\u5efa\u8bae\u7528 Executors \u7684\u5de5\u5382\u65b9\u6cd5\u521b\u5efa\u7ebf\u7a0b\u6c60\uff0c\u800c\u5e94\u8be5\u76f4\u63a5\u521b\u5efa ThreadPoolExecutor \u6216 ForkJoinPool \u5b9e\u4f8b\u3002\u00a0<br\/><br\/>\n\u4f8b\u5982\u4ee3\u7801<br\/>\n<blockquote>\nExecutorService threadPool = Executors.newFixedThreadPool(10);\n<\/blockquote>\n\u5b9e\u9645\u4e0a\u8c03\u7528\u7684\u662f<br\/>\n<blockquote>\nnew ThreadPoolExecutor(nThreads, nThreads,<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 0L, TimeUnit.MILLISECONDS,<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 new LinkedBlockingQueue&lt;Runnable&gt;());\n<\/blockquote>\n\u524d\u4e24\u4e2a\u53c2\u6570 corePoolSize \u548c maximumPoolSize \u662f\u4e00\u6837\u7684; OL, TimeUnit.MILLISECONDS \u8868\u793a\u7ebf\u7a0b\u521b\u5efa\u540e\u53ea\u8981\u7ebf\u7a0b\u6c60\u8fd8\u5728\u5c31\u662f\u6c38\u751f\u7684; workQueue \u662f\u4e00\u4e2a\u5927\u5c0f\u4e3a Integer.MAX_VALUE \u7684\u961f\u5217\uff0c \u51e0\u4e4e\u53ef\u4ee5\u65e0\u9650\u63d0\u4ea4\u4efb\u52a1\uff0c\u8017\u5c3d\u5185\u5b58<br\/><br\/>\n\u4e0d\u5efa\u8bae\u7528 Executors \u7684\u5de5\u5382\u65b9\u6cd5\u7684\u539f\u56e0\u5927\u81f4\u6709\u4e8c\uff1a"},{"title":"\u4f53\u9a8c Python FastAPI \u7684\u5e76\u53d1\u80fd\u529b\u53ca\u7ebf, \u8fdb\u7a0b\u6a21\u578b","link":"https:\/\/yanbin.blog\/test-compaire-flask-fastapi-tomcat-concurrency\/","pubDate":"Sun, 19 Mar 2023 00:50:47 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/test-compaire-flask-fastapi-tomcat-concurrency\/","description":"\n\u672c\u6587\u8fdb\u884c\u5b9e\u9645\u6d4b\u8bd5 FastAPI \u7684\u5e76\u53d1\u80fd\u529b\uff0c\u5373\u540c\u65f6\u80fd\u5904\u7406\u591a\u5c11\u4e2a\u8bf7\u6c42\uff0c\u53e6\u5916\u8fd8\u80fd\u63a5\u6536\u591a\u5c11\u8bf7\u6c42\u653e\u5728\u7b49\u5f85\u961f\u5217\u5f53\u4e2d; \u5e76\u627e\u5230\u5982\u4f55\u6539\u53d8\u9ed8\u8ba4\u5e76\u53d1\u6570; \u4ee5\u53ca\u5b83\u662f\u5982\u4f55\u8fd0\u7528\u7ebf\u7a0b\u6216\u8fdb\u7a0b\u6765\u5904\u7406\u8bf7\u6c42\u3002\u6211\u4eec\u53ef\u4ee5\u6b64\u4e0e Flask \u8fdb\u884c\u5bf9\u6bd4\uff0c<a href=\"https:\/\/yanbin.blog\/python-flask-concurrency-thread-process\/\">\u53c2\u8003 Python Flask \u6846\u67b6\u7684\u5e76\u53d1\u80fd\u529b\u53ca\u7ebf,\u8fdb\u7a0b\u6a21\u578b<\/a>\uff0c\u662f\u5426\u771f\u5982\u4f20\u8bf4\u4e2d\u6240\u8bf4\u7684 FastAPI \u6027\u80fd\u6bd4 Flask \u5f3a, FastAPI \u662f\u5426\u5bf9\u5f97\u8d77\u5b83\u90a3\u9053\u95ea\u7535\u7684 Logo\u3002<\/p>\n<br\/>\n\u672c\u6587\u4f7f\u7528 JMeter \u8fdb\u884c\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u673a\u5668\u4e3a MacBook Pro, CPU 6 \u6838\u8d85\u7ebf\u7a0b\uff0c\u5185\u5b58 16 Gb\u3002<br\/><br\/>\n\u5bf9\u4e8e\u6bcf\u4e00\u79cd\u7c7b\u578b Web \u670d\u52a1\u57fa\u672c\u7684\u6d4b\u8bd5\u662f\u6bcf\u79d2\u53d1\u9001 2 \u4e2a\u8bf7\u6c42\uff0c\u8fde\u7eed\u53d1\u9001 1000 \u4e2a\uff0c500 \u79d2\u53d1\u9001\u5b8c\u6240\u6709\u8bf7\u6c42\uff0c\u7a0b\u5e8f\u4e2d API \u65b9\u6cd5\u63a5\u53d7\u5230\u8bf7\u6c42\u540e sleep 800 \u79d2\uff0c\u4fdd\u8bc1\u5728\u5168\u90e8 1000 \u4e2a\u8bf7\u6c42\u9001\u51fa\u4e4b\u524d\u4e00\u76f4\u5360\u7740\u8fde\u63a5\uff0c\u5e76\u6709\u5145\u8db3\u7684\u65f6\u95f4\u5bf9\u8fde\u63a5\u8fdb\u884c\u5206\u6790\u3002\u5728\u6d4b\u8bd5\u6781\u7aef\u5e76\u53d1\u6570\u65f6\uff0c\u7531\u4e8e\u5728 Mac OS X \u5c3d\u7ba1\u8bbe\u7f6e\u4e86 ulimit \u6700\u591a\u4e5f\u53ea\u80fd\u521b\u5efa 4000 \u591a\u4e00\u70b9\u7ebf\u7a0b\uff0c\u6240\u4ee5\u5728\u6a21\u62df\u66f4\u591a\u7528\u6237\u6570\u65f6\uff0cJMeter \u5728\u8fdc\u7a0b Linux(Docker \u6216\u865a\u62df\u673a) \u4e0a\u8fd0\u884c\u6d4b\u8bd5\u7528\u4f8b\u3002<br\/><br\/>\n\u8bf7\u6c42\u7684 URL \u662f http:\/\/localhost:8080\/?id=${count}, \u5e26\u4e00\u4e2a\u81ea\u589e\u5e8f\u5217\u7528\u4ee5\u8bc6\u522b\u4e0d\u540c\u7684\u8bf7\u6c42\uff0c JMeter \u7684 Thread Group \u914d\u7f6e\u4e3a Number of Threads (users): 1000, Ramp-up period (seconds): 500"},{"title":"\u8fdc\u7a0b\u65b9\u5f0f\u6267\u884c JMeter \u6d4b\u8bd5","link":"https:\/\/yanbin.blog\/execute-jmeter-test-remotely\/","pubDate":"Sat, 18 Feb 2023 02:58:56 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/execute-jmeter-test-remotely\/","description":"\nJMeter \u662f\u4e00\u4e2a\u6781\u597d\u7684\u6d4b\u8bd5 Web API \u53ca\u538b\u529b\u6d4b\u8bd5\u7684\u5de5\u5177\uff0c\u53e6\u4e00\u4e2a\u7684\u8bdd\u5c31\u662f Python \u7248\u7684 <a href=\"https:\/\/locust.io\/\">LOCUST<\/a>(\u5b83\u4e5f\u80fd\u8fdc\u7a0b\u8fd0\u884c\u6d4b\u8bd5)\u3002JMeter \u7684\u6d4b\u8bd5\u53ef\u4ee5\u5728\u672c\u5730\u6a21\u62df\u5e76\u53d1\u7528\u6237\uff0c\u90a3\u4e48\u4e3a\u4ec0\u4e48\u8981\u8fdc\u7a0b\u6267\u884c JMeter \u6d4b\u8bd5\u5462\uff1f\u56e0\u4e3a\u4e00\u53f0\u673a\u5668\u80fd\u6a21\u62df\u7684\u5e76\u53d1\u7528\u6237\u6570\u53d7\u9650\uff0c\u4e00\u4e2a\u7528\u6237\u5c31\u662f\u5bf9\u5e94\u7740\u4e00\u4e2a Java \u7ebf\u7a0b\u3002\u6bd4\u5982\u6211\u5728 MacBook Pro(\u5185\u5b58 16Gb) \u4e0a\u65e0\u8bba\u5982\u4f55\u8c03\u6574 <code>ulimit -n<\/code>, <code>ulimit -u<\/code>, \u6216\u7528 JAVA_TOOL_OPTIONS, HEAP, JVM_ARGS \u8bbe\u7f6e <code>-Xmx<\/code>, \u8c03\u5927\u5230 10 G, \u6216\u7528 -Xss \u8c03\u5c0f\u6808\u5927\u5c0f\uff0c\u90fd\u65e0\u6cd5\u8ba9 JMeter \u6a21\u62df\u7684\u7528\u6237\u6570\u8fbe\u5230 5000\u3002<br\/><br\/>\n\u6587\u540e\u6709\u672c\u4eba\u4eb2\u81ea\u6d4b\u8bd5 Java\/Python \u5728 Mac OS X \u548c Linux \u4e0b\u53ef\u521b\u5efa\u591a\u5c11\u4e2a\u7ebf\u7a0b<br\/><br\/>\n\u5982\u679c\u80fd\u591f\u8fdc\u7a0b\u8fd0\u884c JMeter \u7684\u6d4b\u8bd5\u5c31\u80fd\u7a81\u7834\u5355\u673a\u4e0a\u7684\u7ebf\u7a0b\u9650\u5236\u4e86\uff0c\u6bd4\u5982 Mac OS X \u4e0d\u884c\uff0c\u627e\u4e2a Linux \u8fdc\u7a0b\u673a\u5668(\u53ef\u4ee5\u662f\u865a\u62df\u673a)\u6765\u6267\u884c\uff0c\u4e00\u53f0\u673a\u5668\u4e0d\u591f\uff0c\u627e\u591a\u4e2a\u3002\u60f3\u8981\u6a21\u62df 15000 \u4e2a\u5e76\u53d1\u7528\u6237\uff0c\u6d4b\u8bd5\u53ef\u5206\u914d\u5230 5 \u53f0\u673a\u5668\u4e0a\u6267\u884c\uff0c\u6bcf\u4e2a\u8282\u70b9\u8dd1 3000 \u4e2a\u7528\u6237\u5e76\u53d1\u5c31\u884c\uff0c\u6709\u70b9\u64cd\u63a7\u8089\u673a\u7684\u611f\u89c9\u3002"},{"title":"Java \u8c03\u7528\u672c\u5730\u52a8\u6001\u5e93\u7684\u7ec4\u4ef6(javah, JNA, JNR-FFI)","link":"https:\/\/yanbin.blog\/java-jni-libraries\/","pubDate":"Mon, 20 Jun 2022 16:20:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-jni-libraries\/","description":"\n\u8fd8\u662f\u5f88 \u4e45\u5f88\u4e45\u4ee5\u524d\uff0c\u5f53\u521d\u6709 Java \u8c03\u7528\u672c\u5730\u52a8\u6001\u5e93\u9700\u6c42\u7684\u65f6\u5019\uff0c\u5c1d\u8bd5\u8fc7\u7528 javah\/native \u539f\u751f\u7684\u65b9\u5f0f\u5728 Java \u4e2d\u4f7f\u7528\u52a8\u6001\u5e93\uff0c\u518d\u5c31\u662f\u5c0f\u8bd5\u4e86 <a href=\"https:\/\/sourceforge.net\/projects\/jnative\/\">JNative<\/a>\uff0c\u5b83\u8c03\u7528\u52a8\u6001\u5e93\u53ea\u9700 Java \u7aef\u7684\u52a8\u4f5c, \u5b83\u6700\u540e\u7684\u66f4\u65b0\u65e5\u671f\u662f 9 \u5e74\u524d 2013-04-26\uff0c\u57fa\u672c\u662f\u5e94\u8be5\u9009\u62e9\u653e\u5f03\u4e86\u3002<br\/><br\/>\n\u5173\u4e8e JNative \u7684\u4f7f\u7528\u5199\u8fc7\u4e24\u7bc7<br\/>\n<ol>\n<li><a href=\"https:\/\/yanbin.blog\/java-jnative-dll-concise\">Java\u8c03\u7528\u52a8\u6001\u5e93\u6700\u7b80\u4fbf\u65b9\u6cd5\u548c\u6700\u597d\u7528\u7684\u7ec4\u4ef6<\/a><\/li>\n<li><a href=\"https:\/\/yanbin.blog\/jnative-java-pass-struct\">\u4f7f\u7528JNative,\u5728Java\u4e2d\u4f20\u9012\u4e00\u4e2aC\/C++\u7ed3\u6784\u53c2\u6570\u5230\u52a8\u6001\u5e93\u4e2d<\/a><\/li>\n<\/ol>\n<br\/>\n\u5982\u4eca\u60f3\u7ee7\u7eed\u53d1\u6398\u4e0b\u662f\u5426\u6709\u522b\u7684\u66f4\u597d\u7684\u8c03\u7528\u672c\u5730\u5e93\u7684 JNI \u7ec4\u4ef6\uff0c\u627e\u5230\u6709<br\/><br\/>\n<ol>\n<li><a href=\"https:\/\/www.teamdev.com\/jniwrapper\">JNIWrapper<\/a>\uff1a\u5c45\u7136\u662f\u4e00\u4e2a\u6536\u8d39\u7684\uff0c\u800c\u4e14\u4ef7\u683c\u4e0d\u83f2\uff0c\u4e0d\u4f5c\u7ecd<\/li>\n<li><a href=\"https:\/\/github.com\/nativelibs4java\/BridJ\">BridJ<\/a>\uff1a\u4e5f\u662f 7\u00a0\u5e74\u524d\u624d\u6709\u8fc7\u4ee3\u7801\u7684\u66f4\u65b0<\/li>\n<li><a href=\"https:\/\/github.com\/java-native-access\/jna\">JNA<\/a>(Java Native Access): \u4e5f\u5c31\u5b83\u7a0d\u4e3a\u6d3b\u8dc3\u4e00\u70b9\u70b9<\/li>\n<li><a href=\"https:\/\/github.com\/jnr\/jnr-ffi\">JNR-FFI<\/a>\uff1a\u6700\u8fd1\u51e0\u4e2a\u6708\u4e5f\u6709\u66f4\u65b0\uff0c\u4e0d\u77e5\u9053\u4f7f\u7528\u4f53\u9a8c\u5982\u4f55<\/li>\n<\/ol>\n<br\/>"},{"title":"macOS \u5982\u4f55\u5b9a\u4f4d JAVA_HOME","link":"https:\/\/yanbin.blog\/macos-how-to-locatate-java_home\/","pubDate":"Fri, 18 Mar 2022 13:03:31 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/macos-how-to-locatate-java_home\/","description":"\n\u591a\u6570\u7684 Java \u5165\u95e8\u6559\u7a0b\u90fd\u662f\u8981\u6c42\u540c\u65f6\u8bbe\u7f6e JAVA_HOME \u548c PATH(\u5305\u542b $JAVA_HOME\/bin) \u4e24\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u53cd\u6b63\u4e24\u4e2a\u90fd\u6709\u4e86\u5c31\u4fdd\u9669\u3002\u5176\u5b9e\u4e00\u822c\u60c5\u51b5\u4e0b\u7cfb\u7edf\u80fd\u5728 PATH \u4e2d\u627e\u5230 java \u7a0b\u5e8f\u65f6\u5c31\u77e5\u9053 JAVA_HOME, \u57fa\u672c\u4e0a\u53ea\u8981\u914d\u7f6e PATH \u5c31\u884c\uff0c\u800c JAVA_HOME \u73af\u5883\u53d8\u91cf\u662f\u53ef\u9009\u7684\u3002\u4f46\u4e5f\u6709\u4f8b\u5916\uff0c\u6bd4\u5982 TOMCAT \u5c31\u53ef\u80fd\u8981\u6c42\u6709 JAVA_HOME \u73af\u5883\u53d8\u91cf\u3002<br\/><br\/>\n\u5728 macOS \u4e0b\uff0cJAVA_HOME \u4e0e PATH \u7684\u5173\u7cfb\u53c8\u663e\u5f97\u6709\u70b9\u5fae\u5999\u4e86\u3002\u4e00\u4e2a\u65b0\u7684 macOS \u7cfb\u7edf\uff0c\u5b83\u81ea\u5e26\u6709 java \u547d\u4ee4<br\/>\n<blockquote>\n$ which java<br \/>\n\/usr\/bin\/java\n<\/blockquote>\n\u4f60\u8981\u76f4\u63a5\u6267\u884c\u5b83\u7684\u8bdd<br\/>\n<blockquote>\n$ java<br \/>\nThe operation couldn\u2019t be completed. Unable to locate a Java Runtime.<br \/>\nPlease visit http:\/\/www.java.com for information on installing Java.\n<\/blockquote>\n\u6240\u4ee5\u5b83\u5b9e\u9645\u4e0a\u53ea\u662f\u6267\u884c java \u7684\u8f85\u52a9\u5165\u53e3\uff0c\u6ca1\u6709\u5b9e\u9645\u7684 JDK \u6216 JRE \u662f\u6ca1\u7528\u7684\u3002"},{"title":"Java \u76f4\u63a5\u63d2\u5165 CLOB\/BLOB \u6570\u636e\u5230 Oracle \u6570\u636e\u5e93","link":"https:\/\/yanbin.blog\/java-insert-clob-blob-into-oracle-table\/","pubDate":"Tue, 21 Dec 2021 23:15:15 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-insert-clob-blob-into-oracle-table\/","description":"\n\u5411\u6570\u636e\u5e93\u4e2d\u63d2\u5165 CLOB \u6216 BLOB \u7c7b\u578b\u7684\u6570\u636e\uff0cOracle \u603b\u662f\u6bd4\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\u5e93\u64cd\u4f5c\u4e0a\u8981\u9ebb\u70e6\u591a\u4e86\u3002\u5f53\u7136\uff0c\u5bf9\u4e8e\u4e0d\u5927\u4e8e 4K \u957f\u5ea6\u7684 CLOB \u5b57\u7b26\u4e32\u5728 JDBC \u4e2d\u53ef\u7b80\u5355\u7684\u7528 <code>PreparedStatement.setString(idx, \"short string\")<\/code> \u3002\u5982\u679c\u8981\u63d2\u5165\u5927\u4e8e 4K \u957f\u5ea6\u7684\u5185\u5bb9\uff0c\u7f51\u4e0a\u627e\u6765\u7684\u4f8b\u5b50\u8bb8\u591a\u90fd\u662f\u5206\u4e24\u6b65\u8d70<br\/>\n<ol>\n<li>\u5148\u63d2\u5165 EMPTY_CLOB() \u6216 EMPTY_BLOB()<\/li>\n<li>\u7136\u540e SELECT \u539f\u6765\u7684\u8bb0\u5f55 <code>FOR UPDATE<\/code>, \u518d\u66f4\u65b0\u5148\u524d\u63d2\u5165\u7684\u8bb0\u5f55<\/li>\n<\/ol>\n<br\/>\n\u8fd9\u5c31\u5b58\u5728\u4e24\u4e2a\u95ee\u9898\uff0c\u542b CLOB\/BLOB \u7684\u8868\u5fc5\u9700\u8981\u6709\u4e3b\u952e\uff0c\u8fd8\u6709\u56e0\u4e3a <code>FOR UPDATE<\/code> \u7684\u4f7f\u7528\u6211\u4eec\u9700\u8981\u5f00\u542f\u4e8b\u7269\uff0c\u4e0d\u80fd\u91c7\u7528\u81ea\u52a8\u63d0\u4ea4\u3002<br\/><br\/>\n\u5176\u5b9e\u8fd8\u6709\u66f4\u7b80\u5355\u7684\u65b9\u6cd5\u53ef\u76f4\u63a5\u63d2\u5165\u5927\u7684 CLOB\/BLOB \u6570\u636e\uff0c\u8981\u7528\u5230 Oracle JDBC \u9a71\u52a8\u7684 setStringForClob(),\u00a0 CLOB.createTemporary(), \u6216 BLOB.createTemporary() \u65b9\u6cd5\u3002\u6765\u770b\u4e0b\u9762\u7684\u4f8b\u5b50\uff0c\u4f8b\u5b50\u4e2d\u53ea\u6f14\u793a CLOB, \u7c7b\u4f3c\u7684\u65b9\u6cd5\u53ef\u5e94\u7528\u4e8e BLOB, NCLOB\u3002<br\/><br\/>\n\u672c\u6587\u4e2d\u6240\u4f7f\u7528\u7684 Oracle JDBC \u9a71\u52a8\u6bd4\u8f83\u8001\uff0c\u662f ojdbc:ojdbc:5\u3002Docker \u542f\u52a8\u4e00\u4e2a\u672c\u5730\u7684 Oracle 11G\u00a0\u4f5c\u4e3a\u6d4b\u8bd5\u6570\u636e\u5e93<br\/>\n<blockquote>\n$ docker run -d -p 1521:1521 -p 8080:8080 wnameless\/oracle-xe-11g-r2\n<\/blockquote>\n<br\/>\n\u9ed8\u8ba4\u7684 SID \u662f xe, \u6570\u636e\u5e93\u7528\u6237\u540d\u548c\u5bc6\u7801\u5206\u522b\u662f system\/oracle"},{"title":"SpringBoot2 \u5e94\u7528 Axis 1.4 \u5f00\u53d1 WebService","link":"https:\/\/yanbin.blog\/springboot2-develop-axis-1-4-webservice\/","pubDate":"Mon, 15 Nov 2021 21:00:32 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/springboot2-develop-axis-1-4-webservice\/","description":"\n\u6709\u4e86\u524d\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/axis-1-4-develop-webservice\/\">\u5e94\u7528 Axis 1.4 \u5f00\u53d1 WebService<\/a> \u7684\u5bf9 Axis 1 \u8f83\u4e3a\u6df1\u523b\u7684\u7406\u89e3\u540e\uff0c\u73b0\u5728\u6b63\u5f0f\u7ed9\u53e4\u8001\u7684 Axis 1.4\u00a0 \u62c9\u4e2a\u4f34\uff0c\u90a3\u5c31\u662f SpringBoot2\u3002SpringBoot2 + Axis 1 \u7684\u4e3b\u8981\u5de5\u4f5c\u5c31\u662f\u628a Axis \u7684 <a href=\"https:\/\/github.com\/apache\/axis-axis1-java\/blob\/master\/axis-war\/src\/main\/webapp\/WEB-INF\/web.xml\">web.xml<\/a> \u7528 SpringBoot2 \u7684\u65b9\u5f0f\u8fdb\u884c\u8f6c\u8ff0\u3002<br\/><br\/>\n\u5728 SpringBoot \u4e2d\u7528 Axis 1 \u540e\uff0c\u6709\u4e24\u4e2a\u7279\u6027\u4e0d\u518d\u652f\u6301<br\/>\n<ol>\n<li>\u4e0d\u518d\u652f\u6301 jws \u5373\u65f6\u53d1\u5e03 Web Service\uff0c\u4e0d\u80fd\u76f4\u63a5\u642c\u7528 url-pattern *.jws\uff0c\u6ca1\u7ee7\u7eed\u6df1\u7a76\uff0c\u5b9e\u9645\u4e2d\u5e0c\u671b\u8fd9\u4e48\u90e8\u7f72\u7684\u65b9\u5f0f\u7528\u5f97\u8f83\u5c11<\/li>\n<li>\u4e0d\u518d\u652f\u6301 SOAPMonitorService\uff0c\u5b83\u662f\u4e00\u4e2a Java Applet,\u00a0 Java Applet \u5728\u65b0\u7248\u7684 JDK \u4e2d\u5df2\u88ab\u79fb\u9664\uff0c\u65e9\u5c31\u4e0d\u63a8\u8350\u4f7f\u7528\u4e86<\/li>\n<\/ol>\n<br\/>\n\u5728 SpringBoot \u4e2d\u914d\u7f6e Servlet \u6216 ServletListener \u6709\u4e24\u79cd\u65b9\u5f0f<br\/>\n<ol>\n<li>ServletRegistrationBean\/ServletListenerRegistrationBean<\/li>\n<li>@WebServlet\/@WebListener<\/li>\n<\/ol>\n<br\/>\nspring-boot-starter \u5f15\u5165\u4e86 log4j-to-slf4j, jul-to-slf4j, \u6240\u4ee5\u4e0d\u9700\u8981\u914d\u7f6e log4j.properties, \u9700\u8981\u7684\u8bdd\u53ef\u7528 logback.xml \u914d\u7f6e\u65e5\u5fd7\u8f93\u51fa\u3002"},{"title":"\u5e94\u7528 Axis 1.4 \u5f00\u53d1 WebService","link":"https:\/\/yanbin.blog\/axis-1-4-develop-webservice\/","pubDate":"Sun, 14 Nov 2021 18:03:18 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/axis-1-4-develop-webservice\/","description":"\nAxis 1 \u7684\u6700\u540e\u4e00\u4e2a\u7248\u672c\u8fd8\u662f 2006-04-22 \u53d1\u5e03\u7684 1.4 Final \u7248\uff0c\u5f53\u524d\u7684\u7248\u672c\u662f\u00a0 Axis 2\uff0c \u5373\u4e8e\u00a0 2021-08-01 \u53d1\u5e03\u7684\u00a0 Axis v1.8.0 \u7248\u672c\u3002\u60f3\u60f3\u5728\u00a0 2006 \u5e74 4 \u6708\u4efd\uff0c\u8f6f\u4ef6\u5f00\u53d1\u662f\u4e00\u79cd\u4ec0\u4e48\u6837\u7684\u666f\u8c61\uff0cJDK 5 \u4e8e 2004-09-30 \u53d1\u5e03\uff0c\u540c\u5e74 12 \u6708 12 \u65e5 JDK 6 \u624d\u51fa\u6765, Spring \u8fd8\u662f 1.x \u7684\u7248\u672c\u3002\u90a3\u65f6\u5019\u4ecd\u662f EJB \u5174\u65fa\u7684\u5e74\u4ee3\uff0c\u5fae\u670d\u52a1\u6982\u5ff5\u7684\u51fa\u73b0\u8fd8\u6709\u7b49\u597d\u591a\u5e74\u3002<br\/><br\/>\n\u90a3\u4e3a\u4ec0\u4e48\u8fd8\u8981\u5b66\u4e60 Axis 1.4 \u5462\uff1f\u76ee\u7684\u5c31\u662f\u4e3a\u4e86\u653e\u5f03\uff0c\u5148\u524d\u7684 Axis 1.4 \u7684\u9879\u76ee\u4e0d\u7a0d\u52a0\u7406\u89e3\uff0c\u600e\u4e48\u80fd\u987a\u5229\u7684\u8fc7\u5ea6\u5230 Axis 2 \u5462\uff1f\u8981\u8bf4\u773c\u4e0b\u66f4\u597d\u7684\u7528\u6765\u5f00\u53d1 SOAP WebService \u7684\u5e93\u5e94\u8be5\u9996\u9009 <a href=\"http:\/\/cxf.apache.org\/\">Apache CXF<\/a>\u3002\u672c\u6765\u62df\u5b9a\u7684\u6587\u7ae0\u6807\u9898\u7684 Springboot2 \u5e94\u7528 Axis 1.4 \u5f00\u53d1 WebService, \u4f46\u4e00\u53d1\u6325\u5c31\u7528\u529b\u8fc7\u731b\uff0c\u53ea\u5f97\u4e0b\u56de\u53e6\u7acb\u65b0\u7bc7\u6765\u518d\u52a0\u4e0a Springboot2 \u4e86\uff0c\u56e0\u6b64\u672c\u7bc7\u5c31\u662f\u4e3a SpringBoot2 \u4e0e Axis 1 \u7684\u7ed3\u5408\u94fa\u8def\u7684\u3002<br\/><br\/>\n\u4ec0\u4e48\u662f <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOAP\">SOAP<\/a>\uff0cSimple Object Access Protocol, \u7b80\u5355\u5bf9\u8c61\u8bbf\u95ee\u534f\u8bae\uff0c\u4e00\u79cd XML-RPC \u7684\u5b9e\u73b0\u3002\u8c01\u90fd\u6562\u53f7\u79f0\u7b80\u5355\uff0c\u4e0e\u5f53\u4eca\u7684 REST API \u4e00\u5bf9\u7167\uff0c\u4efb\u4f55\u4eba\u90fd\u4f1a\u89c9\u5f97 SOAP \u662f\u628a\u4e00\u4e2a\u8fdc\u7a0b\u8c03\u7528\u641e\u5f97\u65e0\u6bd4\u7684\u590d\u6742\u3002SOAP \u6709 1.1 \u548c 1.2 \u4e24\u4e2a\u7248\u672c\uff0c\u73b0\u5728\u63d0 SOAP \u57fa\u672c\u5c31\u662f SOAP 1.2 \u7684\u4ee3\u540d\u8bcd\u3002\u53e6\u5916\uff0cSOAP 1.2 \u5f00\u59cb\u4e5f\u627f\u8ba4\u4e0d\u7b80\u5355\uff0c\u4e0d\u518d\u660e\u786e\u4e3a Simple Object Access Protocol \u7684\u7f29\u5199\uff0c\u800c\u53eb\u505a Messaging Framework (Second Edition)\u3002"},{"title":"mvn \u547d\u4ee4\u4e0a\u4f20\u6587\u4ef6\u5230 Maven \u4ed3\u5e93","link":"https:\/\/yanbin.blog\/mvn-deploy-file-to-maven-repository\/","pubDate":"Sat, 13 Nov 2021 23:51:04 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mvn-deploy-file-to-maven-repository\/","description":"\n\u9488\u5bf9\u4e00\u4e2a Maven \u7684 Java \u9879\u76ee\uff0c\u6211\u4eec\u6267\u884c mvn deploy \u547d\u4ee4\u65f6\u60f3\u8981\u628a\u751f\u6210\u7684 jar \u5305\u4e0a\u4f20\u5230 Maven \u4ed3\u5e93(\u672c\u6587\u5c06\u4f7f\u7528\u79c1\u6709\u7684 Nexus \u4ed3\u5e93)\u4e2d\u53bb\u3002\u6240\u8981\u7528\u5230\u7684\u63d2\u4ef6 <a href=\"http:\/\/maven.apache.org\/plugins\/maven-deploy-plugin\/usage.html\">Maven Deploy Plugin<\/a>\uff0c\u672c\u6587\u5b9e\u9645\u5c31\u662f\u8bb2\u8ff0\u5982\u4f55\u7528\u8be5\u63d2\u4ef6\u4e0a\u4f20 jar \u5305\u5230 Maven\u00a0 \u4ed3\u5e93\uff0c\u66f4\u591a\u7528\u6cd5\u8bf7\u53c2\u8003\u8be5\u63d2\u4ef6\u7684\u5b98\u65b9\u6587\u6863\u3002<br\/><br\/>\n\u672c\u6587\u5173\u952e\u6027\u7684\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6\u662f pom.xml \u548c settings.xml\u3002\u524d\u8005\u914d\u7f6e\u4ed3\u5e93\u7684\u5730\u5740\uff0c\u540e\u8005\u4e2d\u914d\u7f6e\u7528\u6237\u540d\u548c\u5bc6\u7801\u3002\u8981\u786e\u5b9a Maven \u4f7f\u7528\u4e86\u54ea\u4e2a settings.xml\u00a0\u6587\u4ef6\uff0c\u7528 <code>mvn -X<\/code> \u67e5\u770b\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u8f93\u51fa<br\/>\n<blockquote>\n[DEBUG] Reading global settings from \/usr\/local\/Cellar\/maven\/3.8.3\/libexec\/conf\/settings.xml<br \/>\n[DEBUG] Reading user settings from \/Users\/yanbin\/.m2\/settings.xml\n<\/blockquote>\nMaven \u8fd8\u5141\u8bb8\u5728\u6267\u884c mvn \u547d\u4ee4\u65f6\u7528\u00a0 -s \u6216 --settings \u53c2\u6570\u6307\u5b9a settings.xml \u6587\u4ef6\uff0c\u5982 mvn deploy --settings settings.xml<br\/><br\/>\n\u6240\u4ee5\u5bf9\u4e8e settings.xml \u6587\u4ef6\u7684\u4fee\u6539\uff0c\u53ef\u4fee\u6539\u5168\u5c40\u7684\uff0c\u7528\u6237\u7684\u6216\u53c2\u6570 --settings \u6307\u5b9a\u7684\u3002"},{"title":"\u5982\u4f55\u8c03\u8bd5 ECR Docker \u955c\u50cf","link":"https:\/\/yanbin.blog\/how-to-debug-ecr-docker-image\/","pubDate":"Sat, 04 Sep 2021 22:47:02 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/how-to-debug-ecr-docker-image\/","description":"\n<p>\u5e38\u5e38\u56e0\u4e3a\u5728 AWS \u4e0a\u90e8\u7f72\u7684 ECS \u6216 EKS \u670d\u52a1\uff0c\u751a\u81f3\u662f\u4f7f\u7528\u4e86 ECR \u955c\u50cf\u7684 Lambda \u670d\u52a1\u8fd9\u6837\u6216\u90a3\u6837\u7684\u539f\u56e0\u65e0\u6cd5\u542f\u52a8\uff0c\u6216\u5176\u4ed6\u83ab\u540d\u7684\u5f02\u5e38\uff0c\u8fd9\u65f6\u5019\u6700\u597d\u80fd\u76f4\u63a5\u8c03\u8bd5 ECR \u4e0a\u7684 Docker \u955c\u50cf\uff0c\u6bd4\u8c03\u8bd5\u7528\u4e8e\u6253\u5305 Docker \u7684\u6e90\u4ee3\u7801\u66f4\u63a5\u8fd1\u771f\u5b9e\u73af\u5883\u3002<\/p>\n<p>\u8981\u8c03\u8bd5 Docker \u955c\u50cf\u9700\u8981\u5148\u4ece ECR \u4e2d\u4e0b\u8f7d\u5230 AWS \u670d\u52a1\u7528\u7684\u955c\u50cf\uff0c\u4e0b\u9762\u4ee5\u8fd0\u884c Java \u7684 Docker \u4e3a\u4f8b\uff0c\u540c\u65f6\u7528 IntelliJ IDEA \u5173\u8054\u6e90\u4ee3\u7801\u8fdb\u884c\u8fdc\u7a0b\u8c03\u8bd5\u3002<\/p>\n<p>\u4ece ECR \u4e0b\u8f7d Docker \u955c\u50cf\u90e8\u5206\u53ef\u53c2\u8003 <a href=\"https:\/\/yanbin.blog\/push-docker-image-to-amazon-ecr-repository\/\">\u63a8\u9001 Docker \u955c\u50cf\u5230 Amazon ECR \u4ed3\u5e93<\/a>, \u90a3\u7bc7\u6587\u7ae0\u5199\u4f5c\u4e4b\u65f6\u53ef\u80fd\u4e0e\u73b0\u5728\u7565\u6709\u4e0d\u540c\u3002\u5177\u4f53\u9700\u76f4\u63a5\u8fdb\u5230 ECR \u7684\u9875\u9762\uff0c\u5982 https:\/\/console.aws.amazon.com\/ecr\/repositories\/private\/&lt;aws_account_id&gt;\/&lt;ecr_name&gt;?region=&lt;region&gt;\uff0c\u70b9\u51fb <code>View push commands<\/code> \u53ef\u770b\u5230\u7528 AWS CLI \u5982\u4f55\u767b\u9646 ECR\uff0c\u73b0\u5728\u770b\u5230\u7684\u5728 macOS\/Linux \u4e0b\u7684\u547d\u4ee4\u662f(\u5047\u8bbe AWS AccountId \u662f 123456789, region \u662f us-east-1)<\/p>\n<blockquote>\naws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com\n<\/blockquote>\n<p>\u5047\u5982 ECR \u4ed3\u5e93\u540d\u662f test-java, \u90a3\u4e48\u8981\u4e0b\u8f7d tag 1.0.1\u00a0\u7684\u547d\u4ee4\u662f"},{"title":"\u4e3a Java \u6ce8\u518c classpath: \u534f\u8bae\u7528 URL \u8bfb\u53d6\u6587\u4ef6","link":"https:\/\/yanbin.blog\/register-classpath-protocol-for-java\/","pubDate":"Thu, 17 Jun 2021 12:50:16 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/register-classpath-protocol-for-java\/","description":"\n\u672c\u6587\u4e3a Java \u6ce8\u518c classpath\u00a0\u534f\u8bae\u8bfb\u53d6\u6587\u4ef6\u7684\u76ee\u7684\u5c31\u662f\u8981\u8ba9\u4e0b\u9762\u7684\u4ee3\u7801\u80fd\u5de5\u4f5c\u8d77\u6765<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">text<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">IOUtils<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">URL<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;classpath:\/db.properties&#34;<\/span><span class=\"p\">),<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;UTF-8&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">text<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5047\u8bbe\u5728 classpath \u4e0b\u6709\u4e2a\u6587\u4ef6 db.properties, \u6bd4\u5982\u5728 Maven \u9879\u76ee\u7684 src\/main\/resources \u76ee\u5f55\u4e2d\uff0c\u6216\u662f\u5728\u67d0\u4e2a jar \u5305\u7684\u6839\u4f4d\u7f6e\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u6267\u884c\u4e0a\u9762\u7684\u4ee3\u7801\u5c06\u4f1a\u5f97\u5230\u5f02\u5e38<br\/>\n<blockquote>\nException in thread \"main\" java.net.MalformedURLException: unknown protocol: classpath<br \/>\n\u00a0 \u00a0 at java.net.URL.&lt;init&gt;(URL.java:617)<br \/>\n\u00a0 \u00a0 at java.net.URL.&lt;init&gt;(URL.java:507)\n<\/blockquote>\n\u8bf4\u662f\u4e0d\u8ba4\u8bc6\u7684 classpath \u534f\u8bae\u3002<br\/><br\/>\n\u524d\u9762\u4ee3\u7801\u662f\u6709\u5b9e\u9645\u7528\u9014\u7684\uff0c\u6bd4\u5982\u8bf4\u6211\u4eec\u4f7f\u7528 XML \u65f6\u5c31\u80fd\u652f\u6301\u8fdc\u7a0b\u534f\u8bae<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">Document<\/span><span class=\"w\"> <\/span><span class=\"n\">document<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">DocumentBuilderFactory<\/span><span class=\"p\">.<\/span><span class=\"na\">newInstance<\/span><span class=\"p\">().<\/span><span class=\"na\">newDocumentBuilder<\/span><span class=\"p\">()<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">.<\/span><span class=\"na\">parse<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;https:\/\/www.w3schools.com\/xml\/note.xml&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">document<\/span><span class=\"p\">.<\/span><span class=\"na\">getDocumentElement<\/span><span class=\"p\">().<\/span><span class=\"na\">getTagName<\/span><span class=\"p\">());<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"Java 10 ~ 16 \u4e00\u8def\u5411\u524d\u51b2(\u65b0\u7279\u6027\u4e00\u7ba9\u7b50)","link":"https:\/\/yanbin.blog\/java-10-16-new-features\/","pubDate":"Sat, 08 May 2021 00:06:57 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-10-16-new-features\/","description":"\nJava \u4e00\u8def\u7a81\u7a81\u7a81\uff0c \u7248\u672c 16 \u5728 2021-03-16 \u90fd\u53d1\u5e03\u4e86, \u800c\u6211\u4eec\u4e00\u76f4\u788d\u4e8e Java 9 \u7684\u5927\u6539\u8fd8\u5728 Java 8 \u4e0a\u539f\u5730\u8e0f\u6b65, \u4ee5\u5f80\u6bcf\u5f53\u6709\u65b0\u7248\u672c JDK \u53d1\u5e03\u540e\u90fd\u662f\u5f88\u5feb\u5c31\u9a8c\u8bc1\uff0c\u7acb\u9a6c\u5347\u7ea7\u3002<a href=\"https:\/\/www.codejava.net\/java-se\/java-se-versions-history\">Java SE versions history<\/a>) \u5217\u51fa\u4e86\u6240\u6709 Java \u7684\u5386\u53f2\u7248\u672c\u7684\u53d1\u5e03\u65e5\u671f\u3002\u5728\u4eca\u5929(2021-05-04) \u7f51\u7ad9 <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase-downloads.html\">Java SE Downloads<\/a>\u00a0\u4e0a\u76f4\u63a5\u63d0\u4f9b\u4e0b\u8f7d\u7684 Java SE \u7248\u672c\u6709\u4ee5\u4e0b\u4e09<br\/>\n<ol>\n<li>Java SE 16.0.1<\/li>\n<li>Java SE 11.0.11(LTS)<\/li>\n<li>Java SE 8u291<\/li>\n<\/ol>\n<br\/>\n\u4e24\u4e2a LTS(\u957f\u671f\u652f\u6301) \u7248 8 \u548c\u00a0 11\uff0c\u5916\u52a0\u4e00\u4e2a\u76ee\u524d\u6700\u65b0\u7684\u975e\u00a0 LTS \u7248\u672c 16, \u5176\u4ed6\u7684\u7248\u672c\u90fd\u88ab\u5f52\u6863\u5230\u4e86 <a href=\"https:\/\/www.oracle.com\/java\/technologies\/oracle-java-archive-downloads.html\">Java Archive<\/a>. \u67e5\u770b\u4e00\u4e0b <a href=\"https:\/\/www.oracle.com\/java\/technologies\/java-se-support-roadmap.html\">Java \u652f\u6301\u7684 roadmap<\/a>, \u51e0\u4e2a LTS \u7248\u672c\u7684\u670d\u52a1\u652f\u6301\u5e74\u9650<br\/>\n<blockquote>\n\u7248\u672c\u672c\u00a0 \u00a0 \u00a0 \u53d1\u5e03\u65e5\u00a0 \u00a0 \u00a0 \u00a0\u539f\u5b9a\u652f\u6301\u81f3\u00a0 \u00a0 \u00a0 \u5ef6\u671f\u652f\u6301\u81f3<br \/>\nJava 8\u00a0 \u00a0 \u00a0 2014\/3\u00a0 \u00a0 \u00a0 \u00a02022\/3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span style=\"color: #800000;\"><strong>2030\/12<\/strong><\/span><br \/>\nJava 11\u00a0 \u00a0 \u00a02018\/9\u00a0 \u00a0 \u00a0 2023\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 2026\/9<br \/>\nJava 17\u00a0 \u00a0 \u00a02021\/9\u00a0 \u00a0 \u00a0 2026\/9\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 2029\/9\n<\/blockquote>\n\u6ce8\u610f\u5230 Java 8 \u5c06\u6bd4 Java 11 \u548c\u5c06\u6765\u7684 Java 17 \u751f\u547d\u529b\u8fd8\u987d\u5f3a\uff0c\u4e00\u4e0b\u5c31\u89c9\u5f97\u8fd9\u4e48\u4e45\u575a\u5b88\u5728 Java 8 \u7684\u9635\u5730\u4e0a\u4e0d\u5e94\u89c9\u5f97\u6709\u4ec0\u4e48\u597d\u5bb3\u7f9e\u7684\u3002\u773c\u770b\u7740\u4e0b\u4e00\u4e2a LTS \u7248\u672c\u7684 Java 17 \u5c31\u8981\u5728\u4eca\u5e74 9 \u6708\u4efd\u53d1\u5e03\u4e86\uff0cJava 11 \u770b\u6765\u662f\u8981\u9519\u8fc7\u4e86\uff0c\u7b49\u51c6\u5907\u597d\u548c Java 8 \u544a\u522b\u65f6\u8981\u76f4\u63a5\u8df3\u5230 Java 17 \u4e86\u3002"},{"title":"\u63a2\u7d22 Apache, Tomcat, SpringBoot \u5bf9\u8bf7\u6c42\u6570\u636e\u7684\u89e3\u538b\u7f29","link":"https:\/\/yanbin.blog\/apache-tomcat-springboot-decompress-request-body\/","pubDate":"Tue, 04 May 2021 12:21:26 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/apache-tomcat-springboot-decompress-request-body\/","description":"\n\u901a\u5e38\u6211\u4eec\u90fd\u4f1a\u914d\u7f6e Web \u670d\u52a1\u7aef\u5bf9\u54cd\u5e94\u6570\u636e\u8fdb\u884c\u538b\u7f29\uff0c\u5982\u7528 Apache \u7684 mod_deflate \u6a21\u5757\uff0c\u6216\u914d\u7f6e Tomcat connector \u542f\u7528\u538b\u7f29\uff0c\u53c8\u6216\u8005\u662f\u5728 Java Web \u9879\u76ee\u4e2d\u52a0 Web Filter \u6765\u538b\u7f29\u7279\u5b9a\u7684\u54cd\u5e94\u6570\u636e\u3002\u8fd9\u6837\u5ba2\u6237\u7aef\u53d1\u9001 HTTP \u8bf7\u6c42\u65f6\u5728\u5934\u4e2d\u58f0\u660e\u5982 Accept-Encoding: gzip\uff0c\u670d\u52a1\u7aef\u5c31\u53ef\u80fd\u4f1a\u5bf9\u54cd\u5e94\u6570\u636e\u8fdb\u884c\u538b\u7f29\uff0c\u540c\u65f6\u5e26\u4e0a Content-Encoding: gzip \u54cd\u5e94\u5934\u3002<br\/><br\/>\n\u6709\u65f6\u5019 HTTP Post \u7684\u6570\u636e\u592a\u5927\u540c\u6837\u4f1a\u8981\u6c42\u5ba2\u6237\u7aef\u5728\u4f20\u8f93\u6570\u636e\u4e4b\u524d\u5bf9\u8bf7\u6c42\u6570\u636e\u8fdb\u884c\u538b\u7f29\uff0c\u672c\u6587\u4e3b\u8981\u5173\u6ce8\u670d\u52a1\u7aef\u5982\u4f55\u81ea\u52a8\u89e3\u538b\u5ba2\u6237\u7aef\u53d1\u51fa\u7684\u538b\u7f29\u6570\u636e\u3002<br\/><br\/>\n\u5148\u4ee5 Apache2 \u4e3a\u4f8b\uff0c\u4ee5 Ubuntu 20.04 \u4e3a\u4f8b\uff0c\u7528\u547d\u4ee4 <code>apt-get install apache2<\/code> \u5b89\u88c5 Apache 2.4.41, \u5b83\u81ea\u52a8\u542f\u7528\u4e86 <a href=\"https:\/\/httpd.apache.org\/docs\/current\/mod\/mod_deflate.html\">mod_deflate<\/a> \u6a21\u5757\u3002mod_deflate \u6a21\u5757\u7684\u914d\u7f6e\u6587\u4ef6 \/etc\/apache2\/modes-enabled\/deflate.conf\u00a0\u5185\u5bb9\u5982\u4e0b<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-apache\" data-lang=\"apache\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nt\">&lt;IfModule<\/span> <span class=\"s\">mod_deflate.c<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"nt\">&lt;IfModule<\/span> <span class=\"s\">mod_filter.c<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"nb\">AddOutputFilterByType<\/span> DEFLATE text\/html text\/plain text\/xml text\/css\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> <span class=\"nb\">AddOutputFilterByType<\/span> DEFLATE application\/x-javascript application\/javascript application\/ecmascript\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> <span class=\"nb\">AddOutputFilterByType<\/span> DEFLATE application\/rss+xml\n<\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"> <span class=\"nb\">AddOutputFilterByType<\/span> DEFLATE application\/xml\n<\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/IfModule&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/IfModule&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5b83\u8868\u793a\u53ea\u5bf9\u4ee5\u4e0a\u7279\u5b9a\u7684\u54cd\u5e94\u6570\u636e\u7c7b\u578b\u8fdb\u884c\u538b\u7f29\uff0c\u4e0b\u9762\u6765\u6d4b\u8bd5\u4e0b\u5bf9 html\u00a0\u5185\u5bb9\u7684\u538b\u7f29"},{"title":"\u4f7f\u7528 Java \u8f6c\u6362 Apache Avro \u4e3a Parquet \u6570\u636e\u683c\u5f0f(\u4f9d\u8d56\u66f4\u65b0)","link":"https:\/\/yanbin.blog\/convert-apache-avro-to-parquet-in-java-use-hadoop-common-instead-of-hadoop-core\/","pubDate":"Thu, 25 Feb 2021 21:44:05 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/convert-apache-avro-to-parquet-in-java-use-hadoop-common-instead-of-hadoop-core\/","description":"\n\u5728\u4e0a\u7bc7 <a href=\"https:\/\/yanbin.blog\/convert-apache-avro-to-parquet-format-in-java\/\">\u4f7f\u7528 Java \u8f6c\u6362 Apache Avro \u4e3a Parquet \u6570\u636e\u683c\u5f0f<\/a>\n\u5b9e\u73b0\u628a Avro \u6570\u636e\u8f6c\u6362\u4e3a Parquet \u6587\u4ef6\u6216\u5185\u5b58\u5b57\u8282\u6570\u7ec4\uff0c\u5e76\u652f\u6301 LogicalType\u3002\u5176\u4e2d\u4f7f\u7528\u5230\u4e86 hadoop-core \u4f9d\u8d56\uff0c\u6ce8\u610f\u5230\u5b83\u4f20\u9012\u7684\u4f9d\u8d56\u90fd\u975e\u5e38\u8001\u65e7\uff0c\n\u5230\u5b98\u65b9 Maven\u00a0\u4ed3\u5e93\u4e00\u770b\u624d\u53d1\u73b0\u8fd8\u4e0d\u662f\u4e00\u822c\u7684\u8001<\/p>\n<br\/>\n<a href=\"https:\/\/yanbin.blog\/posts\/2021\/convert-apache-avro-to-parquet-in-java-use-hadoop-common-instead-of-hadoop-core\/avro-to-parquet-1-1.png\" target=\"_blank\" rel=\"noreferrer\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2021\/convert-apache-avro-to-parquet-in-java-use-hadoop-common-instead-of-hadoop-core\/avro-to-parquet-1-1-800x133.png\"\nwidth=\"596px\"\n\/>\n<\/a>\n\u957f\u65f6\u95f4\u65e0\u4eba\u95ee\u6d25\u7684\u9879\u76ee\uff0c\u90a3\u4e00\u5b9a\u6709\u5b83\u7684\u66ff\u4ee3\u54c1\u3002\u5bf9\u5566\uff0c\u636e\u8bf4 hadoop-core \u5728 2009 \u5e74 7 \u6708\u4efd\u66f4\u540d\u4e3a hadoop-common \u4e86\uff0c\u6ca1\u627e\u5230\u5b98\u65b9\u8bf4\u660e\uff0c\u53ea\u770b\u5230 StackOverflow \u7684\n<a href=\"https:\/\/stackoverflow.com\/questions\/28856096\/differences-between-hadoop-common-hadoop-core-and-hadoop-client#:~:text=Hadoop-core%20is%20the%20same,logging%20and%20codecs%20for%20example.\">\nDifferences between Hadoop-coomon, Hadoop-core and Hadoop-client?<\/a> \u662f\u8fd9\u4e48\u8bf4\u7684\u3002 \u5e94\u8be5\u662f\u8fd9\u4e48\u4e2a\u8bf4\u6cd5\uff0c\u4e0d\u7136\u4e3a\u4f55 hadoop-core \u4e00\u76f4\u505c\u7559\u5728\u00a0 1.2.1 \u7684\u7248\u672c\uff0c\n\u800c\u4e14\u539f\u6765 hadoop-core \u4e2d\u7684\u7c7b\u5728 hadoop-common \u4e2d\u53ef\u4ee5\u627e\u5230\uff0c\u5982\u7c7b org.apache.hadoop.fs.Path\u3002\u4e0d\u8fc7\u5728 hadoop-core-1.2.1 \u4e2d\u7684 <code>fs\/s3<\/code> \u5305\u4e0d\u89c1\uff0c\n\u8fd9\u4e48\u91cd\u8981\u7684 s3 \u6587\u4ef6\u7cfb\u7edf\u6ca1\u4e86\u3002"},{"title":"Mockito 3.4.0 \u5f00\u59cb\u53ef Mock \u9759\u6001\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/mockito-3-4-0-mock-static-method\/","pubDate":"Wed, 03 Feb 2021 13:36:23 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-3-4-0-mock-static-method\/","description":"\nJava \u5355\u5143\u6d4b\u8bd5\u6700\u8d81\u624b\u7684 Mock \u7ec4\u4ef6\u5f53\u5c5e Mockito\uff0c\u867d\u7136\u5b83\u6700\u521d\u662f\u57fa\u4e8e\u7ee7\u627f\u6765\u5b9e\u73b0 Mock \u7684\uff0c\u6240\u4ee5\u5bf9\u79c1\u6709\u65b9\u6cd5\uff0c\u79c1\u6709\u5c5e\u6027\uff0c\u9759\u6001\u65b9\u6cd5\uff0c\nfinal \u7c7b\uff0cfinal \u65b9\u6cd5\uff0c\u6784\u9020\u51fd\u6570\u65e0\u80fd\u4e3a\u529b\u3002\u4e8e\u662f\u6709\u65f6\u4e0d\u5f97\u4e0d\u5f15\u5165 JMockit \u6216 PowerMockit \u6765\u8f85\u52a9\u3002\u4e0d\u8fc7\u73b0\u5728\u7684 Mockito \u529f\u529b\u6709\u6240\u589e\u5f3a\u3002<br\/><br\/>\n\u9996\u5148\u662f Mockito 2.1.0 \u5f00\u59cb\u53ef\u4ee5 Mock final \u7c7b\u548c final \u65b9\u6cd5\uff0c\u8981\u5728 classpath \u4e0b\u521b\u5efa\u4e2a\u6587\u4ef6\n<code>mockito-extensions\/org.mockito.plugins.MockMaker<\/code>, \u5185\u5bb9\u4e3a <code>mock-maker-inline<\/code>\u3002\n\u4e4b\u524d\u5199\u8fc7\u4e00\u7bc7\u4ecb\u7ecd\uff1a<a href=\"https:\/\/yanbin.blog\/mockito-mock-final-class-final-method\/\">Mockto \u4e5f\u80fd Mock final \u7c7b\u548c final \u65b9\u6cd5\u4e86<\/a>\uff0c\u5176\u4e2d\u4e5f\u63a2\u7d22\u4e86\u5b83\u7684\u5b9e\u73b0\u7ec6\u8282\uff0c\u4f7f\u7528\u5230\u4e86 ByteBuddy \u4fee\u6539\u5b57\u8282\u7801\u3002<br\/><br\/>\n\u4ece <a href=\"https:\/\/github.com\/mockito\/mockito\/blob\/caac3535daaeb9370cd25f23694d3d059a72d8d9\/doc\/release-notes\/official.md#340\">Mockito 3.4.0<\/a>\n\u901a\u8fc7\u7c7b\u4f3c\u7684 mockto-extensions \u6269\u5c55\u7684\u65b9\u5f0f\uff0c\u5b9e\u73b0\u4e86\u5bf9\u9759\u6001\u65b9\u6cd5\u7684 Mock\u3002\u6240\u6709\u4f7f\u7528\u5230\u7684\u63a5\u53e3\u662f org.mockito.MockedStatic\uff0c\n\u5b83\u5f53\u524d\u5728 Mockito 3.7.7 \u4e2d\u8fd8\u662f\u4e00\u4e2a\u8bd5\u9a8c\u6027\u65b9\u6cd5 @Incubating\uff0c\u80fd\u62ff\u6765\u7528\u5c31\u884c\u3002"},{"title":"Mockito \u7684 anyString(), any(Foo.class) \u7b49\u4e0d\u80fd\u5339\u914d null \u503c","link":"https:\/\/yanbin.blog\/mockito-anystring-anyfoo-class-cannot-match-null-values\/","pubDate":"Wed, 24 Jun 2020 02:33:59 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-anystring-anyfoo-class-cannot-match-null-values\/","description":"\n\u4f7f\u7528 Mockito Mock \u65b9\u6cd5\u5f0f\uff0c\u4e00\u76f4\u4ee5\u4e3a\u53ef\u4ee5\u7528 <code>anyString()<\/code>, <code>any(Foo.class)<\/code> \u7b49\u5339\u914d <code>null<\/code> \u503c\uff0c\u5176\u5b9e\u4e0d\u884c\uff0c<code>null<\/code> \u503c\u5fc5\u987b\u663e\u5f0f\u7684\u7528 <code>null<\/code>, \u6216 <code>eq(null)<\/code> \u6765\u5339\u914d\u3002<code>anyString()<\/code>, <code>anyInt()<\/code> \u7b49\u53ea\u80fd\u5339\u914d\u975e <code>null<\/code> \u503c\uff0c\u67e5\u770b\u5b83\u4eec\u7684\u8fd4\u56de\u503c\u5b9e\u9645\u662f \"\" \u548c 0 \u7b49, \u800c\u66f4\u4e3a\u7279\u522b\u7684\u662f <code>any(Foo.class)<\/code> \u770b\u5230\u7684\u662f <code>null<\/code>, \u4ecd\u7136\u4e0d\u80fd\u5339\u914d <code>null<\/code> \u503c\u3002\u8fdb\u4e00\u6b65\u7528 <code>Mockito.mockingDetails(mock).printInvocations()<\/code>\u00a0\u6253\u5370\u51fa\u7684\u5185\u5bb9\uff0c<code>anyString()<\/code>, <code>any(Foo.class)<\/code> \u90fd\u4f1a\u663e\u793a\u4e3a <code>null<\/code> \u503c\u3002<\/p>\n<br\/>\n\u8bf4\u7684\u6709\u70b9\u7f57\u55e6\uff0c\u770b\u4e0b\u9762\u7684\u4f8b\u5b50, \u88ab\u6d4b\u8bd5\u7c7b UserDao\uff0csql \u548c sqlArguments \u7531\u5404\u81ea\u7684 setter \u65b9\u6cd5\u6765\u63a7\u5236\uff0c\u9ed8\u8ba4\u5b83\u4eec\u90fd\u4e3a <code>null<\/code>"},{"title":"Java \u666e\u901a\u7ebf\u7a0b\u6c60\u4e0e ForkJoinPool \u7684\u6548\u679c\u5bf9\u6bd4","link":"https:\/\/yanbin.blog\/common-threadpool-vs-forkjoinpool\/","pubDate":"Wed, 08 Apr 2020 00:14:36 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/common-threadpool-vs-forkjoinpool\/","description":"\nJava \u591a\u7ebf\u7a0b\u7f16\u7a0b\u5e38\u7528\u7684\u4e00\u4e2a\u63a5\u53e3\u662f <code>ExecutorService<\/code>, \u5176\u5b9e\u5c31\u4e00\u4e2a\u7ebf\u7a0b\u6c60\u7684\u63a5\u53e3\uff0c\u4e00\u822c\u7531\u4e24\u79cd\u65b9\u5f0f\u521b\u5efa\u7ebf\u7a0b\u6c60\uff0c\u4e00\u4e3a Executors \u7684\u5de5\u5382\u65b9\u6cd5\uff0c\u4e8c\u5219\u521b\u5efa ForkJoinPool \u5b9e\u4f8b\uff0c\u5f53\u7136\u4e5f\u6709\u76f4\u63a5\u4f7f\u7528 ThreadPoolExecutor \u7684\u3002<\/p>\n<br\/>\n\u5173\u4e8e\u4ec0\u4e48\u65f6\u5019\u7528 <code>ForkJoinPool<\/code> \u6216\u666e\u901a\u7684\u7ebf\u7a0b\u6c60(\u5982 Executors.newFixedThreadPool(2) \u6216 new ThreadPoolExecutor(...)) \u4e0d\u8fc7\u591a\u7684\u8ff0\u8bf4\u3002\u5982\u679c\u8981\u8fd0\u7528\u5230 ForkJoinTask \u7684\u8bdd\u5c31\u8981\u7528 ForkJoinPool, \u5b83\u662f Java7 \u65b0\u5f15\u5165\u7684\u7ebf\u7a0b\u6c60\u7c7b\u578b\u3002<br\/><br\/>\n\u5173\u4e8e Java7 \u7684 fork-join \u6846\u67b6\u53ef\u53c2\u8003\u5f88\u591a\u5e74\u524d\u7684\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-fork-join-framework-memo\/\">Java \u7684 fork-join \u6846\u67b6\u5b9e\u4f8b\u5907\u5fd8<\/a>\u3002ForkJoinPool \u7684\u4e00\u4e2a\u5178\u578b\u7279\u5f81\u662f\u80fd\u591f\u8fdb\u884c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Work_stealing\">Work stealing<\/a>\u3002\u5b83\u4e5f\u662f Akka actor \u6548\u7387\u9ad8\u6548\u7684\u4e00\u4e2a\u6709\u529b\u4fdd\u8bc1\u3002<br\/><br\/>\n\u672c\u6587\u53ea\u80fd\u67d0\u4e00\u79cd\u60c5\u5f62\u4e0b\u5728\u9009\u62e9\u666e\u901a\u7ebf\u7a0b\u6c60\u4e0e ForkJoinPool \u7684\u533a\u522b\uff0c\u76f4\u63a5\u8bf4\u5427\uff0c\u666e\u901a\u7ebf\u7a0b\u66f4\u5bb9\u6613\u9020\u6210\u6b7b\u9501\uff0c\u800c ForkJoinPool \u5374\u80fd\u5e94\u5bf9\u76f8\u540c\u7684\u72b6\u51b5\u3002"},{"title":"\u7528 Java \u628a\u5185\u5b58\u4e2d\u7684\u8868\u683c\u6570\u636e\u5408\u5e76\u5230 SQL Server \u8868\u4e2d","link":"https:\/\/yanbin.blog\/merge-in-memory-table-data-into-sql-server-table\/","pubDate":"Thu, 26 Sep 2019 22:49:25 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/merge-in-memory-table-data-into-sql-server-table\/","description":"\n<p>\u627f\u63a5\u8fd1\u4e24\u5e74\u524d\u7684 <a href=\"https:\/\/yanbin.blog\/sqlserver-insert-multiple-rows-onetime\">\u7528 PreparedStatement \u5411 SqlServer \u4e2d\u4e00\u6b21\u6027\u63d2\u5165\u591a\u6761\u8bb0\u5f55<\/a>\uff0c\u5176\u6587\u540e\u7528 User-Defined Type \u53ef\u7528\u4e0b\u9762\u7b80\u5355\u7684\u4ee3\u7801\u628a Java \u672c\u5730\u5185\u5b58\u4e2d\u8868\u683c\u6570\u636e\u4e00\u80a1\u8111\u7684\u5237\u5165\u5230 SQL Server\u00a0\u6570\u636e\u5e93\u8868\u683c\u4e2d<\/p>\n<blockquote>\nString sql = \"INSERT INTO Customers SELECT * FROM ?\";<br \/>\nSQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) conn.prepareStatement(sql);<br \/>\nSQLServerDataTable dataTable = ..... \/\/\u00a0\u751f\u6210\u597d\u7684\u672c\u5730\u8868\u683c\u6570\u636e<br \/>\npstmt.setStructured(1, \"CustomersTableType\", dataTable);<br \/>\npstmt.execute();\n<\/blockquote>\n<p>\u4e0a\u9762\u7684 dataTable \u672c\u5730\u8868\u683c\u7c7b\u578b\u53d8\u91cf\u5bb9\u6613\u751f\u6210\uff0c\u5173\u952e\u662f\u5fc5\u987b\u5728\u6b63\u5f0f\u6570\u636e\u5e93\u6570\u987b\u9884\u5148\u7528 <code>CREATE TYPE<\/code> \u521b\u5efa\u597d <code>CustomersTableType<\/code> \u8fd9\u4e2a\u7528\u6237\u81ea\u5b9a\u4e49\u7c7b\u578b\uff0c\u8fd9\u4f1a\u53d7\u6743\u9650\u7684\u7ea6\u675f\u3002\u5982\u679c\u7531 DBA \u9884\u5148\u5b8c\u5168\u4f9d\u7167\u76ee\u6807\u8868\u6765\u521b\u5efa\u597d\u8fd9\u4e2a\u7528\u6237\u81ea\u5b9a\u4e49\u7c7b\u578b\uff0c\u53c8\u65e0\u6cd5\u786e\u5b9a\u662f\u5426\u603b\u662f\u8981\u64cd\u4f5c\u8be5\u76ee\u6807\u8868\u7684\u6240\u6709\u5b57\u6bb5\u3002<\/p>\n<p>\u6570\u636e\u5e93\u662f\u5141\u8bb8\u6211\u4eec\u521b\u5efa\u4e34\u65f6\u7684\u7528\u6237\u81ea\u5b9a\u4e49\u7c7b\u578b"},{"title":"\u7b49\u5f85\u6240\u6709\u7684 CompletableFuture \u5b8c\u6210","link":"https:\/\/yanbin.blog\/wait-all-completablefuture-done\/","pubDate":"Mon, 23 Sep 2019 23:03:37 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/wait-all-completablefuture-done\/","description":"\n<p>\u73b0\u5b9e\u4e2d\u6709\u8fd9\u6837\u7684\u7528\u6cd5\uff0c\u521b\u5efa\u4e00\u6279\u5728\u7ebf\u7a0b\u6c60\u4e2d\u8fd0\u884c\u7684\u00a0 CompletableFuture \u5b9e\u4f8b\uff0c\u7136\u540e\u7b49\u5f85\u5b83\u4eec\u5168\u90e8\u6267\u884c\u5b8c\u518d\u7ee7\u7eed\u540e\u9762\u7684\u64cd\u4f5c\u3002\u6bd4\u5982\u8bf4 AWS \u7684 Lambda, \u5355\u5355\u63d0\u4ea4\u4efb\u52a1\u5230\u7ebf\u7a0b\u6c60\uff0c\u4e0d\u7b49\u5f85\u6240\u6709\u4efb\u52a1\u5168\u90e8\u5b8c\u6210\u4fbf\u9000\u51fa\u4e3b\u7ebf\u7a0b\u7684\u8bdd\uff0cAWS \u4fbf\u8ba4\u4e3a Lambda \u6267\u884c\u5b8c\u6bd5\uff0c\u65e0\u89c6\u7ebf\u7a0b\u6c60\u4e2d\u6b63\u5728\u6267\u884c\u7684\u4efb\u52a1\u800c\u5f3a\u884c\u7ed3\u675f\u8be5 Lambda \u5b9e\u4f8b\u3002<\/p>\n<p>\u4ee5\u5f80\u6211\u4eec\u901a\u5e38\u7684\u4f5c\u6cd5\u5982\u4e0b<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"n\">ExecutorService<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPool<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Executors<\/span><span class=\"p\">.<\/span><span class=\"na\">newFixedThreadPool<\/span><span class=\"p\">(<\/span><span class=\"n\">10<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">CompletableFuture<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Void<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">futures<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">IntStream<\/span><span class=\"p\">.<\/span><span class=\"na\">rangeClosed<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">10000<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">.<\/span><span class=\"na\">mapToObj<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">CompletableFuture<\/span><span class=\"p\">.<\/span><span class=\"na\">runAsync<\/span><span class=\"p\">(()<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;done &#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">n<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">},<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPool<\/span><span class=\"p\">)).<\/span><span class=\"na\">collect<\/span><span class=\"p\">(<\/span><span class=\"n\">toList<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"n\">futures<\/span><span class=\"p\">.<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"n\">CompletableFuture<\/span><span class=\"p\">::<\/span><span class=\"n\">join<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;all done&#34;<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p>\u5982\u679c\u6240\u6709\u7684\u4efb\u52a1\u5747\u65e0\u5f02\u5e38\uff0c\u4e0a\u9762\u7684\u4ee3\u7801\u80fd\u5f97\u5230\u9884\u60f3\u7684\u7ed3\u679c\uff0c\u53ea\u8981\u4e0a\u9762\u6253\u5370\u51fa <code>all done<\/code> \u7684\u8bdd\u771f\u7684\u5c31\u662f\u8868\u660e\u6240\u6709\u7684\u4efb\u52a1\u90fd\u5b8c\u6210\u4e86\u3002\u4f46\u662f\u5728\u5faa\u73af join <code>futures<\/code> \u4e2d\u7684\u6bcf\u4e00\u4e2a CompletableFuture \u65f6\uff0c\u53ea\u8981\u78b0\u5230\u4efb\u610f\u4e00\u4e2a\u4efb\u52a1\u6709\u5f02\u5e38\u65f6\uff0c\u4fbf\u7acb\u5373\u629b\u51fa\u7ed9\u5916\u90e8\u7ebf\u7a0b\uff0c\u4e0d\u5728\u4e4e\u662f\u5426\u8fd8\u6709\u5176\u4ed6\u4efb\u52a1\u6b63\u5728\u6267\u884c\u3002\u6b64\u65f6\uff0c\u5982\u679c\u5916\u90e8\u672a\u4e88\u6355\u83b7\uff0c\u5f53\u7136"},{"title":"\u8bd5\u624b RxJava 2.x \u53ca\u5bf9\u7ebf\u7a0b\u7684\u521d\u6b65\u7406\u89e3","link":"https:\/\/yanbin.blog\/rxjava-get-started\/","pubDate":"Wed, 19 Jun 2019 23:57:56 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/rxjava-get-started\/","description":"\n\u5728\u8fdb\u884c\u6570\u636e\u6d41\u5904\u7406\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u4e00\u4e2a\u9ad8\u6548\u82d7\u6761\u7684\u6d41\u5904\u7406\u7ec4\u4ef6\uff0c\u6bd4\u5982\u5bf9\u8f93\u5165\u6d41\u80fd\u8fdb\u884c\u5206\u7ec4(\u7a97\u53e3)\uff0c\u80fd\u8fdb\u884c\u6d41\u91cf\u63a7\u5236(Back Pressure - \u80cc\u538b)\uff0c\u8fd9\u4e5f\u5c31\u6d89\u53ca\u5230\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff0c\u6d41\u5904\u7406\u6846\u67b6\u3002\u8fd9\u65b9\u9762\u5982\u679c\u76f4\u63a5\u57fa\u4e8e Akka actor \u6765\u6784\u5efa Akka ActorSystem \u4e5f\u662f\u6bd4\u8f83\u590d\u6742\uff0c\u4f9d\u8d56\u7684\u7ec4\u4ef6\u4e5f\u4e0d\u5c11\u3002\u8fd8\u6709\u6784\u7b51\u5728 Akka actor \u4e4b\u4e0a\u7684 Akka Streams\uff0c\u518d\u5f80\u4e0a\u7684 Flink Streaming\uff0c\u5b83\u4eec\u90fd\u6709\u50cf\u6ed1\u52a8\uff0c\u6eda\u52a8\u7a97\u53e3\u7684\u6982\u5ff5\uff0c\u4f46\u662f\u4f9d\u8d56\u66f4\u4e0d\u5f97\u4e86\u3002\u4e00\u4e2a\u57fa\u672c\u7684 Flink Streaming \u7684\u9879\u76ee\u4f1a\u4f9d\u8d56\u5230 45 M \u4ee5\u4e0a\u7684\u7b2c\u4e09\u65b9\u7ec4\u4ef6\uff0c\u5982\u679c\u7528\u5b83\u6765\u5199\u4e00\u4e2a\u6570\u636e\u6d41\u5904\u7406\u7684\u5171\u4eab\u7ec4\u4ef6\uff0c\u90a3\u771f\u662f\u8981\u547d\u3002Spring 5 \u4e5f\u5f00\u59cb\u5e26\u4e0a\u4e86\u81ea\u5df1\u7684 Reactive-Streams \u5b9e\u73b0 Spring Reactor, \u60f3\u8981\u628a\u5b83\u4ece Spring \u4e2d\u5355\u72ec\u62bd\u79bb\u51fa\u4e5f\u975e\u6613\u4e8b\u3002<\/p>\n<blockquote>\nFlink Streaming \u7ec4\u4ef6\u4f9d\u8d56\uff1aorg.apache.fling:flink-streaming-java_2.12:1.80, \u4f1a\u4f9d\u8d56\u4e8e\u5176\u4ed6\u8bf8\u5982 akka-stream, akka-actor, flink-core, flink-clients, scala-library \u7b49\u975e\u5e38\u591a\u7684\u4e1c\u897f\n<\/blockquote>\n\u800c\u53e6\u4e00\u4e2a\u8457\u540d\u7684\u54cd\u5e94\u5f0f\u6846\u67b6 RxJava 2 \u5c31\u6e05\u723d\u591a\u4e86\uff0c\u5b8c\u5168\u6ca1\u6709\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff0c\u8981\u8bf4\u6709\u4e5f\u5c31\u662f\u5b9a\u4e49\u4e86\u56db\u4e2a\u63a5\u53e3\u7684 reactive-streams(2 KB \u5927\u5c0f)\uff0c\u5c31\u81ea\u8eab\u90a3\u4e2a\u00a0 rxjava-2.2.9.jar \u5305\u53ea\u6709 2.3 M\uff0c\u8fd9\u624d\u53eb\u8f7b\u91cf\u7ea7\u3002\u56e0\u4e3a\u5b83\u8bbe\u8ba1\u6765\u662f\u80fd\u88ab\u5e94\u7528\u4e8e Android \u5ba2\u6237\u7aef\u5e94\u7528\u7684\uff0cAndriod \u4e0a\u7684 rxandriod-1.2.1.aar \u53ea\u6709 9 K\u3002\u6240\u4ee5 RxJava 2.x \u592a\u9002\u5408\u7528\u6765\u5199\u4e00\u4e9b\u5c0f\u7684\u5171\u4eab\u7ec4\u4ef6\u4e86\u3002"},{"title":"Java \u4e0e'\u5d4c\u5165\u5f0f' PostgreSQL \u6570\u636e\u5e93\u7684\u5355\u5143\u6d4b\u8bd5","link":"https:\/\/yanbin.blog\/java-postgresql-unit-test\/","pubDate":"Mon, 03 Jun 2019 23:14:58 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-postgresql-unit-test\/","description":"\n<p>\u5728\u6211\u4eec\u5bf9\u6570\u636e\u5e93 DAO \u7c7b\u8fdb\u884c\u5355\u5143\u6d4b\u8bd5\u65f6\uff0c\u901a\u5e38\u4e0d\u5e94\u8be5\u4f9d\u8d56\u4e8e\u4e00\u4e2a\u5916\u90e8\u6570\u636e\u5e93\uff0c\u6240\u4ee5\u4f1a\u9009\u7528\u7279\u5b9a\u6bd4\u8f83\u63a5\u8fd1\u4e8e\u771f\u5b9e\u6570\u636e\u5e93\u7c7b\u578b\u7684\u5185\u5b58\u6216\u5d4c\u5165\u5f0f\u6570\u636e\u5e93\uff0c\u5982 HSQLDB(HyperSQL), H2, Derby \u7b49\u3002\u4f46\u603b\u96be\u514d\u4f1a\u7528\u5230\u7279\u5b9a\u6570\u636e\u5e93\u7684\u7279\u6027\uff0c\u8fd9\u65f6\u5019\u5c31\u65e0\u6cd5\u7528\u524d\u8ff0\u5404\u79cd\u6570\u636e\u5e93\u8fdb\u884c\u6d4b\u8bd5\u4e86\u3002\u975e\u8981\u5355\u5143\u6d4b\u8bd5\u4e2d\u8986\u76d6\u5230\u6240\u7528\u7684\u6570\u636e\u5e93\u7279\u6027\u7684\u8bdd\u53ef\u4ee5\u9009\u62e9\u7528 docker\uff0c\u5982 <a href=\"https:\/\/www.testcontainers.org\/\">Testcontainers<\/a>, \u7ecf\u8fc7\u6a21\u5757\u6269\u5c55\uff0c\u5b83\u53ef\u4ee5\u7531 docker \u6765\u542f\u52a8\u8bb8\u591a\u79cd\u7c7b\u578b\u7684\u6570\u636e\u5e93\uff0cMySQL, Postgres, Oracle-XE, MS SQL Server, Couchbase \u7b49\u7b49\uff0c\u8be6\u60c5\u89c1 <a href=\"https:\/\/www.testcontainers.org\/modules\/databases\/\">Database containers<\/a>\u3002\u521a\u4e86\u89e3\u5230\u7684\u662f\u5b83\u7684\u6a21\u5757\u5316\u7684\u65e0\u9650\u53ef\u80fd\uff0c\u50cf\u652f\u6301 Kafka Containers \u548c Localstack Module \u7b49\u3002<\/p>\n<p>\u8fd9\u91cc\u5c31\u4e0d\u8d70 Testcontainers \u90a3\u6761\u8def -- \u8981\u6c42\u6784\u5efa\u670d\u52a1\u5668\u4e0a\u4e5f\u8981\u6709 docker\u3002\u65e9\u5148\u5e0c\u671b\u80fd\u627e\u5230\u4e00\u79cd\u5d4c\u5165\u5f0f\u6216\u5185\u5b58 PostgreSQL \u6570\u636e\u5e93\uff0c\u540e\u6765\u53d1\u73b0 PostgreSQL \u672a\u80fd\u63d0\u4f9b In-Process \u548c In-Memory \u7684\u542f\u52a8\u65b9\u5f0f\uff0c\u597d\u5728 PostgreSQL \u662f\u5f00\u6e90\uff0c\u6709\u4eba\u53ef\u4ee5\u628a\u5b83\u6539\u9020\u4e3a\u5c0f\u578b\u7684\u53ef\u7531\u6d4b\u8bd5\u4ee3\u7801\u542f\u505c\u7684\u672c\u5730\u6570\u636e\u5e93\u3002\u6709\u4e24\u4e2a\u5177\u6709\u4ee3\u8868\u6027\u7684\u7ec4\u4ef6\uff0c\u5206\u522b\u662f <a href=\"https:\/\/github.com\/opentable\/otj-pg-embedded\">OpenTable Embedded PostgreSQL Component<\/a> \u548c <a href=\"https:\/\/github.com\/yandex-qatools\/postgresql-embedded\">Embedded PostgreSQL Server<\/a>\uff0c\u5b83\u4eec\u90fd\u53f7\u79f0\u662f Embedded\uff0c\u6240\u8c13\u5d4c\u5165\u5f0f\uff0c\u5176\u5b9e\u662f\u8fdb\u6d4b\u8bd5\u8fdb\u7a0b\u5916\u7684\u6570\u636e\u5e93\u3002<\/p>\n<p>\u4e0b\u9762\u7b80\u5355\u4f53\u9a8c\u4e0b\u4e24\u4e2a\u7ec4\u4ef6\u7684\u7528\u6cd5"},{"title":"\u4f7f\u7528 Google Guava Striped \u5b9e\u73b0\u57fa\u4e8e Key \u7684\u5e76\u53d1\u9501","link":"https:\/\/yanbin.blog\/google-guava-striped-key-based-fine-grain-locks\/","pubDate":"Sun, 02 Jun 2019 12:13:44 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/google-guava-striped-key-based-fine-grain-locks\/","description":"\n\u5199 Java \u4ee3\u7801\u81f3\u4eca\uff0c\u5728\u5e94\u5bf9\u53ef\u80fd\u51b2\u7a81\u7684\u5171\u4eab\u8d44\u6e90\u64cd\u4f5c\u65f6\u4f1a\u5c3d\u91cf\u7528 JDK 1.5 \u5f00\u59cb\u5f15\u5165\u7684\u5e76\u53d1\u9501(\u5982 Lock \u7684\u5404\u7c7b\u5b9e\u73b0\u7c7b, ReentrantLock \u7b49) \u8fdb\u884c\u9501\u5b9a\uff0c\u800c\u4e0d\u662f\u539f\u6765\u7684 <code>synchronized<\/code> \u5173\u952e\u5b57\u5f3a\u786c\u4f4e\u6027\u80fd\u9501\u3002<br\/><br\/>\n\u8fd9\u91cc\u662f\u5e94\u7528 JDK 1.5\u00a0 \u7684 <code>Lock<\/code>\u00a0\u7684\u57fa\u672c\u64cd\u4f5c\u6b65\u9aa4<br\/>\n<blockquote>\nprivate Lock lock = new ReentrantLock();\nprivate void operate() {<br \/>\n\u00a0 \u00a0 \/\/ \u5b89\u5168\u64cd\u4f5c ....<br \/>\n\u00a0 \u00a0 lock.lock();<br \/>\n\u00a0 \u00a0 try {<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u5bf9\u5171\u4eab\u8d44\u6e90\u7684\u64cd\u4f5c ...<br \/>\n\u00a0 \u00a0 } finally {<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 lock.unlock();<br \/>\n\u00a0 \u00a0 }<br \/>\n}\n<\/blockquote>\n\u5982\u6b64\uff0c<code>operate()<\/code> \u5c31\u662f\u4e00\u4e2a\u7ebf\u7a0b\u5b89\u5168\u7684\u65b9\u6cd5\uff0c\u4efb\u4f55\u5bf9\u5b83\u7684\u8c03\u7528\u90fd\u5b89\u6392\u5230\u4e86\u4e00\u4e2a\u961f\u5217\u91cc\u7b49\u7740\u3002\u4f46\u6709\u65f6\u5019\u4e0a\u9501\u9700\u8981\u8003\u8651\u66f4\u7ec6\u7684\u7c92\u5ea6\uff0c\u4e0b\u9762\u662f\u4e00\u4e2a\u6f14\u793a\u6848\u4f8b\uff0c\u5f15\u51fa\u7b2c\u4e00\u4e2a\u95ee\u9898<br\/>"},{"title":"Jackson \u53cd\u5e8f\u5217\u5316 \"Y\"\/\"N\" \u4e3a\u76f8\u5e94\u7684\u5e03\u5c14\u503c","link":"https:\/\/yanbin.blog\/jackson-yn-boolean-value-deserialization\/","pubDate":"Sun, 16 Dec 2018 16:07:49 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jackson-yn-boolean-value-deserialization\/","description":"\n<p>JSON\u00a0\u8868\u793a\u5e03\u5c14\u503c\u6807\u51c6\u7684\u5f62\u5f0f\u662f <code>true<\/code>\u00a0 \u548c\u00a0 <code>false<\/code>\uff0c\u5982\u679c\u00a0Java\u00a0\u5bf9\u5e94\u7684\u7c7b\u578b\u662f\u5bf9\u8c61\u00a0 Boolean\uff0c\u90a3\u4e48\u5728\u00a0JSON\u00a0\u4e2d\u4e5f\u53ef\u4ee5\u662f\u00a0 <code>null<\/code>\u3002\u5982\u679c\u6536\u5230\u00a0JSON\u00a0\u6570\u636e\u662f\u7528 'Y'\/'N',\u00a0\u6216 'Yes'\/'No'\u00a0\u6765\u8868\u793a\u5e03\u5c14\u503c\u7684\uff0c\u90a3\u4e48\u4f7f\u7528\u00a0Java\u00a0\u7684\u00a0Jackson\u00a0\u5e93\u5982\u4f55\u628a\u5b83\u4eec\u53cd\u5e8f\u5217\u5316\u4e3a\u76f8\u5e94\u7684\u5e03\u5c14\u5c5e\u6027\u503c\u5462\uff1f<\/p>\n<p>\u5982\u679c\u6309\u7167 JSON\u00a0\u89c4\u8303\u5fc5\u987b\u628a\u5185\u5bb9\u4e2d\u7684\u5e03\u5c14\u503c\u5168\u90e8\u8f6c\u6362\u4e3a <code>true<\/code>\u00a0\u6216 <code>false<\/code>,\u00a0\u7136\u800c\u518d\u53cd\u5e8f\u5217\u5316\uff0c\u5426\u5219\u9700\u8981\u5b9a\u5236 <code>Boolean<\/code>\u00a0\u7c7b\u578b\u7684\u53cd\u5e8f\u5217\u5316\u7c7b\uff0c\u53ef\u5e94\u7528\u5230\u5168\u5c40\u7684 boolean\u00a0\u7c7b\u578b\uff0c\u6216\u6307\u6d3e\u7ed9\u7279\u5b9a\u7684 boolean\u00a0\u7c7b\u578b\u5c5e\u6027\u3002<\/p>\n<p>\u5982\u679c\u5c1d\u8bd5\u53cd\u5e8f\u5217\u5316 <code>Y<\/code>,\u00a0\u6216 <code>N<\/code>\u00a0\u4e3a Java\u00a0\u7684 boolean\u00a0\u503c\uff0c\u4f1a\u6709\u53ea\u63a5\u53d7\u00a0 true\u00a0\u6216\u00a0false\u00a0\u7684\u5f02\u5e38\uff1a<\/p>\n<blockquote>\ncom.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.lang.Boolean from String \"Y\": only \"true\" or \"false\" recognized\n<\/blockquote>\n<p>\u5177\u4f53\u6b65\u9aa4\u662f\uff1a"},{"title":"\u8df3\u8fc7\u6784\u9020\u51fd\u6570\u521b\u5efa Java \u5bf9\u8c61(\u6d4b\u8bd5)","link":"https:\/\/yanbin.blog\/create-java-instance-bypass-constructor\/","pubDate":"Tue, 21 Aug 2018 23:31:52 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/create-java-instance-bypass-constructor\/","description":"\n\u5982\u679c\u4e00\u4e2a Java\u00a0\u7c7b\u5728\u521d\u59cb\u5316\u65f6\u4f1a\u6709\u5916\u90e8\u4f9d\u8d56\uff0c\u8fd9\u5c31\u7ed9\u5355\u5143\u6d4b\u8bd5\u521b\u5efa\u5b83\u7684\u5b9e\u4f8b\u65f6\u9020\u6210\u56f0\u96be\u3002\u5f53\u7136\u88ab\u6d4b\u8bd5\u7c7b\u53ef\u4ee5\u6539\u9020\u4e3a\u4f9d\u8d56\u5168\u90e8\u6784\u9020\u65f6\u6ce8\u5165\u6216\u521b\u5efa\u5b9e\u4f8b\u540e\u5ef6\u8fdf\u6ce8\u5165\uff0c\u8fd9\u91cc\u4e0d\u8003\u8651\u8fd9\u79cd\u6539\u9020\u3002<\/p>\n<br\/>\n\u53ef\u4ee5\u53c2\u770b\u6211\u4ee5\u524d\u4e00\u7bc7\u7c7b\u4f3c\u7684\u65e5\u5fd7\uff1a<a href=\"https:\/\/yanbin.blog\/jmockit-mock-constructors\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u4f7f\u7528 JMockit \u6765 mock \u6784\u9020\u51fd\u6570<\/a><br\/><br\/>\n\u6765\u8bf4\u4e0b\u9762\u7684\u4f8b\u5b50<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">OrderService<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">PriceInquiry<\/span><span class=\"w\"> <\/span><span class=\"n\">priceInquiry<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">PriceInquiry<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">.........<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">double<\/span><span class=\"w\"> <\/span><span class=\"nf\">totalPrice<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">priceInquiry<\/span><span class=\"p\">.<\/span><span class=\"na\">retrieve<\/span><span class=\"p\">(....);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5047\u5982\u4e0a\u9762\u7684\u4ee3\u7801\u662f\u4e0d\u80fd\u6539\u52a8\u7684\uff0c\u5e76\u4e14\u5728 <code>new PriceInquiry()<\/code>\u00a0\u65f6\u4f9d\u8d56\u4e8e\u7f51\u7edc\u73af\u5883\uff0c\u6240\u4ee5\u5355\u673a\u60c5\u51b5\u4e0d\u80fd\u521b\u5efa\u6210\u529f\u3002\u4e5f\u5c31\u4f7f\u5f97\u6d4b\u8bd5\u65f6\u8bd5\u56fe<br\/>\n<blockquote>\nnew OrderService();\n<\/blockquote>\n\u4f1a\u5931\u8d25\u3002\u5e76\u4e14\u8bd5\u56fe\u7528 Mockito\u00a0\u7684 <code>@InjectMocks<\/code>\u00a0\u4e5f\u4e0d\u884c"},{"title":"Jackson \u5e8f\u5217\u5316\u5ffd\u7565\u6307\u5b9a\u7c7b\u578b\u7684\u5c5e\u6027","link":"https:\/\/yanbin.blog\/jackson-ignore-specified-field-type\/","pubDate":"Mon, 06 Aug 2018 23:52:39 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jackson-ignore-specified-field-type\/","description":"\n\u672c\u6587\u51c6\u786e\u6765\u8bb2\u662f\u63a2\u8ba8\u5982\u4f55\u7528 Jackson\u00a0\u6765\u5e8f\u5217\u5316 Apache\u00a0avro\u00a0\u5bf9\u8c61\uff0c\u56e0\u4e3a\u7b80\u5355\u7528 Jackson\u00a0\u6765\u5e8f\u5217\u5316\u00a0Apache\u00a0avro\u00a0\u5bf9\u8c61\u4f1a\u62a5\u9519\u3002\u539f\u56e0\u662f\u5e8f\u5217\u5316 <code>Schema getSchema()<\/code>\u00a0\u65f6\u4f1a\u62a5\u9519\uff0c\u540e\u9762\u4f1a\u8bb2\u5230\uff0c\u9700\u8981\u5e8f\u5217\u5316\u65f6\u5ffd\u7565\u8be5\u5c5e\u6027\u3002\u90a3\u4e48\u80fd\u4e0d\u80fd\u5728 <code>getSchema()<\/code>\u00a0\u4e0a\u52a0\u4e0a <code>@JsonIgnore<\/code>\u00a0\u6765\u5ffd\u7565\u8be5\u5c5e\u6027\u5462\uff1f\u539f\u7406\u4e0a\u662f\u901a\u7684\u3002\u4e0d\u8fc7\u624b\u5de5\u4fee\u6539\u7684 avsc\u00a0\u751f\u6210\u7684 Java\u00a0\u6587\u4ef6\u968f\u65f6\u4f1a\u56e0\u4e3a\u91cd\u65b0\u7f16\u8bd1\u800c\u8fd8\u539f\uff0c\u6240\u4ee5\u4e0d\u592a\u5177\u6709\u5b9e\u9645\u53ef\u64cd\u4f5c\u6027\uff0c\u5f53\u7136\u901a\u8fc7\u5b9a\u5236\u7f16\u8bd1 avsc\u00a0\u7528\u7684\u6a21\u677f\u6587\u4ef6\u6765\u52a0\u5165 <code>@JsonIgnore<\/code>\u00a0\u662f\u53e6\u4e00\u56de\u4e8b\u3002<br\/><br\/>\n\u7531\u4e8e\u4e0d\u80fd\u5728\u8981\u5ffd\u7565\u7684\u5b57\u6bb5\u4e0a\u6dfb\u52a0 <code>JsonIgnore<\/code>\u00a0\u6765\u63a7\u5236\uff0c\u800c\u5982\u679c\u6211\u4eec\u660e\u786e\u4e86\u8981\u5ffd\u7565\u7684\u5b57\u6bb5\u7c7b\u578b\u7684\u8bdd\uff0c\u662f\u80fd\u591f\u5b9a\u5236 Jackson\u00a0\u7684\u00a0 ObjectMapper\u00a0 \u6765\u5c4f\u853d\u67d0\u4e2a\u7279\u5b9a\u7684\u7c7b\u578b\u3002\u6765\u770b\u4e0b\u9762\u5e8f\u5217\u5316\u00a0Apache\u00a0avro\u00a0\u5bf9\u8c61\u7684\u4f8b\u5b50\uff1a<br\/><br\/>\n\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u00a0Apache\u00a0\u7684 Schema\u00a0\u6587\u4ef6 <code>user.avsc<\/code>,\u00a0\u5185\u5bb9\u5982\u4e0b\uff1a"},{"title":"Java 9 - \u8bf4\u8bf4\u54cd\u5e94\u5f0f\u6d41","link":"https:\/\/yanbin.blog\/java-9-talk-reactive-stream\/","pubDate":"Tue, 03 Jul 2018 01:33:14 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-9-talk-reactive-stream\/","description":"\n<p>\u6700\u521d\u770b\u5230 Java 9 \u7684\u8fd9\u4e2a\u65b0\u7279\u6027\u6ca1\u592a\u5728\u610f\uff0c\u53ca\u81f3\u91cd\u65b0\u5173\u6ce8\u5230 Spring 5\/Springboot 2 \u7684\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684\u65f6\u5019\u624d\u771f\u6b63\u91cd\u89c6\u8d77 Reactive Streams(\u54cd\u5e94\u5f0f\u6d41\u6216\u53cd\u5e94\u5f0f\u6d41)\u3002\u5e94\u7528\u54cd\u5e94\u5f0f\u6d41\u7684\u7f16\u7a0b\u4e5f\u5c31\u53eb\u505a\u54cd\u5e94\u5f0f\u7f16\u7a0b(Reactive Programming)\uff0c\u65e0\u8bba\u662f\u7ffb\u8bd1\u6210\u53cd\u5e94\u5f0f\u7f16\u7a0b\u90fd\u6709\u4e9b\u4ee4\u4eba\u6478\u4e0d\u51c6\u5934\u8111\u3002\u4e0e\u6b64\u5bf9\u5e94\u7684\u5728 Web \u8bbe\u8ba1\u65b9\u9762\u6709\u4e00\u4e2a\u53eb\u505a\u54cd\u5e94\u5f0f Web \u8bbe\u8ba1(Responsive\u00a0web design)\uff0c\u4e24\u4e2a\u8bcd\u90fd\u8bd1\u4f5c\u54cd\u5e94\u5f0f\uff0c\u5374\u6709\u4e9b\u5dee\u522b\uff0c\u5927\u6982\u662f Reactive \u88ab\u8bd1\u4e3a\u53cd\u5e94\u7684\u539f\u56e0\u4e4b\u4e00\u3002<\/p>\n<p>\u901a\u8fc7\u8fd9\u91cc\u5bf9\u00a0 Reactive Streams \u7684\u5b66\u4e60\uff0c\u4e3b\u8981\u76ee\u7684\u662f\u4e3a\u4e86\u8fdb\u4e00\u6b65\u638c\u63e1 Spring 5\/Springboot 2 \u7684\u54cd\u5e94\u5f0f MVC \u4f5c\u94fa\u57ab\u7684\uff0c\u4e0d\u81f3\u4e8e\u731b\u7136\u95f4\u89c1 Flux, Mono \u800c\u4e0d\u77e5\u6240\u63aa\u3002<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Functional_reactive_programming\">\u51fd\u6570\u5f0f\u54cd\u5e94\u5f0f\u7f16\u7a0b<\/a>\u6982\u5ff5\u6700\u65e9\u6765\u81ea\u4e8e\u4e5d\u5341\u5e74\u4ee3\u672b\uff0c\u8fd9\u4e5f\u6fc0\u53d1\u4e86\u5fae\u8f6f\u7684 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Erik_Meijer_(computer_scientist)\">Erik Meijer<\/a>\u00a0\u8bbe\u8ba1\u5f00\u53d1\u4e86 .NET \u7684\u00a0 Rx(Reactive eXtension) \u5e93\uff0c\u4ee5\u53ca\u5230\u540e\u6765 Netflix \u7684\u00a0 RxJava \u4e5f\u4e0e\u4ed6\u6709\u5173\u7cfb\u3002Reactive Stream \u66f4\u50cf\u662f\u4e00\u79cd\u7f16\u7a0b\u6a21\u5f0f\uff0c\u81f4\u529b\u4e8e\u89e3\u51b3\u4e00\u4e2a\u751f\u4ea7\u8005\u4ea7\u751f\u4e00\u7cfb\u5217\u6d88\u606f\uff0c\u4e00\u4e2a\u6216\u591a\u4e2a\u53bb\u6d88\u8d39\u5b83\u4eec\u7684\u95ee\u9898\u3002\u4e24\u8005\u7684\u540d\u8bcd\u6211\u4eec\u4f1a\u7528: producer-consumer(\u751f\u4ea7\u8005-\u6d88\u8d39\u8005), source\/sink(\u6c34\u6e90\/\u6c34\u69fd, Akka Stream \u7528\u4e86\u8fd9\u4e2a\u6982\u5ff5), publisher-subscriber(\u53d1\u5e03\u8005-\u8ba2\u9605\u8005)\u3002<\/p>\n<p>\u65e2\u7136 Reactive Stream \u548c Java 8 \u5f15\u5165\u7684 Stream \u90fd\u53eb\u505a\u6d41\uff0c\u5b83\u4eec\u4e4b\u95f4\u6709\u4ec0\u4e48\u5173\u7cfb\u5462\uff1f\u6709\u4e00\u70b9\u5173\u7cfb\uff0cJava 8 \u7684 Stream \u4e3b\u8981\u5173\u6ce8\u5728\u6d41\u7684\u8fc7\u6ee4\uff0c\u6620\u5c04\uff0c\u5408\u5e76\uff0c\u800c\u00a0 Reactive Stream \u66f4\u8fdb\u4e00\u5c42\uff0c\u4fa7\u91cd\u7684\u662f\u6d41\u7684\u4ea7\u751f\u4e0e\u6d88\u8d39\uff0c\u5373\u6d41\u5728\u751f\u4ea7\u4e0e\u6d88\u8d39\u8005\u4e4b\u95f4\u7684\u534f\u8c03\u3002"},{"title":"\u76f8\u6bd4\u4e8e Java 10 \u7684 var, \u66f4\u671f\u5f85 Java 11 \u652f\u6301\u591a\u884c\u5b57\u7b26\u4e32","link":"https:\/\/yanbin.blog\/from-java-10-var-to-11-candicate-multiple-line-string\/","pubDate":"Sat, 16 Jun 2018 02:24:04 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/from-java-10-var-to-11-candicate-multiple-line-string\/","description":"\n<p>Java \u516d\u4e2a\u6708\u7684\u7248\u672c\u8fed\u4ee3\u5468\u671f\u8ba9\u6211\u4eec\u7a81\u7136\u95f4\u6709\u4e9b\u5598\u4e0d\u8fc7\u6c14\u6765\uff0c\u53c8 Java 11 \u624d\u4f1a\u662f\u4e00\u4e2a\u957f\u671f\u652f\u6301\u7248\u672c\uff0c\u5982\u679c\u53ef\u80fd\u7684\u8bdd\u6211\u4eec\u5c06\u4f1a\u662f\u4ece Java 8 \u76f4\u63a5\u5f80 Java 11 \u8df3\u53bb\u3002\u5728 Java 8 \u5927\u884c\u5176\u9053\uff0c\u88f9\u8db3\u4e0d\u524d\u7684\u5f53\u4e0b\uff0c\u8c08\u8bba\u7740\u672a\u6765 Java 11 \u4e0d\u786e\u5b9a\u7684\u65b0\u7279\u6027\uff0c\u6709\u4e00\u79cd\u770b\u7740\u522b\u4eba\u5bb6\u7897\u91cc\u7684\u4e0d\u8fc7\u763e\uff0c\u8fd8\u8981\u770b\u7740\u522b\u4eba\u5bb6\u9505\u91cc\u7684\u611f\u89c9\u3002<\/p>\n<p>\u672c\u7bc7\u539f\u672c\u53ea\u662f\u4e3a\u4e86\u5bf9 Java 11 \u6f5c\u5728\u7684\u539f\u59cb\u5b57\u7b26\u4e32\u5b57\u9762\u91cf(Raw String Literals)\u7684\u54e8\u63a2\uff0c\u540c\u65f6\u8003\u8651\u5230 Java 10 \u4ec5\u6709\u7684\u4e00\u4e2a\u8bed\u8a00\u5c42\u9762\u7684\u65b0\u7279\u6027\u00a0<code>var<\/code>\u00a0<span style=\"text-decoration: underline;\">\u5c40\u90e8\u53d8\u91cf\u7c7b\u578b\u63a8\u65ad<\/span>\uff0c\u6240\u4ee5\u987a\u5e26\u4ecb\u7ecd\u4e00\u4e0b\u3002<\/p>\n<p>\u6211\u8fd9\u513f\u628a\u5b83\u79f0\u4e4b\u4e3a <strong>var \u5c40\u90e8\u53d8\u91cf\u7c7b\u578b\u63a8\u65ad<\/strong>\uff0c\u8bf4\u660e\u4e86<code>var<\/code>\u00a0\u7c7b\u578b\u63a8\u65ad\u5e76\u4e0d\u9002\u7528\u4e8e\u7c7b\u6216\u5b9e\u4f8b\u7684\u53d8\u91cf\uff0c\u6216\u65b9\u6cd5\u7684\u53c2\u6570\u3002\u800c\u4e14 <code>var<\/code>\u00a0\u4e5f\u5e76\u672a\u4e0a\u5347\u4e3a\u4e00\u4e2a\u00a0 Java \u7684\u5173\u952e\u5b57\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u7528 <code>var<\/code>\u00a0\u4f5c\u4e3a\u53d8\u91cf\u6216\u65b9\u6cd5\u540d\u3002<\/p>\n<p>\u5bf9\u5c40\u90e8\u53d8\u91cf\u7528 <code>var<\/code>\u00a0\u8fdb\u884c\u7c7b\u578b\u63a8\u65ad\u7684\u4ee3\u7801\u793a\u4f8b\u53d8\u5316\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Java 10 \u4ee5\u524d<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"kd\">var<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Java 10 \u5f00\u59cb<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">age<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">100<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Java 10 \u4ee5\u524d<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"kd\">var<\/span><span class=\"w\"> <\/span><span class=\"n\">age<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">100<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Java 10 \u5f00\u59cb\uff0c\u63a8\u65ad\u4e3a int \u7c7b\u578b<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"kd\">var<\/span><span class=\"w\"> <\/span><span class=\"n\">stream<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">blocks<\/span><span class=\"p\">.<\/span><span class=\"na\">stream<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u90fd\u4e0d\u9700\u8981\u5f15\u5165<\/span><span class=\"w\"> <\/span><span class=\"n\">java<\/span><span class=\"p\">.<\/span><span class=\"na\">util<\/span><span class=\"p\">.<\/span><span class=\"na\">Stream<\/span><span class=\"w\"> <\/span><span class=\"n\">\u7c7b<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p><code>var<\/code>\u00a0\u5b66\u4e86 <code>Scala<\/code>\u00a0\u7684\u8bed\u6cd5\uff0c\u518d\u91cd\u590d\u4e00\u904d\uff0c<code>var<\/code>\u00a0\u53ea\u80fd\u7528\u4e8e\u5c40\u90e8\u53d8\u91cf\uff0c\u8fd9\u6709\u4e00\u4e2a\u597d\u5904\u5c31\u662f\u5c40\u90e8\u53d8\u91cf\u7684\u8de8\u8d8a\u6027\u8f83\u5c0f\uff0c\u4e0d\u81f3\u4e8e <code>var<\/code>\u00a0\u58f0\u660e\u7684\u53d8\u91cf\u9605\u8bfb\u65f6\u53ea\u6709\u7f16\u8bd1\u5668\u77e5\u9053\u5b83\u7684\u786e\u5207\u7c7b\u578b\u3002<code>var<\/code>\u00a0\u7c7b\u578b\u63a8\u65ad\u7ed9\u4ee3\u7801\u4e66\u5199\u4e0a\u7684\u53d8\u5316\u5c31\u662f\u5bf9\u5c40\u90e8\u53d8\u91cf\u7684\u4efb\u4f55\u7c7b\u578b\u58f0\u660e\u90fd\u53ef\u4ee5\u66ff\u4ee3\u4e3a <code>var<\/code>\u3002"},{"title":"Java 9 - \u5feb\u901f\u521b\u5efa\u4e0d\u53ef\u53d8\u96c6\u5408","link":"https:\/\/yanbin.blog\/java-9-quick-create-immutable-collections\/","pubDate":"Wed, 06 Jun 2018 00:22:57 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-9-quick-create-immutable-collections\/","description":"\n<p>\u5e73\u53f0\u4e4b\u6240\u4ee5\u8c13\u4e4b\u5e73\u53f0\uff0c\u4ee5\u5176\u80fd\u5efa\u7acb\u4e00\u4e2a\u751f\u6001\uff0c\u5e76\u4e0e\u4e4b\u5916\u56f4\u8fbe\u6210\u5171\u8d62\u3002\u9738\u9053\u70b9\u7684\u5e73\u53f0\u4e5f\u4f1a\u53cd\u566c\u5916\u56f4\u751f\u6001\uff0c\u50cf\u5fae\u8f6f\u96c6\u6210\u6d4f\u89c8\u5668\uff0c\u5a92\u4f53\u64ad\u653e\u5668\u3002\u8fd8\u6709\u5373\u5c06\u7684 iOS 12 \u8981\u628a\u5e94\u7528\u5546\u5e97\u591a\u662f\u6536\u8d39\u7684 AR \u76ae\u5c3a\u653e\u5230\u5b83\u81ea\u5df1\u7cfb\u7edf\u4e2d\u6765\uff0c\u8d70\u522b\u4eba\u7684\u8def\uff0c\u8ba9\u522b\u4eba\u65e0\u8def\u53ef\u8d70\u3002\u4ece\u6b64\u4f17\u6cf0\u76ae\u5c3a\u90e8\u7684\u552f\u4e00\u7684\u751f\u4ea7\u5de5\u5177\u5c31\u4f1a\u662f\u4eba\u624b\u4e00\u90e8\u80fd\u5b89\u88c5 iOS 12 iPhone \u4e86\u3002<\/p>\n<p>JDK \u4e5f\u4e0d\u4f8b\u5916\uff0cJava 8 \u4e4b\u524d\u65e5\u671f\u5e93\u7684\u8bdd <a href=\"http:\/\/www.joda.org\/joda-time\/\">Joda-Time<\/a> \u662f\u9996\u8981\u4e4b\u9009\uff0cJava 8 \u96c6\u6210\u540e\u5e94\u8be5\u662f\u9c9c\u6709\u4eba\u95ee\u6d25\u3002\u4ee5\u5f80\u8bf4\u5230\u96c6\u5408\u64cd\u4f5c\u5e93\uff0c\u6709\u4e24\u4e2a\u9009\u62e9\uff0c\u5176\u4e00\u4e3a <a href=\"https:\/\/commons.apache.org\/proper\/commons-collections\/\">\nApache Commons Collections<\/a>\uff0c\u4e8c\u4e3a Google \u7684 <a href=\"https:\/\/github.com\/google\/guava\/wiki\">Guava<\/a>\uff0c\u5f53\u7136\u524d\u8005\u4e0e\u540e\u8005\u7ade\u4e89\u4e2d\u4e5f\u65e9\u5df2\u8d25\u4e0b\u9635\u6765\uff0c\u51b5\u4e14\u524d\u8005\u8fd8\u53d7\u5230 Java 8 \u7684\u5939\u51fb\u3002\n\u800c\u672c\u6587\u8981\u8bf4\u7684\u53ef\u4ee5\u8bf4\u662f Java 9 \u628a Guava \u4e2d\u521b\u5efa\u4e0d\u53ef\u53d8\u96c6\u5408\u7684\u65b9\u5f0f\u636e\u4e3a\u5df2\u7528\u4e86\uff0c\u76f4\u622a\u4e86\u5f53\u7684\u8bf4\uff0c\u51e1\u662f Java 9 \u540e\u6709\u521b\u5efa\u4e0d\u53ef\u53d8\u96c6\u5408\u7684\u9700\u6c42\uff0c\u53ea\u8981\u7528\u4e09\u5927\u63a5\u53e3 <code>List<\/code>\uff0c <code>Set<\/code>\uff0c<code>Map<\/code>\u00a0\u4e2d\u7684 <code>of(...)<\/code>\u00a0\u65b9\u6cd5\u5c31\u5bf9\u4e86\u3002<\/p>\n<p>Java 9 \u4e4b\u524d\uff0c\u5f53\u6211\u4eec\u9700\u8981\u96c6\u5408\u76f8\u5173\u7684\u64cd\u4f5c\uff0c\u4e24\u4e2a\u9009\u62e9\uff1a<\/p>"},{"title":"Java 9 \u7ebf\u7a0b\u6808\u904d\u5386 API","link":"https:\/\/yanbin.blog\/java-stack-walking-api\/","pubDate":"Wed, 30 May 2018 01:29:39 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-stack-walking-api\/","description":"\n<h3>\u4ec0\u4e48\u662f\u7ebf\u7a0b\u6808<\/h3>\n\u7ee7\u7eed\u7ea0\u7f20 Java 9 \u7684\u65b0\u7279\u6027\uff0c\u4ecd\u7136\u662f\u4e00\u4e2a\u8fb9\u89d2\u6599\uff0c\u5373 Java 9 \u589e\u52a0\u4e86\u5bf9\u7ebf\u7a0b\u6808\u904d\u5386\u7684 API\u3002\u90a3\u4e48\u4ec0\u4e48\u662f\u7ebf\u7a0b\u6808\uff0cJVM \u5728\u521b\u5efa\u6bcf\u4e00\u4e2a\u7ebf\u7a0b\u7684\u540c\u65f6\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u79c1\u6709\u7684\u865a\u62df\u673a\u6808\uff0c\u6bcf\u4e00\u6862\u4ee3\u8868\u7740\u4e00\u4e2a\u65b9\u6cd5\u8c03\u7528\uff0c\u6bcf\u6b21\u65b9\u6cd5\u7684\u8c03\u7528\u4e0e\u9000\u51fa\u610f\u5473\u7740\u538b\u6808\u4e0e\u51fa\u6808\u3002\u6bcf\u4e00\u6862\u4e0a\u6709\u5c40\u90e8\u53d8\u91cf\uff0c\u64cd\u4f5c\u6570\u5e38\u91cf\u5f15\u7528\u7b49\u4fe1\u606f\uff0c\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48\u5c40\u90e8\u53d8\u91cf\u662f\u80fd\u6700\u5feb\u88ab\u9500\u6bc1\u7684\u5bf9\u8c61\u3002\u8fc7\u6df1\u7684\u6808(\u6bd4\u5982\u8fc7\u591a\u7684\u9012\u5f52\u8c03\u7528) \u4f1a\u51fa\u73b0\u6211\u4eec\u7a0b\u5e8f\u5458\u8d56\u4ee5\u751f\u5b58\u7684 StackOverflow\u3002<\/p>\n<br\/>\n\u6d45\u663e\u4e9b\u8bf4\uff0c\u7ebf\u7a0b\u6808\u5c31\u662f\u901a\u5e38\u6211\u4eec\u6355\u83b7\u5230\u5f02\u5e38\u540e\uff0c\u7528 <code>e.printStackTrace()<\/code>\u00a0\u770b\u5230\u81ea main \u65b9\u6cd5\u8ffd\u6eaf\u5230\u5f53\u524d\u65b9\u6cd5\u7684\u8c03\u7528\u3002\u4f8b\u5982\uff1a<br\/>\n<blockquote>\njava.lang.RuntimeException: stack<br \/>\n\u00a0 \u00a0 at cc.unmi.TestStackWalking.m2(TestStackWalking.java:15)<br \/>\n\u00a0 \u00a0 at cc.unmi.TestStackWalking.m1(TestStackWalking.java:10)<br \/>\n\u00a0 \u00a0 at cc.unmi.TestStackWalking.main(TestStackWalking.java:6)\n<\/blockquote>\n\u8c03\u7528\u5c42\u6b21\u662f main() \u8c03\u7528 m1(), m1() \u8c03\u7528 m2(), m2() \u4e2d\u7684\u4ee3\u7801\u5982\u4e0b<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"k\">try<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">throw<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">RuntimeException<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;stack&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">catch<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"n\">ex<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"na\">printStackTrace<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u4e0a\u9762\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u5c31\u662f\u4e00\u4e2a\u6808\u6862\uff0c\u8f93\u51fa\u4e86\u5f53\u524d\u7c7b\u540d\uff0c\u65b9\u6cd5\u540d\uff0c\u4ee3\u7801\u884c\u53f7\u3002"},{"title":"\u5bf9 Java 9 \u628a\u5355\u4e2a\u4e0b\u5212\u7ebf\u4f5c\u4e3a\u5173\u952e\u5b57\u7684\u731c\u60f3","link":"https:\/\/yanbin.blog\/java-9-single-underscore-keyword-thinking\/","pubDate":"Sun, 27 May 2018 12:27:59 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-9-single-underscore-keyword-thinking\/","description":"\n<p>\u6211\u4eec\u77e5\u9053 Java \u7684\u5408\u6cd5\u547d\u540d\u662f\u4ee5\u5b57\u6bcd\u6216\u4e0b\u5212\u7ebf\u5f00\u5934\u7684\u5b57\u7b26\u4e32\uff0c\u5f53\u7136\uff0c\u4ee5\u524d\u5355\u4e2a\u4e0b\u5212\u7ebf <code>_<\/code>\u00a0\u4e5f\u662f\u4e00\u4e2a\u5408\u6cd5\u7684\u53d8\u91cf\u547d\u540d\u3002\u4f46\u662f\u81ea Java 8 \u7684\u7b2c\u4e00\u4e2a\u7248\u672c\u5f00\u59cb\uff0c\u5355\u4e2a\u4e0b\u5212\u7ebf\u7684\u53d8\u91cf\u540d\u7f16\u8bd1\u65f6\u4f1a\u6709\u8b66\u544a<\/p>\n<blockquote>\nint _ = 99;\n<\/blockquote>\n<p>\u7528 Java 8 \u7f16\u8bd1\u65f6\u63d0\u793a\u8b66\u544a\uff1a<\/p>\n<blockquote>\nTest.java:2: warning: '_' used as an identifier<br \/>\n\u00a0 \u00a0 int _ = 99; <br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0^<br \/>\n\u00a0 \u00a0 (use of '_' as an identifier might not be supported in releases after Java SE 8)<br \/>\n1 warning\n<\/blockquote>\n<p>\u8fd9\u6b63\u662f\u4e3a Java 9 \u4f5c\u7684\u9884\u8c0b\uff0c\u4ee5\u4e00\u4e2a LTS \u7248\u7684 Java 8 \u4f5c\u4e3a\u8fc7\u6e21\u3002\u56e0\u6b64\uff0c\u6765\u5230\u4e86 Java 9 \u540e\uff0c\u5355\u4e2a\u4e0b\u5212\u7ebf\u4e0d\u518d\u62c5\u5f53\u666e\u901a\u53d8\u91cf\u540d\u7684\u89d2\u8272\uff0c\u53d8\u6210\u4e86\u4e00\u4e2a\u4fdd\u7559\u5173\u952e\u5b57\uff0c\u53ea\u8bf4\u662f\u53e6\u6709\u4efb\u7528\u3002<\/p>\n<p>\u5148\u6765\u770b\u4e0b Java 9 \u4e2d\u7684\u5355\u4e2a\u4e0b\u5212\u7ebf\u53d8\u91cf\u540d\u7f16\u8bd1\u65f6\u7684\u9519\u8bef\u63d0\u793a<\/p>\n<blockquote>\nTest.java:2: error: as of release 9, '_' is a keyword, and may not be used as an identifier<br \/>\n\u00a0 \u00a0 int _ = 99; <br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0^<br \/>\n1 error\n<\/blockquote>\n<p>\u5230\u5e95\u5355\u4e0b\u5212\u7ebf\u4f1a\u4f5c\u4e3a\u4ec0\u4e48\u7528\u9014\u5462? \u5df2\u53d1\u5e03\u7684 Java 10 \u6ca1\u6709\u7ed9\u51fa\u7b54\u6848\uff0c\u6b63\u5728\u6f14\u8fdb\u4e2d\u7684 Java 11 \u4e5f\u6ca1\u6709\u76f8\u5173\u7684\u4fe1\u606f\u3002"},{"title":"Java 9 - \u5e73\u53f0\u65e5\u5fd7 API","link":"https:\/\/yanbin.blog\/java-9-platform-logging-api\/","pubDate":"Sat, 26 May 2018 12:19:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-9-platform-logging-api\/","description":"\n\u5173\u4e8e Java 9 \u7684\u65b0\u7279\u6027\u4ece\u67d0\u672c\u4e66\u7684\u6700\u540e\u4e00\u4e2a\u8bf4\u8d77\uff1a\u5e73\u53f0\u65e5\u5fd7 API\u3002\u4e2a\u4eba\u6ca1\u611f\u89c9\u8fd9\u4e2a\u6709\u4ec0\u4e48\u5b9e\u8d28\u7684\u7528\u9014\uff0c\u6240\u8c13\u7684\u5e73\u53f0\u65e5\u5fd7\u662f\u6307 JDK \u81ea\u8eab\u4ee3\u7801\uff0c\u6216\u8005\u662f JVM \u7ec4\u4ef6\u4e2d\u7684\u65e5\u5fd7\u8f93\u51fa\uff0c\u800c\u5728\u81ea\u5df1\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u4e2d\u5374\u4e0d\u4f1a\u53bb\u7528\u8fd9\u4e2a\u5e73\u53f0\u65e5\u5fd7 API\u3002\u8fd9\u4e2a\u6240\u8c13\u7684 Platform Logging API \u540d\u79f0\u7684\u610f\u4e49\u4e5f\u5c31\u662f\u5728\u8fd9\u91cc\uff0c\u5e73\u53f0\u7528\u7684\uff0c\u5728\u8bca\u65ad\u65f6\u7528\u6765\u89c2\u5bdf JDK \u7c7b\u6216 JVM \u4e2d\u7684\u65e5\u5fd7\u8f93\u51fa\uff0c\u6bd4\u5982\u5e94\u8be5\u53ef\u4ee5\u622a\u83b7\u5230\u00a0 JVM \u672c\u5730\u4ee3\u7801\u5b9e\u73b0\u4e2d\u7684\u65e5\u5fd7\u8f93\u51fa\u3002\u5bf9\u6211\u4eec\u5728\u9879\u76ee\u4e2d\u5982\u4f55\u5904\u7406\u65e5\u5fd7\u5e76\u4e0d\u4f1a\u6709\u4ec0\u4e48\u5f71\u54cd\uff0c\u8be5\u600e\u4e48\u8fd8\u662f\u600e\u4e48\uff0c\u4e0d\u8fc7\u4e86\u89e3\u591a\u4e00\u70b9\u4e1c\u897f\u5e94\u8be5\u4e0d\u4f1a\u6d6a\u8d39\u8111\u5bb9\u91cf\u7684\u3002<br\/><br\/>\n\u65b0\u52a0\u7684\u5e73\u53f0\u65e5\u5fd7\u4f53\u73b0\u5728 <code>java.lang.System<\/code>\u00a0\u4e2d\u65b0\u52a0\u7684\u51e0\u4e2a\u65b9\u6cd5\u548c\u7c7b<br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2018\/java-9-platform-logging-api\/java9-platform-logging-1.png\"\nwidth=\"558px\"\n\/>\n\u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u7740\u5728\u4ee3\u7801\u4f7f\u7528\u4e00\u4e0b\u5b83<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">Logger<\/span><span class=\"w\"> <\/span><span class=\"n\">logger<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">getLogger<\/span><span class=\"p\">(<\/span><span class=\"n\">TestLogging<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">.<\/span><span class=\"na\">getName<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"na\">log<\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">Logger<\/span><span class=\"p\">.<\/span><span class=\"na\">Level<\/span><span class=\"p\">.<\/span><span class=\"na\">INFO<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Hello Java 9 Platform Logging API&#34;<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8f93\u51fa\u5982\u4e0b<br\/>\n<blockquote>\nMay 26, 2018 10:56:51 AM cc.unmi.TestLogging main<br \/>\nINFO: Hello Java 9 Platform Logging API\n<\/blockquote>"},{"title":"\u8be5\u5982\u4f55\u4ece Java 8 \u5347\u7ea7\u5230 Java 10","link":"https:\/\/yanbin.blog\/how-to-upgrade-from-java-8-to-10\/","pubDate":"Wed, 23 May 2018 02:18:33 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/how-to-upgrade-from-java-8-to-10\/","description":"\nJava 9 \u51fa\u6765\u4e86\u5f88\u4e45\uff0c\u4e70\u7684\u4e66\u300aJava 9 Revealed - For Earyly Adoption and Migration\u300b\uff0c\u8bf4\u600e\u4e48\u8fc1\u79fb\u5230 Java 9\uff0c\u53ef\u662f\u7a81\u7136\u95f4 Java 9 \u5c31\u65e0\u6cd5\u901a\u8fc7\u6b63\u5e38\u6e20\u9053\u4ece Oracle \u5b98\u7f51\u4e0b\u8f7d\u4e86\uff0c\u8fd9\u4e66\u8fd8\u8ba9\u4e0d\u8ba9\u4eba\u770b\u3002\u5f53\u7136\u8981\u770b\uff0c\u56e0\u4e3a\u5c3d\u7ba1 Java 10 \u51fa\u6765\u4e86\uff0c\u4f46\u5b9e\u9645\u7684\u53d8\u5316\u5168\u538b\u5728 Java 9 \u8fd9\u4e2a\u7248\u672c\u4e0a\u7684\uff0c\u5c31\u5f53\u662f\u901a\u8fc7 Java 10 \u6765\u5b66\u4e60 Java 9 \u5427\u3002<\/p>\n<br\/>\n\u672c\u6587\u968f\u4fbf\u8bf4\u8bf4 Java 8 \u4e4b\u540e\u7684\u7248\u672c\u53d8\u8fc1\uff0c\u4e0d\u6d89\u53ca Java 9 \u6216\u662f Java 10 \u7684\u5177\u4f53\u65b0\u7279\u6027\uff0c\u5e76\u4e0d\u80fd\u56de\u7b54\u6807\u9898\u4e2d\u7684\u95ee\u9898\u3002\u4f5c\u4e3a\u4e00\u4e2a\u4e0d\u7518\u843d\u540e\u7684 IT \u4ece\u4e1a\u4eba\u5458\uff0c\u603b\u662f\u5e0c\u671b\u80fd\u7d27\u8ddf\u6280\u672f(\u67d0\u4e00\u72ed\u5c0f\u7279\u5b9a\u9886\u57df\u7684\u6280\u672f)\u7684\u6b65\u4f10\u3002\u8b6c\u5982\u8bf4\u5f53\u4ece Java 1.4 \u5347\u7ea7\u5230 Java 1.5 \u4e4b\u540e\uff0c\u5bf9\u8303\u578b\u4e5f\u662f\u8dc3\u8dc3\u6b32\u8bd5\uff0c\u65e0\u5948\u5f53\u65f6\u516c\u53f8\u8ffd\u6c42\u7684\u662f\u7a33\u5b9a\u538b\u5012\u4e00\u5207\uff0c\u4e0d\u5728\u670d\u52a1\u5668\u4e0a\u5347\u7ea7 JDK\uff0c\u6240\u4ee5\u53ea\u80fd\u521b\u9020\u6761\u4ef6\u4e5f\u8981\u4e0a\u3002\u4e8e\u662f\u5f04\u4e86\u4e2a\u00a0<a href=\"https:\/\/yanbin.blog\/retrotranslator-jdk15-run-in-jvm14\/\">Retrotranslator\u8ba9\u4f60\u7528JDK1.5\u7684\u7279\u6027\u5199\u51fa\u7684\u4ee3\u7801\u80fd\u5728JVM1.4\u4e2d\u8fd0\u884c<\/a> \u6765\u9002\u914d\u3002<br\/><br\/>\n\u540e\u6765\u7684\u516c\u53f8\uff0c\u4e5f\u5c31\u662f\u73b0\u5728\u66f4\u4e3a\u6fc0\u8fdb\u4e00\u4e9b\uff0c\u6765\u4e86 JDK 6\uff0c\u8ddf; JDK 7\uff0c\u8ddf; JDK 8, \u7ee7\u7eed\u8ddf; JDK 9 \u53d1\u5e03\u540e\uff0c\u4e0d\u8ddf\u4e86\u3002\u4e0d\u662f\u4e0d\u60f3\u8ddf\uff0c\u800c\u662f Java 9 \u5b9e\u5728\u662f\u53d8\u5316\u6709\u70b9\u5927\uff0c\u6a21\u5757\u5316\u5e26\u6765\u7684\u4e0d\u4ec5\u4ec5\u8bed\u8a00\u65b9\u9762\u7684\u6539\u53d8\uff0c\u800c\u662f\u5f71\u54cd\u5230\u5982\u4f55\u7ec4\u7ec7\uff0c\u53d1\u5e03\u5e94\u7528\uff0c\u8fd9\u4e5f\u5c31\u662f\u4e3a\u4ec0\u4e48 jigsaw \u96ea\u85cf\u591a\u5e74\u7684\u7f18\u6545\u3002\u5176\u5b9e\u4e5f\u53ef\u4ee5\u5bf9\u6a21\u5757\u5316\u4e0d\u6b32\u7406\u4f1a\uff0c\u4f46\u662f\u5355\u7eaf\u7684\u628a Java 8 \u6362\u6210 Java 9 \u9020\u6210\u539f\u6765\u7684\u9879\u76ee\u4e0d\u80fd\u6b63\u5e38\u6784\u5efa\u7684\u6982\u7387\u4e5f\u6bd4\u4ee5\u5f80\u8981\u9ad8\u3002<br\/><br\/>\nJava 8 \u662f 2014 \u5e74 3 \u6708\u53d1\u5e03\uff0c\u56db\u540e\u534a\u540e\u7684 Java 9 \u5728 2017 \u5e74 9 \u6708\u53d1\u5e03\uff0c\u7136\u800c 2018 \u5e74 3 \u6708 Java 10 \u5c31\u51fa\u6765\u4e86\u3002\u8c01\u8bf4 Oracle \u5728\u6536\u8d2d Java \u540e\u5c31\u5bf9\u5b83\u4e0d\u4f5c\u4e3a\u4e86\u5462\uff1fOracle \u5728 Java 9 \u4e4b\u540e\u5f00\u59cb\u4e86 6 \u4e2a\u6708\u7684\u53d1\u5e03\u5468\u671f(\u89c1 <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/eol-135779.html\">Oracle Java SE Support Roadmap<\/a>)\uff0c\u8fd9\u8ba9\u4eba\u5982\u4f55\u53d7\u5f97\u4e86\uff0cOracle \u81ea\u5df1\u4e5f\u662f\u3002\u66f4\u4f55\u51b5\u6211\u4eec\u90fd\u6ca1\u6765\u5f97\u6025\u54c1\u5c1d Java 9 \u7684\u6ecb\u5473\uff0cOracle \u81ea\u5df1\u5c31\u628a Java 9 \u7684\u751f\u547d\u5468\u671f\u7ed9\u7ed3\u675f\u4e86\uff0c\u8fdb\u5230 Java 9 \u7684\u4e0b\u8f7d\u800c\u9762 <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/downloads\/jdk9-downloads-3848520.html\">Java SE 9 Downloads<\/a>, \u81ea\u52a8\u4f1a\u5bfc\u5411\u5230 Java SE 10 \u7684\u4e0b\u8f7d\u9875\u9762\uff0c\u60f3\u8981\u4e0b\u8f7d Java SE 9 \u7684\u8bdd\uff0c\u53ea\u80fd\u5230\u5386\u53f2\u5b58\u6863\u4e2d\u53bb\u627e <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/downloads\/java-archive-javase9-3934878.html\">Java SE 9 Archive Downloads<\/a>\u3002"},{"title":"\u4f7f\u7528 SQL Server \u7684 uniqueidentifier \u5b57\u6bb5\u7c7b\u578b","link":"https:\/\/yanbin.blog\/use-sql-server-uniqueidentifier-data-type\/","pubDate":"Fri, 18 May 2018 23:20:30 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/use-sql-server-uniqueidentifier-data-type\/","description":"\nSQL Server \u81ea 2008 \u7248\u8d77\u5f15\u5165\u4e86 <code>uniqueidentifier<\/code>\u00a0\u5b57\u6bb5\uff0c\u5b83\u5b58\u50a8\u7684\u662f\u4e00\u4e2a UUID, \u6216\u8005\u53eb GUID\uff0c\u5185\u90e8\u5b58\u50a8\u4e3a 16 \u4e2a\u5b57\u8282\u3002SQL Server \u53ef\u7528\u4e24\u4e2a\u51fd\u6570\u6765\u751f\u6210 <code>uniqueidentifier<\/code>, \u5206\u522b\u662f <code>NEWID()<\/code>\u00a0\u548c <code>NEWSEQUENTIALID()<\/code>, \u540e\u8005\u53ea\u80fd\u7528\u4f5c\u5b57\u6bb5\u7684\u9ed8\u8ba4\u503c\u3002Java \u4e5f\u6709\u4e00\u4e2a UUID \u5de5\u5177\u7c7b <code>java.uti.UUID<\/code>, <code>UUID.randomUUID().toString()<\/code>\u00a0\u751f\u6210\u4e00\u4e2a\u968f\u673a\u7684 UUID \u5b57\u7b26\u4e32\uff0c\u5728 <code>java.util.UUID<\/code>\u00a0\u4e5f\u662f\u7528\u4e24\u4e2a <code>long<\/code>\u00a0\u5b57\u6bb5\u8868\u793a\u5185\u90e8\u72b6\u6001\u3002<br\/><br\/>\nSQL Server \u7684 <code>uniqueidentifier<\/code>\u00a0\u7c7b\u578b\u5b57\u6bb5\u8868\u660e\u4e86\u5185\u90e8\u5982\u4f55\u5b58\u50a8\uff0c\u5728\u6211\u4eec\u64cd\u4f5c\u5b83\u65f6\uff0c\u5b83\u7684\u5916\u5728\u8868\u73b0\u5f62\u5f0f\u90fd\u662f\u4e00\u4e2a\u56fa\u5b9a\u683c\u5f0f `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` \u7684\u5b57\u7b26\u4e32\uff0c\u4e0d\u533a\u5206\u5927\u5c0f\u5199\u7684\u3002<br\/><br\/>\n\u672c\u6587\u6240\u4f7f\u7528\u7684 SQL Server \u662f 2017 \u7248\uff0c\u901a\u8fc7 Docker \u6765\u542f\u52a8\u7684<br\/>\n<blockquote>\ndocker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d microsoft\/mssql-server-linux:2017-latest\n<\/blockquote>\n\u7136\u540e\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u5e26\u6709 <code>uniqueidentifier<\/code>\u00a0\u7c7b\u578b\u5b57\u6bb5\u7684\u8868"},{"title":"Mockito \u4e5f\u80fd Mock final \u7c7b\u548c final \u65b9\u6cd5\u4e86","link":"https:\/\/yanbin.blog\/mockito-mock-final-class-final-method\/","pubDate":"Mon, 14 May 2018 22:58:28 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-mock-final-class-final-method\/","description":"\n\u4ee5\u5b9e\u9645 Java \u9879\u76ee\u4e2d\u7684\u5355\u5143\u6d4b\u8bd5 Mock \u6846\u67b6\u57fa\u672c\u662f Mockito 2 \u4e86\uff0c\u56e0\u4e3a\u5b83\u6709\u4e00\u4e2a\u5341\u5206\u6d41\u7545\u7684 API\u3002Mockito\u00a0 2\u4e5f\u4e3a JUnit 5 \u914d\u4e0a\u4e86 MockitoExtension, \u6240\u4ee5 JUnit 5 \u4e0b\u4f7f\u7528 Mockito 2 \u7684\u5173\u8282\u4e5f\u6253\u901a\u4e86\u3002\u4f46\u5728\u6211\u4eec\u4eab\u53d7 Mockito 2 \u4fbf\u5229\u7684\u540c\u65f6\uff0c\u4e0e JMockit \u76f8\u6bd4\u5c40\u9650\u6027\u5c31\u5f88\u660e\u663e\uff0c\u56e0\u4e3a Mockito 2 \u662f\u901a\u8fc7\u521b\u5efa\u533f\u540d\u5b50\u7c7b\u6765\u8fdb\u884c Mock \u7684\uff0c\u6240\u4ee5\u4efb\u4f55\u5b50\u7c7b\u5bf9\u7236\u7c7b\u65e0\u6cd5\u7a81\u7834\u7684\u65b9\u9762\u5b83\u90fd\u5b58\u5728\u3002\u8b6c\u5982\uff0cfinal \u7c7b, final \u65b9\u6cd5, \u79c1\u6709\u65b9\u6cd5, \u9759\u6001\u65b9\u6cd5, \u6784\u9020\u51fd\u6570\u90fd\u662f\u65e0\u6cd5\u901a\u8fc7\u5b50\u7c7b\u578b\u8fdb\u884c\u91cd\u5199\u7684\u3002\u6240\u4ee5\u9664\u975e\u7279\u522b\u9700\u8981\uff0c\u5728 Mockito 2 \u65e0\u6cd5\u80dc\u4efb\u65f6\u90fd\u6c42\u52a9\u4e8e JMockit\uff0cJMockit \u501f\u52a9\u4e8e javaagent \u53d6\u5f97\u4e86 JVM \u7684\u9ad8\u63a7\u5236\u6743\u624d\u5f97\u5df2\u4e3a\u6240\u6b32\u4e3a\u3002<\/p>\n<br\/>\n\u5f53 Mockito \u6765\u5230\u4e86 2.1.0 \u7248\u672c\uff0c\u5b83\u4e5f\u89c9\u5f97\u4e0d\u80fd\u5bf9\u4ee5\u4e0a\u6240\u6709\u7684\u9650\u5236\u7f6e\u82e5\u7f54\u95fb, \u9996\u5148\u5e26\u7ed9\u6211\u4eec\u7684\u7a81\u7834\u662f\u5b83\u4e5f\u53ef\u4ee5 Mock final \u7c7b\u548c final \u65b9\u6cd5\uff0c\u867d\u7136\u4ecd\u5904\u4e8e\u5b75\u5316\u5668\u4e2d\uff0c\u4f46\u6bd5\u7adf\u662f\u5e94\u7528\u5728\u5355\u5143\u6d4b\u8bd5\u4e2d\uff0c\u80fd\u7528\u5c31\u5f88\u4e0d\u9519\u4e86\uff0c\u53ea\u8981\u4ee5\u540e\u4e0d\u88ab\u62ff\u8d70\u5c31\u884c\u3002\u8fd9\u662f\u5b98\u65b9\u5bf9\u5b83\u7684\u4ecb\u7ecd <a href=\"https:\/\/github.com\/mockito\/mockito\/wiki\/What's-new-in-Mockito-2#mock-the-unmockable-opt-in-mocking-of-final-classesmethods\">Mock the unmockable: opt-in mocking of final classes\/methods<\/a><br\/><br\/>\n\u4e0b\u9762\u6211\u4eb2\u81ea\u64cd\u4f5c\u4e00\u904d\uff0c\u5e76\u7ed9\u51fa\u66f4\u5168\u65b9\u4f4d\u7684\u6d4b\u8bd5\u6837\u4f8b"},{"title":"JUnit 5 \u4f7f\u7528 Mockito 2 \u8fdb\u884c\u6d4b\u8bd5","link":"https:\/\/yanbin.blog\/junit-5-work-with-mockito-2\/","pubDate":"Sun, 13 May 2018 17:11:57 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-5-work-with-mockito-2\/","description":"\nJUnit 5 \u521a\u51fa\u6765\u90a3\u65f6\uff0c\u4e5f\u5c31\u662f\u7b2c\u4e00\u4e2a\u7248\u672c 5.0.0 \u65f6\uff0c\u8fd8\u4e0d\u80fd\u5f88\u597d\u7684\u652f\u6301 Mockito \u7684\u6d4b\u8bd5\uff0c\u56e0\u4e3a Mockito \u6ca1\u80fd\u8ddf\u5f97\u90a3\u4e48\u7d27\u5bc6\u3002\u90a3\u65f6\u5019 JUnit 5 \u53ea\u80fd\u8bd5\u9a8c\u6027\u7684\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6781\u4e0d\u6b63\u5f0f\u7684 <a href=\"https:\/\/github.com\/junit-team\/junit5-samples\/blob\/master\/junit5-mockito-extension\/src\/main\/java\/com\/example\/mockito\/MockitoExtension.java\">com.example.mockito.MockitoExtension<\/a>, \u770b\u90a3\u5305\u540d\u5c31\u77e5\u9053\u4e0d\u662f\u6765\u771f\u7684\uff0c\u6240\u4ee5\u51b3\u5b9a\u518d\u7b49\u3002JUnit 5 \u4e0d\u518d\u539f\u751f\u652f\u6301 JUnit 4 \u7684 Rule\uff0c\u4e00\u5207\u90fd\u5c06\u662f Extension\uff0c\u90a3\u4e5f\u662f\u8981\u6c42 Mockito \u80fd\u591f\u4e0e\u4e4b\u4ff1\u8fdb\u3002\u73b0\u5728\u7b49\u6765\u4e86\uff0cJUnit 5 \u8fdb\u5316\u5230\u4e86 5.2.0, Mockito \u4e5f\u65e9\u5df2\u6709\u4e86\u4e00\u4e2a\u5355\u72ec\u7684\u6a21\u5757 <code>mockito-junit-jupiter<\/code>\u00a0\u6765\u8fce\u63a5\u5b83\u3002<\/p>\n<br\/>\n\u5728 Mockito 2.1.0 \u7684 <a href=\"https:\/\/github.com\/mockito\/mockito\/wiki\/What%27s-new-in-Mockito-2#improvements\">What's new in Mockito 2<\/a> \u4e2d\u8bb0\u8ff0\u4e86 JUnit 5 \u4e3a Mockito 2 \u5f00\u53d1\u4e86\u4e00\u4e2a MockitoExtension\u3002\u8ffd\u6eaf\u5230 Mockito 2 \u7684 Release Notes, \u6211\u4eec\u53d1\u73b0 Mockito 2 \u5b98\u65b9\u6700\u65e9\u5f15\u5165 MockitoExtension \u7684\u7248\u672c\u662f 2.16.3(2018-03023)\u3002\u6211\u5bf9 Mockito \u5bf9 JUnit 5 \u652f\u6301\u7684\u6700\u65b0\u66f4\u65b0\u662f\u4ece\u8fd9\u4e2a Pull Request <a href=\"https:\/\/github.com\/mockito\/mockito\/pull\/1221\">MockitoExtension for JUnit5<\/a> \u5f97\u77e5\u7684\u3002<br\/><br\/>\n\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\u73b0\u5728\u7684 Mockito 2 \u6709\u539f\u751f\u6001\u7684 MockitoExtension \u6765\u652f\u63f4 JUnit 5, \u53ef\u4ee5\u975e\u5e38\u653e\u5fc3\u53ef\u9760\u7684\u8ba9 JUnit 5 \u548c Mockito 2 \u4e00\u8d77\u7a33\u5b9a\u5de5\u4f5c\u3002\u56e0\u6b64\u524d\u9762\u90a3\u4e2a\u5305\u540d\u5e26 <code>example<\/code>\u00a0\u5b57\u6837\u7684 MockitoExtension \u94fe\u63a5\u4e5f\u5c31\u65e0\u6548\u4e86\u3002"},{"title":"\u5e76\u53d1(Concurrent) \u4e0e\u5e76\u884c(Parallel) \u7684\u533a\u522b","link":"https:\/\/yanbin.blog\/different-between-concurrent-and-parallel\/","pubDate":"Fri, 09 Feb 2018 01:21:10 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/different-between-concurrent-and-parallel\/","description":"\n<p>\u521a\u5f00\u59cb\u9605\u8bfb \u300aAkka IN ACTION\u300b\u8fd9\u672c\u4e66\uff0c\u521a\u5f00\u59cb\u662f\u5bf9 <code>Revolution<\/code>\u00a0\u8fd9\u4e2a\u8bcd\u7ffb\u8bd1\u6210\u4e2d\u6587\u662f<code>\u9769\u547d<\/code>\u00a0\u611f\u5230\u8be7\u5f02\uff0c\u56e0\u4e3a<code>\u9769\u547d<\/code>\u00a0\u901a\u4fd7\u6765\u8bb2\u5c31\u662f <code>\u6740\u4eba<\/code>\u00a0\u7684\u610f\u601d\u3002\u81f3\u4e8e <code>Revolution<\/code>\u00a0\u82f1\u6587\u89e3\u91ca\u4e0d\u6df1\u7a76\u4e86\uff0c\u53ea\u662f\u611f\u53f9\u4f55\u4ee5\u98a0\u8986\u6027\u7684\u53d8\u5316\u5c31\u4e00\u5b9a\u8981\u6740\u4eba\u5417\uff1f<\/p>\n<p>\u4e5f\u7531\u6b64\u5f15\u51fa\u4e86\u7f16\u7a0b\u4e2d\u7ecf\u5e38\u9762\u5bf9\u7684 <code>Concurrent<\/code>(\u540d\u8bcd\u4e3a\uff1aConcurrency)\u00a0\u548c <code>Parallel<\/code>(\u540d\u8bcd\u4e3a\uff1aParallelism)\u00a0\u8fd9\u4e24\u4e2a\u8bcd\uff0c\u57fa\u672c\u4e0a\u662f\u8ba4\u4e3a\u5b83\u4eec\u662f\u540c\u4e00\u4e2a\u610f\u601d\u3002\u5176\u5b9e\u4e0d\u7136\uff0c\u4e0b\u9762\u6162\u6162\u9053\u6765\u3002<\/p>\n<p>\u5982\u679c\u4ece\u82f1\u6587\u5b57\u5178\u5bf9\u5b83\u4eec\u7684\u89e3\u91ca\u4e5f\u6ca1\u6709\u591a\u5927\u533a\u522b\uff0c\u5dee\u4e0d\u591a\u90fd\u662f\u8bf4\u540c\u662f\u53d1\u751f\uff0c\u4f46\u5b57\u9762\u4e0a <code>Parallel<\/code>\u00a0\u591a\u4e86\u4e00\u4e2a\u5e73\u884c\u7684\u610f\u601d\u3002\u6240\u4ee5\u5728\u4e2d\u6587\u4e0a\uff0c\u5728\u8ba1\u7b97\u673a\u9886\u57df\u6211\u4eec\u7ea6\u5b9a\u7684\u7ffb\u8bd1\u662f<\/p>\n<ul>\n<li>Concurrent(Concurrency)\u00a0 --\u00a0 \u5e76\u53d1<\/li>\n<li>Parallel(Parallelism)\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0--\u00a0 \u5e76\u884c<\/li>\n<\/ul><br\/>\n<p>\u6bd4\u5982\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\u5b83\u4eec\u7684\u533a\u522b\u5177\u4f53\u4f53\u73b0\u5728\uff1a<\/p>\n<p><span style=\"color: #0000ff;\"><strong>\u5e76\u53d1<\/strong><\/span>\uff1a\u591a\u4e2a\u4efb\u52a1\u5728\u540c\u4e00\u4e2a CPU\u00a0\u6838\u4e0a\u6309\u7ec6\u5206\u7684\u65f6\u95f4\u7247\u8f6e\u6d41(\u4ea4\u66ff)\u6267\u884c\uff0c\u4ece\u903b\u8f91\u4e0a\u6765\u770b\u90a3\u4e9b\u4efb\u52a1\u662f\u540c\u65f6\u6267\u884c\u3002\u9488\u5bf9 CPU\u00a0\u5185\u6838\u6765\u8bf4\uff0c\u4efb\u52a1\u4ecd\u7136\u662f\u6309\u7ec6\u7c92\u5ea6\u7684\u4e32\u884c\u6267\u884c\u3002\u4e5f\u96be\u602a\u5728 Java 5\u00a0\u4e2d\u65b0\u52a0\u7684\u5e76\u53d1 API\u00a0\u7684\u5305\u540d\u662f <code>java.uti.concurrent<\/code>\u3002"},{"title":"\u4f7f\u7528 Mockito \u7684 @InjectMocks \u521b\u5efa\u88ab\u6d4b\u8bd5\u7c7b\u5b9e\u4f8b","link":"https:\/\/yanbin.blog\/mockito-injectmocks-initialize-tested-instance\/","pubDate":"Thu, 01 Feb 2018 23:26:28 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-injectmocks-initialize-tested-instance\/","description":"\n<p>\u521d\u8bc6 Mockito \u8fd9\u4e2a\u6d4b\u8bd5\u6846\u67b6\u540e\uff0c\u6211\u4eec\u8981\u4f7f\u7528 Mock \u7684\u5c5e\u6027\u521b\u5efa\u4e00\u4e2a\u88ab\u6d4b\u8bd5\u7c7b\u5b9e\u4f8b\u65f6\uff0c\u5927\u6982\u4f1a\u4e0b\u9762\u8fd9\u4e48\u7eaf\u624b\u5de5\u6765\u6253\u9020\u3002<\/p>\n<p>\u5047\u5b9a\u7c7b <code>UserService<\/code> \u6709\u4e00\u4e2a\u5c5e\u6027 <code>UserDao userDao<\/code>, \u9700\u8981\u6784\u9020 <code>UserService<\/code> \u5b9e\u4f8b\u65f6 Mock \u5185\u90e8\u72b6\u6001<\/p>\n<blockquote>\nUserDao userDao = Mockito.mock(UserDao.class);<br \/>\nUserService testMe = new UserService(userDao);\n<\/blockquote>\n<p>\u5982\u6b64\uff0cuserDao \u7684\u884c\u4e3a\u5c31\u53ef\u4ee5\u81ea\u7531\u6a21\u62df\u4e86\uff0c\u8fd9\u79cd\u7eaf\u624b\u5de5\u65b9\u5f0f\u90fd\u4e0d\u9700\u8981\u7ed9\u6d4b\u8bd5\u7c7b\u6dfb\u52a0<\/p>\n<blockquote>\n@RunWith(MockitoJunitRuner.class)<br \/>\n\/\/\u6216<br \/>\nMockitoAnnotations.initMocks(this);\n<\/blockquote>\n<p>\u56e0\u4e3a\u4e0a\u9762\u4e24\u53e5\u662f\u7ed9 Mockito \u7684\u6ce8\u89e3\u4f7f\u7528\u7684\u3002<\/p>\n<p>\u5982\u679c\u6240\u6709\u7684 Mock \u5bf9\u8c61\u5168\u90e8\u901a\u8fc7\u624b\u5de5\u6765\u521b\u5efa\uff0c\u90a3\u5c31\u4e0d\u5bb9\u6613\u4f53\u73b0\u51fa Mockito \u7684\u4f18\u8d8a\u6027\u51fa\u6765\u3002\u56e0\u6b64\u5bf9\u4e8e\u88ab\u6d4b\u8bd5\u5bf9\u8c61\u7684\u521b\u5efa\uff0cMock \u5c5e\u6027\u7684\u6ce8\u5165\u5e94\u8be5\u8ba9 <code>@Mock<\/code> \u548c <code>@InjectMocks<\/code> \u8fd9\u4e24\u4e2a\u6ce8\u89e3\u5927\u663e\u8eab\u624b\u4e86\u3002<\/p>\n<p>\u6807\u6ce8\u5728\u5b9e\u4f8b\u53d8\u91cf\u4e0a\u7684 <code>@Mock<\/code> \u76f8\u5f53\u4e8e\u662f <code>Mockito.mock(Class)<\/code> \u521b\u5efa\u4e86\u4e00\u4e2a Mock \u5bf9\u8c61\uff0c\u800c <code>@InjectMock<\/code> \u6807\u7684\u5b9e\u4f8b\u4f1a\u5bfb\u627e\u5230\u76f8\u5e94 Mock \u5c5e\u6027\u60f3\u6cd5\u6784\u9020\u51fa\u88ab\u6d4b\u8bd5\u7c7b\u7684\u5b9e\u4f8b\u3002\u770b\u4e0b\u9762\u7684\u4f8b\u5b50\uff1a"},{"title":"\u7528 PreparedStatement \u5411 SqlServer \u4e2d\u4e00\u6b21\u6027\u63d2\u5165\u591a\u6761\u8bb0\u5f55","link":"https:\/\/yanbin.blog\/sqlserver-insert-multiple-rows-onetime\/","pubDate":"Tue, 05 Dec 2017 01:56:44 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/sqlserver-insert-multiple-rows-onetime\/","description":"\n\u6807\u51c6 SQL\u00a0\u90fd\u63d0\u4f9b\u4e86\u4e0b\u9762\u8fd9\u79cd\u65b9\u5f0f\u4e00\u6761 INSERT INTO\u00a0\u8bed\u53e5\u63d2\u5165\u591a\u6761\u8bb0\u5f55<\/p>\n<blockquote>\n<p class=\"p1\"><span class=\"s1\">INSERT<\/span> <span class=\"s1\">INTO<\/span> Customers(Id, Name, Age) <span class=\"s1\">VALUES<\/span> (<span class=\"s2\">1<\/span>, <span class=\"s3\">'Name1'<\/span>, <span class=\"s2\">21<\/span>.<span class=\"s2\">5<\/span>), (<span class=\"s2\">2<\/span>, <span class=\"s3\">'Name2'<\/span>, <span class=\"s2\">32<\/span>.<span class=\"s2\">3<\/span>)<\/p>\n<\/blockquote>\nVALUES\u00a0\u4e4b\u540e\u7528\u62ec\u53f7\u5217\u51fa\u6bcf\u4e00\u6761\u8bb0\u5f55\u3002\u4f46\u662f\u5728 Java\u00a0\u4e2d\u60f3\u628a\u4e0a\u9762\u7684\u8bed\u53e5\u8f6c\u6362\u6210 PreparedStatement\u00a0 \u6765\u63d2\u5165\u591a\u6761\u8bb0\u5f55\u65f6\u5c31\u6709\u4e9b\u95ee\u9898\u3002\u8981\u4e48\u5199\u6210<br\/>\n<blockquote>\nINSERT INTO Customers(Id, Name, Age) VALUES(?, ?, ?), (?, ?, ?), (?, ?, ?) ....\n<\/blockquote>\n\u6211\u4eec\u4e0d\u77e5\u9053 VALUES\u00a0\u540e\u5e94\u8be5\u5217\u591a\u5c11\u4e2a\u95ee\u53f7\uff0c\u800c\u4e14\u00a0 JDBC\u00a0\u5bf9\u53c2\u6570\u7684\u4e2a\u6570\u662f\u6709\u9650\u5236\u7684\uff0c\u6700\u591a 2000\u00a0\u4e2a\u53c2\u6570\u3002\u5982\u679c\u6839\u636e\u5b57\u6bb5\u4e2a\u6570\u6765\u7b97\u4e00\u6b21\u6dfb\u52a0\u591a\u5c11\u6761\u8bb0\u5f55\uff0c\u90a3\u4e48\u8fd9\u6761\u00a0SQL\u00a0\u8bed\u53e5\u4e5f\u662f\u52a8\u6001\u7684\uff0c\u4e0d\u80fd\u5f88\u597d\u7684\u4f5c\u4e3a PreparedStatement\u00a0\u8fdb\u884c\u9884\u7f16\u8bd1\u3002\u4ee5\u4e00\u4e2a\u8868\u4e09\u4e2a\u5b57\u6bb5\u4e3a\u4f8b\uff0c2000\u00a0\u4e2a\u53c2\u6570\u4e0b\u4e00\u6b21\u6027\u6700\u591a\u80fd\u63d2\u5165\u8bb0\u5f55\u6570 666\u00a0\u6761\uff0c\u4e5f\u53ef\u80fd\u7531\u4e8e\u8f93\u5165\u662f 666\u00a0\u6761\u8bb0\u5f55\u7684\u4efb\u610f\u6570\u91cf\uff0c\u6240\u4ee5\u751f\u6210\u7684\u8bed\u53e5\u975e\u9759\u6001\u7684\u3002<br\/><br\/>\n\u8fd9\u79cd\u65b9\u5f0f\u4e0e\u6bcf\u6b21\u624b\u52a8\u62fc\u51d1\u4e00\u4e2a\u5b8c\u5168\u9759\u6001\u7684 INSERT INTO\u00a0\u8bed\u53e5\u5e94\u8be5\u4e0d\u4f1a\u6709\u592a\u591a\u7684\u5dee\u522b\u3002<br\/><br\/>\n\u5982\u679c\u53ea\u662f\u5199\u6210\u00a0<br\/>\n<blockquote>\nINSERT INTO Customers(Id, Name, Age) VALUES(?, ?, ?)\n<\/blockquote>\n\u7136\u540e\u8bd5\u56fe\u8fdb\u884c\u4e0b\u9762\u7684\u64cd\u4f5c"},{"title":"JMockit \u4e2d\u88ab Mocked \u7684\u5bf9\u8c61\u5c5e\u6027\u53ca\u65b9\u6cd5\u7684\u9ed8\u8ba4\u503c","link":"https:\/\/yanbin.blog\/jmockit-mocked-object-default-field-method-values\/","pubDate":"Sun, 12 Nov 2017 01:03:40 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-mocked-object-default-field-method-values\/","description":"\n\u524d\u811a\u7814\u7a76\u5b8c\u00a0<a href=\"https:\/\/yanbin.blog\/mockito-mocked-default-fields-method-returns\">Mockito \u4e2d\u88ab Mocked \u7684\u5bf9\u8c61\u5c5e\u6027\u53ca\u65b9\u6cd5\u7684\u9ed8\u8ba4\u503c<\/a>, \u867d\u7136\u76ee\u4eca\u66f4\u591a\u7684\u662f\u62e5\u62b1\u7740 Mockito, \u4f46\u603b\u6709\u65f6\u5bf9 JMockit \u4e5f\u4f1a\u6324\u7709\u5f04\u773c\uff0c\u8c01\u53eb JMockit \u65e0\u6240\u4e0d\u80fd\u5462\uff01\u88ab Mockito \u7684 Mock \u5bf9\u8c61\u65b9\u6cd5\u7684\u9ed8\u8ba4\u8fd4\u56de\u503c\u6d17\u8111\u4e4b\u540e\uff0c\u8fdb\u800c\u89c9\u5bdf\u51fa JMockit \u5e94\u8be5\u6709\u540c\u6837\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002<\/p>\n<br\/>\n\u7ecf\u8fc7\u7c7b\u4f3c\u7684\u6d4b\u8bd5\uff0c\u8fd9\u91cc\u4e0d\u8be6\u7ec6\u5217\u51fa\u6d4b\u8bd5\u8fc7\u7a0b\uff0c\u53ea\u662f\u5728\u57fa\u4e8e\u524d\u7bc7\u7684\u6d4b\u8bd5\u4e2d\u52a0\u5165 JMockit \u7684\u4f9d\u8d56\uff0c\u6700\u65b0\u7248\u662f 1.36\u3002\u6d4b\u8bd5\u7c7b MyClassTest \u4e2d\u4f7f\u7528<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nd\">@Mocked<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">MyClass<\/span><span class=\"w\"> <\/span><span class=\"n\">myClass<\/span><span class=\"p\">;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6765\u6784\u9020 MyClass \u7684 mock \u5bf9\u8c61 myClass, \u5176\u4f59\u4ee3\u7801\u662f\u4e00\u6837\u7684\u3002\u76f8\u5173\u4ee3\u7801\u8bf7\u524d\u5f80\u4e0a\u7bc7\u00a0<a href=\"https:\/\/yanbin.blog\/mockito-mocked-default-fields-method-returns\">Mockito \u4e2d\u88ab Mocked \u7684\u5bf9\u8c61\u5c5e\u6027\u53ca\u65b9\u6cd5\u7684\u9ed8\u8ba4\u503c<\/a>\u00a0\u4e2d\u627e\u3002 \u4f7f\u7528 JMockit \u540e\u8dd1\u51fa\u6765\u7684\u6548\u679c\u5982\u4e0b\uff1a"},{"title":"Mockito \u4e2d\u88ab Mocked \u7684\u5bf9\u8c61\u5c5e\u6027\u53ca\u65b9\u6cd5\u7684\u9ed8\u8ba4\u503c","link":"https:\/\/yanbin.blog\/mockito-mocked-default-fields-method-returns\/","pubDate":"Sun, 12 Nov 2017 00:16:13 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-mocked-default-fields-method-returns\/","description":"\n<p>\u5728 Java \u6d4b\u8bd5\u4e2d\u4f7f\u7528 Mockito \u6709\u6bb5\u65f6\u65e5\u4e86\uff0c\u4ee5\u524d\u53ea\u662f\u60f3\u5f53\u7136\u7684\u8ba4\u4e3a Mock \u7684\u5bf9\u8c61\u5c5e\u6027\u503c\u548c\u65b9\u6cd5\u8fd4\u56de\u503c\u90fd\u662f\u4f9d\u636e\u540c\u6837\u7684\u89c4\u5219\u3002\u57fa\u672c\u7c7b\u578b\u662f 0, 0.0, \u6216 false, \u5bf9\u8c61\u7c7b\u578b\u90fd\u662f null, Mock \u5bf9\u8c61\u7684\u9ed8\u8ba4\u8fd4\u56de\u503c\u4e5f\u5e94\u8be5\u662f\u4e00\u6837\u7684\u3002\u76f4\u5230\u6700\u8fd1\u6709\u4e00\u5929\uff0c\u6709\u4e00\u4e2a\u8fd4\u56de <code>Optional&lt;String&gt;<\/code>\u00a0\u7c7b\u578b\u7684\u65b9\u6cd5\uff0c\u7531\u4e8e\u5fd8\u8bb0\u5bf9\u8be5\u65b9\u6cd5\u6253\u6869\uff0c\u610f\u5916\u7684\u53d1\u73b0\u5b83\u8fd4\u56de\u7684\u4e0d\u662f null, \u800c <code>Optional.empty()<\/code>, \u56e0\u6b64\u624d\u610f\u8bc6\u5230\u6b64\u5904\u5b9a\u6709\u8e4a\u8df7\u3002\u7740\u5b9e\u6709\u5fc5\u8981\u7528\u4ee3\u7801\u9a8c\u8bc1\u4e00\u4e0b Mockito \u662f\u600e\u4e48\u51b3\u5b9a\u5c5e\u6027\u53ca\u65b9\u6cd5\u7684\u5404\u79cd\u8fd4\u56de\u7c7b\u578b\u7684\u9ed8\u8ba4\u503c\u7684\u3002<\/p>\n<p>\u6b64\u6b21\u6d4b\u8bd5\u6240\u7528\u7684 Mockito \u7248\u672c\u662f mockito-core-2.12.0.<\/p>\n<p>\u4e8e\u662f\u521b\u5efa\u4e86\u4e0b\u9762\u4e00\u4e2a\u7c7b MyClass \u7528\u4e8e\u751f\u6210 Mock \u5bf9\u8c61\uff0c\u9009\u53d6\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u6570\u636e\u7c7b\u578b, \u5305\u62ec int, Double, String, long[], Optional&lt;String&gt;, Collection&lt;String&gt;, Map&lt;String, String&gt;, \u540c\u65f6\u6d4b\u8bd5 Mock \u5bf9\u8c61\u9ed8\u8ba4\u7684\u5c5e\u6027\u503c\u4e0e\u65b9\u6cd5\u9ed8\u8ba4\u8fd4\u56de\u503c\u3002"},{"title":"\u4f7f\u7528\u63d2\u4ef6 aspectj-maven-plugin \u7ec7\u5165 AspectJ AOP","link":"https:\/\/yanbin.blog\/maven-plugin-aspectj-weaving\/","pubDate":"Sat, 30 Sep 2017 22:08:07 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maven-plugin-aspectj-weaving\/","description":"\n\u6628\u5929\u521a\u521a\u4f8d\u5f04\u5b8c <a href=\"https:\/\/yanbin.blog\/spring-intercept-method-based-on-annotation\">Spring \u4e0b\u57fa\u4e8e\u81ea\u5b9a\u4e49\u6ce8\u89e3\u62e6\u622a\u65b9\u6cd5\u8c03\u7528<\/a>\uff0c\n\u73b0\u5728\u8bd5\u4e0b\u7eaf AspectJ \u7684\u65b9\u5f0f\u6765\u6253\u9020\uff0c\u56e0\u4e3a\u4e0d\u662f\u6bcf\u4e00\u4e2a\u9879\u76ee\u90fd\u662f Spring\u3002\u8fd9\u6b21\u8981\u63a8\u5230 5 \u5e74\u524d\u8bd5\u9a8c\u8fc7\u7528 javac \u547d\u4ee4\u884c\u7f16\u8bd1\u7684\u65b9\u5f0f\u7ec7\u5165\u65b9\u9762\uff0c\n\u89c1 <a href=\"https:\/\/yanbin.blog\/aspectj-baseon-annotation-method\">AspectJ \u57fa\u4e8e\u81ea\u5b9a\u4e49\u7684\u65b9\u6cd5\u6ce8\u89e3\u6765\u62e6\u622a\u65b9\u6cd5<\/a>\uff0c\n\u8fd9\u6b21\u7740\u91cd\u5728\u7528 <a href=\"http:\/\/www.mojohaus.org\/aspectj-maven-plugin\/index.html\">\naspectj-maven-plugin<\/a> \u63d2\u4ef6\u7684\u65b9\u6cd5\u6765\u7ec7\u5165 AspectJ \u65b9\u9762\u3002<br\/><br\/>\n\u57fa\u672c\u4e0a\u4ee3\u7801\u8fd8\u662f\u6628\u5929\u7684\uff0c\u9700\u6c42\u8fd8\u662f\u4e00\u6837\u7684:<br\/><br\/>\n\u88ab @LogStartTime \u6ce8\u89e3\u7684\u65b9\u6cd5\u5728\u8fdb\u5165\u8be5\u65b9\u6cd5\u65f6\u8bb0\u5f55\u5f53\u524d\u65f6\u95f4\u5728 ThreadLocal \u4e2d\uff0c\u5e76\u80fd\u6839\u636e @LogStartTime \u7684\u5c5e\u6027\u503c\u51b3\u5b9a\u5904\u7406\u903b\u8f91<br\/><br\/>\n\u56e0\u4e3a Java5+ \u4e4b\u540e AspectJ \u53ef\u4ee5\u5199\u6210 Java \u7c7b\u52a0\u6ce8\u89e3\u7684\u65b9\u5f0f\uff0c*.aj \u6587\u4ef6\u4e00\u822c\u90fd\u6ca1\u592a\u5927\u5fc5\u8981\u4e86\uff0c\u6240\u4ee5\u53ef\u4ee5\u548c Spring AOP \u5171\u7528\u4e00\u4e2a @Aspect \u6ce8\u89e3\u7684\u65b9\u9762\u4ee3\u7801 <code>MethodStartAspect<\/code>\u3002<br\/><br\/>\n\u6211\u4eec\u5c06\u91c7\u7528\u7f16\u8bd1\u5668\u7ec7\u5165\uff0c\u56e0\u6b64\u9879\u76ee\u4f9d\u8d56\u53ea\u9700\u8981\u4e00\u4e2a <code>org.aspectj:aspectjrt:1.8.0<\/code>, \u5b83\u4e5f\u4e0d\u4f1a\u5f15\u5165\u522b\u7684\u7ec4\u4ef6\u3002\u540c\u6837\u6211\u4eec\u4ece Main \u65b9\u6cd5\u548c\u6d4b\u8bd5\u7528\u4f8b\u4e24\u65b9\u9762\u6765\u9a8c\u8bc1\u5b9e\u73b0\u7684\u6548\u679c\uff0c\u4e0b\u9762\u662f\u6574\u4e2a\u6d4b\u8bd5\u9879\u76ee\u7684\u5e03\u5c40\uff0c\u4ee5\u53ca\u4f9d\u8d56\uff0c\u9664\u6389\u5355\u5143\u6d4b\u8bd5\u7684\u5176\u65f6\u5c31\u53ea\u9700\u8981\u4e00\u4e2a jar \u5305\u3002"},{"title":"\u5b66\u4e60\u5e76\u4f53\u9a8c JUnit 5 \u65b0\u7279\u6027","link":"https:\/\/yanbin.blog\/learn-junit-5-new-features\/","pubDate":"Mon, 25 Sep 2017 01:31:47 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/learn-junit-5-new-features\/","description":"\n\u4e0a\u4e00\u7bc7\u00a0<a href=\"junit-5-new-features-and-get-started\/\">JUnit 5 \u5feb\u901f\u4e0a\u624b(\u4ece JUnit 4 \u5230 JUnit 5)<\/a> \u4ecb\u7ecd\u4e86\u5982\u4f55\u5728\u4e00\u4e2a\u9879\u76ee\u4e2d\u540c\u65f6\u4f7f\u7528 JUnit 4 \u548c JUnit 5\u3002\u73b0\u5728\u6765\u5f00\u59cb\u4e86\u89e3 JUnit 5 \u7684\u65b0\u7279\u6027. \u6211\u4eec\u73b0\u5728\u7684\u9879\u76ee\u57fa\u672c\u662f\u7528 Maven \u6765\u7ba1\u7406\u4f9d\u8d56\uff0c\u5728 Maven \u9879\u76ee\u4e2d\u5982\u4f55\u5f15\u5165 JUnit 5 \u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u4f8b\u5b50 <a href=\"https:\/\/github.com\/junit-team\/junit5-samples\/tree\/master\/junit5-maven-consumer\">junit5-maven-consumer<\/a>. \u6211\u4eec\u77e5\u9053 JUnit 5 \u5305\u62ec\u4e09\u4e2a\u6a21\u5757\uff0c\u4e0d\u7528 JUnit 4 \u7684\u8bdd\u53ea\u8981 Platform \u548c Jupiter, \u800c Jupiter Maven \u6a21\u5757\u672c\u8eab\u4f9d\u8d56\u4e8e JUnit Platform, \u56e0\u6b64\u5e94\u7528 JUnit 5 \u7684\u9879\u76ee Maven \u914d\u7f6e\u5c31\u662f<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nt\">&lt;dependency&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"nt\">&lt;groupId&gt;<\/span>org.junit.jupiter<span class=\"nt\">&lt;\/groupId&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"nt\">&lt;artifactId&gt;<\/span>junit-jupiter-engine<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> <span class=\"nt\">&lt;version&gt;<\/span>5.0.0<span class=\"nt\">&lt;\/version&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> <span class=\"nt\">&lt;scope&gt;<\/span>test<span class=\"nt\">&lt;\/scope&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/dependency&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8fd9\u6837\u5728\u5f53\u524d\u7684 IntelliJ IDEA(2017.2.4) \u53ef\u4ee5\u6267\u884c JUnit 5 \u7684\u6d4b\u8bd5\u7528\u4f8b\u3002\u4f46\u8981\u8ba9 Maven \u627e\u5230 JUnit 5 \u7684\u6d4b\u8bd5\u7528\u4f8b\uff0c\u8fd8\u5f97\u5728 <code>pom.xml<\/code>\u00a0\u4e2d\u52a0\u4e0a"},{"title":"JUnit \u4e2d\u662f\u4ee5\u6d4b\u8bd5\u65b9\u6cd5\u4e3a\u4e00\u4e2a\u72ec\u7acb\u7684\u751f\u547d\u5468\u671f","link":"https:\/\/yanbin.blog\/junit-test-instance-lifecycle\/","pubDate":"Sun, 24 Sep 2017 23:22:34 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-test-instance-lifecycle\/","description":"\n<p>\u5728\u7814\u7a76 JUnit 5 \u65b0\u7279\u6027\u7684\u65f6\u5019\uff0c\u5b66\u4e60\u5230\u5176\u4e2d\u6709\u4e00\u8282 <a href=\"http:\/\/junit.org\/junit5\/docs\/snapshot\/user-guide\/#writing-tests-test-instance-lifecycle\">Test Instance Lifecycle<\/a>, \u624d\u610f\u8bc6\u5230\u5bf9 JUnit \u7684\u7406\u89e3\u4e00\u76f4\u5b58\u5728\u4e00\u4e2a\u8bef\u533a\uff0c\u4ee5\u4e3a JUnit \u662f\u4ee5\u6d4b\u8bd5\u7c7b\u4e3a\u4e00\u4e2a\u751f\u547d\u5468\u671f\u7684\uff0c\u5176\u5b9e\u4e0d\u7136\u3002\u4e0d\u7ba1\u662f JUnit 5 \u8fd8\u662f JUnit 4 \u6216\u66f4\u65e9\u7684\u7248\u672c\uff0cJUnit \u90fd\u662f\u4ee5\u6d4b\u8bd5\u65b9\u6cd5\u4e3a\u4e00\u4e2a\u72ec\u7acb\u7684\u751f\u547d\u5468\u671f\u3002<\/p>\n<p>\u53ea\u662f\u5230\u4e86 JUnit 5 \u63d0\u4f9b\u4e86\u65b9\u6cd5\u6765\u628a\u751f\u547d\u5468\u671f\u7531\u65b9\u6cd5\u6539\u4e3a\u6d4b\u8bd5\u7c7b\uff0c\u5bf9\u4e8e\u5355\u4e2a\u6d4b\u8bd5\u7c7b\u53ef\u4ee5\u4f7f\u7528\u6ce8\u89e3 <code>@TestInstance(Lifecycle.PER_CLASS)<\/code> \u6765\u6307\u5b9a\u7528\u4e00\u4e2a\u6d4b\u8bd5\u5b9e\u4f8b\u6765\u8dd1\u6240\u6709\u7684\u6d4b\u8bd5\u65b9\u6cd5\uff0c\u8fd9\u5c31\u610f\u5473\u7740\u6d4b\u8bd5\u7c7b\u4e2d\u7684\u6210\u5458\u53d8\u91cf\u53ea\u88ab\u521d\u59cb\u5316\u4e00\u6b21\u3002<code>@TestInstance<\/code>\u00a0\u7684 Lifecycle \u9ed8\u8ba4\u662f PER_METHOD, JUnit 4\u00a0\u5c31\u662f PER_METHOD,\u00a0\u800c\u4e14\u662f\u4e0d\u80fd\u6539\u7684\u3002\u5982\u679c\u5728 JUnit 5\u00a0\u4e2d\u6539\u53d8\u4e3a PER_CLASS,\u00a0\u6050\u6015\u53cd\u800c\u4f1a\u51fa\u8bb8\u591a\u4e71\u5b50\uff0c\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u672c\u5c31\u8be5\u662f\u5b8c\u5168\u72ec\u7acb\u7684\u3002<\/p>\n<p>\u6bd4\u5982\u5728\u540c\u4e00\u4e2a\u7c7b\u4e2d\u591a\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u4f7f\u7528\u4e86\u540c\u4e00\u4e2a\u5b9e\u4f8b\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u603b\u4f1a\u7528\u4e00\u4e2a \u00a0<code>@After<\/code>\u00a0\u65b9\u6cd5\u6765\u590d\u4f4d\u8be5\u5b9e\u4f8b\u53d8\u91cf\uff0c\u73b0\u5728\u624d\u77e5\u9053\u90a3\u662f\u591a\u4f59\u7684\u3002\u50cf\u4e0b\u9762\u7684\u4ee3\u7801<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">CalculatorTest<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">number<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">100<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">test1<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">number<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">number<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">200<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">test2<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">number<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">number<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">300<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p>"},{"title":"JUnit 5 \u5feb\u901f\u4e0a\u624b(\u4ece JUnit 4 \u5230 JUnit 5)","link":"https:\/\/yanbin.blog\/junit-5-new-features-and-get-started\/","pubDate":"Mon, 18 Sep 2017 02:57:34 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-5-new-features-and-get-started\/","description":"\n<p>\u4e00\u76f4\u5728\u5173\u6ce8 JUnit 5 \u7684\u6f14\u8fdb\uff0c\u81ea\u4e24\u5e74\u524d\u9996\u4e2a ALPHA \u7248\u540e\uff0c\u7ecf\u5386\u4e86 6 \u7684 Milestone, 3 \u4e2a RC \u7ec8\u4e8e\u5728 2017\/09\/10 \u6b63\u5f0f\u53d1\u5e03\u4e86\u3002\u5176\u5b9e\u8fd8\u4ece\u672a\u5bf9\u5176\u6df1\u7a76\u8fc7\uff0c\u4eca\u5929\u7b97\u662f\u6b63\u5f0f\u5f00\u59cb\u4f53\u9a8c\u3002<\/p>\n<p>\u4e0d\u50cf\u4ee5\u5f80\u7684\u7248\u672c\uff0cJUnit 5 \u73b0\u5728\u662f\u4e09\u4e2a\u6a21\u5757\u7684\u5408\u4f53 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage<\/p>\n<ol>\n<li>JUnit Platform: \u8fd0\u884c\u6d4b\u8bd5\u7684\u57fa\u7840\u5e73\u53f0\u3002\u8fd8\u5b9a\u4e49\u4e86\u5f00\u53d1\u6d4b\u8bd5\u6846\u67b6\u7684 <a href=\"http:\/\/junit.org\/junit5\/docs\/snapshot\/api\/org\/junit\/platform\/engine\/TestEngine.html\">TestEngine<\/a> API\u3002\u5e76\u63d0\u4f9b\u4e86\u547d\u4ee4\u884c\u6267\u884c\u6d4b\u8bd5\u4ee5\u53ca\u4e0e Gradle, Maven, JUnit4 Runner \u7684\u96c6\u6210<\/li>\n<li>JUnit Jupiter: \u5305\u542b\u4e86\u65b0\u7684\u7f16\u7a0b\u548c\u6269\u5c55\u6a21\u578b\u3002\u5b83\u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u8fd0\u884c\u65b0\u578b\u6d4b\u8bd5\u7684 TestEngine \u5b9e\u73b0<\/li>\n<li>JUnit Vintage: \u63d0\u4f9b\u4e86\u4e00\u4e2a\u8ba9 JUnit Platform \u8fd0\u884c JUnit 3 \u548c JUnit 4 \u7684 TestEngine \u5b9e\u73b0<\/li>\n<\/ol>\n<p>\u4ee5\u4e0a\u4e09\u4e2a\u6a21\u5757\u5206\u5de5\u8fd8\u662f\u5f88\u660e\u786e\uff0c\u56e0\u6b64<\/p>\n<ol>\n<li>\u4ece\u73b0\u6709\u7684 JUnit 4 \u9879\u76ee\u6b65\u5165\u5230 JUnit 5 \u81f3\u5c11\u4e24 JUnit Platform \u548c \u00a0JUnit Vintage \u4e24\u4e2a<\/li>\n<li>\u5efa\u7acb\u5168\u65b0\u9879\u76ee\u53ef\u4ee5\u53ea\u5f15\u5165 \u00a0JUnit Platform \u548c JUnit Jupiter<\/li>\n<li>\u6df7\u5408\u578b\u5f53\u7136\u662f\u4e09\u4e2a\u5168\u90e8\u5f15\u5165<\/li>\n<\/ol>\n<p>\u4f46\u662f\u7531\u4e8e jar \u5305\u4e4b\u95f4\u672c\u8eab\u5b58\u5728\u67d0\u79cd\u4f9d\u8d56\u5173\u7cfb\uff0c\u6240\u4ee5\u5b9e\u9645\u4e0a pom.xml \u53ef\u4ee5\u6bd4\u60f3\u50cf\u7684\u66f4\u7b80\u5355"},{"title":"Java \u53cd\u5c04\u6709\u6548\u7684\u4fee\u6539 final \u5c5e\u6027\u503c","link":"https:\/\/yanbin.blog\/java-reflection-modify-final-field\/","pubDate":"Sun, 27 Aug 2017 12:20:47 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-reflection-modify-final-field\/","description":"\n\u4e24\u5e74\u524d\u5199\u8fc7\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-reflection-modify-final-field-value\/\">Java \u53cd\u5c04\u4fee\u6539 final \u5c5e\u6027\u503c<\/a>, \u5728\u8fd9\u91cc\u91cd\u65b0\u6e29\u4e60\u4e00\u4e0b\uff0c\u5047\u8bbe\u6709\u4e2a\u7c7b\n<br\/>\n<blockquote>\nclass Person {<br \/>\n\u00a0 \u00a0 public final String name = \"Mike\";<br \/>\n}\n<\/blockquote>\n\u8fd9\u91cc\u58f0\u660e name \u4e3a\u975e\u9759\u6001\u7684\u5c5e\u6027\u53ea\u662f\u4e3a\u4e86\u8bf4\u660e\u53cd\u5c04\u4fee\u6539 final \u5c5e\u6027\u65e0\u5173\u4e4e\u9759\u6001\u4e0d\u9759\u6001\uff0c\u9759\u6001\u53ea\u662f\u8868\u73b0\u5728\u5b83\u662f\u4e00\u4e2a\u7c7b\u5c5e\u6027\uff0c\u5728\u4e00\u4e2a\u7c7b\u52a0\u8f7d\u5668\u7a7a\u95f4\u53ea\u4f1a\u6709\u4e00\u4efd\u62f7\u8d1d\uff0c\u4ec5\u6b64\u800c\u5df2\u3002<br\/><br\/>\n\u521b\u5efa\u4e00\u4e2a\u901a\u7528\u65b9\u6cd5\u8fdb\u884c\u53cd\u5c04\u4fee\u6539\u5c5e\u6027\u503c<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">modify<\/span><span class=\"p\">(<\/span><span class=\"n\">Object<\/span><span class=\"w\"> <\/span><span class=\"n\">object<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">fieldName<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">Object<\/span><span class=\"w\"> <\/span><span class=\"n\">newFieldValue<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Field<\/span><span class=\"w\"> <\/span><span class=\"n\">field<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">object<\/span><span class=\"p\">.<\/span><span class=\"na\">getClass<\/span><span class=\"p\">().<\/span><span class=\"na\">getDeclaredField<\/span><span class=\"p\">(<\/span><span class=\"n\">fieldName<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Field<\/span><span class=\"w\"> <\/span><span class=\"n\">modifiersField<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Field<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">.<\/span><span class=\"na\">getDeclaredField<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;modifiers&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">modifiersField<\/span><span class=\"p\">.<\/span><span class=\"na\">setAccessible<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Field \u7684 modifiers \u662f\u79c1\u6709\u7684<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">modifiersField<\/span><span class=\"p\">.<\/span><span class=\"na\">setInt<\/span><span class=\"p\">(<\/span><span class=\"n\">field<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">field<\/span><span class=\"p\">.<\/span><span class=\"na\">getModifiers<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"o\">&amp;<\/span><span class=\"w\"> <\/span><span class=\"o\">~<\/span><span class=\"n\">Modifier<\/span><span class=\"p\">.<\/span><span class=\"na\">FINAL<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">field<\/span><span class=\"p\">.<\/span><span class=\"na\">isAccessible<\/span><span class=\"p\">())<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">field<\/span><span class=\"p\">.<\/span><span class=\"na\">setAccessible<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">field<\/span><span class=\"p\">.<\/span><span class=\"na\">set<\/span><span class=\"p\">(<\/span><span class=\"n\">object<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">newFieldValue<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8c03\u7528 modify(...) \u65b9\u6cd5\u8bd5\u56fe\u4fee\u6539 person \u7684 name \u5c5e\u6027"},{"title":"\u81ea\u5b9a\u4e49\u7c7b\u52a0\u8f7d\u5668\u52a8\u6001\u52a0\u8f7d JDBC \u9a71\u52a8","link":"https:\/\/yanbin.blog\/custom-classload-dynamic-load-jdbc-driver\/","pubDate":"Mon, 14 Aug 2017 02:42:25 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/custom-classload-dynamic-load-jdbc-driver\/","description":"\n<p>\u6211\u4eec\u53ef\u4ee5\u7528\u81ea\u5b9a\u4e49\u7684 URLClassLoader \u4ece\u5916\u90e8\u52a8\u6001\u52a0\u8f7d\u7c7b\uff0c\u5e76\u4f7f\u7528\u5b83\u3002\u4f46\u6570\u636e\u5e93\u9a71\u52a8\u7684\u7ba1\u7406\u7c7b DriverManager \u5374\u4e0d\u6bd4\u8f83\u82db\u523b\uff0c\u4e0d\u627f\u8ba4\u975e\u5f53\u524d\u5e94\u7528\u7cfb\u7edf\u52a0\u8f7d\u5668\u52a0\u8f7d\u7684\u9a71\u52a8\u7c7b\u3002\u89c1 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/sql\/DriverManager.html\">DriverManager<\/a> \u7684 JavaDoc\u00a0<\/p>\n<blockquote>\n<p>When the method\u00a0<code>getConnection<\/code>\u00a0is called, the\u00a0<code>DriverManager<\/code>\u00a0will attempt to locate a suitable driver from amongst those loaded at initialization and those loaded explicitly using the same classloader as the current applet or application<\/p>\n<\/blockquote>\n<p>\u5bf9\u4e8e\u6709\u6709\u5e94\u7528\u81ea\u5b9a\u4e49\u7c7b\u52a0\u8f7d\u5668\u52a0\u8f7d\u6570\u636e\u5e93\u9a71\u52a8\u7c7b\u7684\u9700\u6c42\u65f6\uff0c\u5c31\u8981\u5bf9\u539f Driver \u7b80\u5355\u5305\u88c5\u4e00\u4e0b\u3002\u7ee7\u7eed\u5f80\u540e\u4f1a\u8bf4\u4ecb\u7ecd\u4e3a\u4ec0\u4e48\u8981\u8fd9\u4e48\u505a\u3002<\/p>\n<p>\u8bf4\u660e\u4e00\u4e0b\uff0cDriverManager \u80fd\u591f\u6839\u636e JDBC \u8fde\u63a5\u5b57\u7b26\u4e32\u5339\u914d\u5230\u9a71\u52a8\u7c7b\uff0c\u6240\u4ee5\u4e00\u822c\u6765\u8bf4\u90fd\u4e0d\u9700\u8981\u663e\u5f0f\u8c03\u7528 DriverManager.registerDriver() \u65b9\u6cd5\u3002<\/p>\n<p>\u5148\u770b DriverManager \u5728\u5e94\u7528\u5916\u90e8\u9a71\u52a8\u7c7b\u65f6\u4f1a\u51fa\u73b0\u4ec0\u4e48\u60c5\u51b5"},{"title":"\u4f7f\u7528 avro-tools, jq \u67e5\u770b Apache Avro \u5e8f\u5217\u5316\u6587\u4ef6","link":"https:\/\/yanbin.blog\/avro-tools-jq-view-apache-avro-file\/","pubDate":"Sun, 04 Jun 2017 14:38:27 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/avro-tools-jq-view-apache-avro-file\/","description":"\nApache Avro \u662f\u7c7b\u4f3c\u4e8e Google protobuf \u90a3\u6837\u7684\u6570\u636e\u4ea4\u6362\u534f\u8bae\uff0c\u4f46 Avro \u53ef\u4ee5\u7528 JSON \u683c\u5f0f\u6765\u5b9a\u4e49 Schema, \u6240\u4ee5\u76f8\u6bd4\u800c\u8a00\u66f4\u5bb9\u6613\u4e0a\u624b\u3002\u5b83\u4e5f\u662f Hadoop, Kafka \u6240\u91c7\u7528\u7684\u4ea4\u6362\u683c\u5f0f\u3002\u5bf9\u4e8e\u751f\u6210\u7684 avro \u5e8f\u5217\u5316\u6587\u4ef6\u5982\u679c\u8981\u7f16\u5199\u4ee3\u7801\u6765\u89e3\u8bfb\u5176\u4e2d\u5185\u5bb9\u7684\u8bdd\u5c31\u592a\u8fc7\u4e8e\u9ebb\u70e6\uff0cApache \u7ed9\u4e86\u6211\u4eec\u4e00\u4e2a\u4fbf\u6377\u7684\u5de5\u5177\u6765\u5904\u7406 Avro Schema \u548c\u6570\u636e\u3002<\/p>\n<br\/>\nJava \u7248\u7684 Avro Tools \u53ef\u70b9\u51fb\u94fe\u63a5 <a href=\"http:\/\/apache.mirrors.tds.net\/avro\/avro-1.8.2\/java\/avro-tools-1.8.2.jar\">avro-tools-1.8.2.jar<\/a> \u4e0b\u8f7d\uff0c\u5f53\u524d\u7248\u672c 1.8.2(\u53d1\u5e03\u4e8e 2017\/05\/20)\uff0c\u6267\u884c\u547d\u4ee4\u662f<br\/>\n<blockquote>\njava -jar avro-tools-1.8.2.jar ..............\n<\/blockquote>\n\u5982\u679c\u662f Mac \u5e73\u53f0\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7<br\/>\n<blockquote>\nbrew install avro-tools\n<\/blockquote>\n\u6765\u5b89\u88c5\uff0c\u6267\u884c\u547d\u4ee4\u5c31\u53ea\u662f <code>avro-tools<\/code>\u00a0\u4e86\u3002<br\/><br\/>\n\u5728\u672c\u6587\u4e2d\u8fd8\u4f1a\u7528\u5230\u4e00\u4e2a JSON \u683c\u5f0f\u5316\u9ad8\u4eae\u663e\u793a\u7684\u5de5\u5177 <code>jq<\/code>, \u5728 Mac \u4e0b\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5<br\/>\n<blockquote>\nbrew install jq\n<\/blockquote>\navro-tools \u548c jq \u5df2\u51c6\u5907\u5c31\u7eea\uff0c\u63a5\u4e0b\u6765\u6f14\u793a\u4e0b\u5982\u4f55\u4f7f\u7528\u5b83\u4eec\u3002<br\/>"},{"title":"JMockit \u4e2d\u6355\u83b7 mock \u5bf9\u8c61\u65b9\u6cd5\u7684\u8c03\u7528\u53c2\u6570","link":"https:\/\/yanbin.blog\/jmockit-capture-mock-call-arguments\/","pubDate":"Fri, 21 Apr 2017 01:02:16 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-capture-mock-call-arguments\/","description":"\n<p><\/p>\u4e09\u4e2a\u6708\u524d\u5199\u8fc7\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/mockito-capture-method-paramters\">Mockito \u4e2d\u6355\u83b7 mock \u5bf9\u8c61\u65b9\u6cd5\u7684\u8c03\u7528\u53c2\u6570<\/a>\uff0c\u4e00\u822c\u9879\u76ee\u4e2d Mockito \u4e0d\u51b3\u6c42\u52a9\u4e8e JMockit, \u540c\u6837\u7684\u5728 JMockit \u4e5f\u9700\u5bf9\u6355\u83b7\u88ab Mock \u7684\u65b9\u6cd5\u8c03\u7528\u53c2\u6570\u3002\u5f53\u6211\u4eec\u7528 <code>new Expectations(){{}}<\/code> \u6253\u6869\u5e76\u5728\u540e\u9762\u65ad\u8a00\u4e86\u8fd4\u56de\u503c\uff0c\u90a3\u5c31\u65e0\u9700\u6355\u83b7\u53c2\u6570\u6765\u65ad\u8a00\uff0c\u5339\u914d\u5230\u4e86\u65b9\u6cd5\u8c03\u7528\u5373\u8bc1\u660e\u4f20\u5165\u7684\u53c2\u6570\u4e5f\u662f\u5bf9\u7684\uff0c\u5982\u4e0b\u9762\u7684\u4ee3\u7801\u6240\u793a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">UserServiceTest<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Mocked<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">UserDao<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">couldCallUserDaoToAddUser<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Expectations<\/span><span class=\"p\">(){{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">.<\/span><span class=\"na\">findById<\/span><span class=\"p\">(<\/span><span class=\"n\">123<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Yanbin&#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}};<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">UserService<\/span><span class=\"w\"> <\/span><span class=\"n\">userService<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">UserService<\/span><span class=\"p\">(<\/span><span class=\"n\">userDao<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">userService<\/span><span class=\"p\">.<\/span><span class=\"na\">findBy<\/span><span class=\"p\">(<\/span><span class=\"n\">123<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">assertThat<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Yanbin&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u8fd9\u91cc\u65ad\u8a00\u6210\u529f\u4e5f\u5c31\u8bc1\u660e\u4e86 userDao.findById(123) \u65b9\u6cd5\u88ab\u8c03\u7528\uff0c\u53c2\u6570\u5fc5\u987b\u662f 123<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u4f46\u5982\u679c\u662f\u672a\u6253\u6869\u7684\u65b9\u6cd5\uff0c\u6216\u6253\u6869\u662f\u7528\u7684\u6a21\u7cca\u53c2\u6570(withInstanceOf(String.class)), \u6216\u662f\u65e0\u8fd4\u56de\u503c\u7684\u65b9\u6cd5\u5c31\u8981\u4e8b\u540e\u5bf9\u662f\u5426\u8c03\u7528\u4e86\u67d0\u4e2a\u65b9\u6cd5\u4ee5\u53ca\u4f20\u5165\u4ec0\u4e48\u53c2\u6570\u7684\u60c5\u51b5\u8fdb\u884c\u65ad\u8a00\u3002"},{"title":"\u4f7f\u7528 Awaitility \u6d4b\u8bd5\u5f02\u6b65\u4ee3\u7801","link":"https:\/\/yanbin.blog\/test-asyn-call-with-awaitility\/","pubDate":"Wed, 19 Apr 2017 00:30:10 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/test-asyn-call-with-awaitility\/","description":"\n\u5bf9\u4e8e\u540c\u6b65\u65b9\u6cd5\u7684\u6d4b\u8bd5\u5f88\u7b80\u5355\uff0c\u8c03\u7528\u5b8c\u540e\u53ef\u7acb\u9a6c\u68c0\u67e5\u6267\u884c\u72b6\u6001; \u800c\u5f02\u6b65\u65b9\u6cd5\uff0c\u7531\u4e8e\u6211\u4eec\u65e0\u6cd5\u786e\u5207\u7684\u77e5\u9053\u4f55\u65f6\u7ed3\u675f\uff0c\u56e0\u6b64\u4ee5\u5f80\u7684\u529e\u6cd5\u662f\u7528 <code>Thread.sleep(500)<\/code>\u00a0\u6765\u9884\u4f30\u4e00\u4e2a\u6267\u884c\u65f6\u95f4\u3002\u7136\u540e\u901a\u5e38\u6211\u4eec\u4f30\u8ba1\u7684\u8981\u957f\u4e8e\u5b9e\u9645\u7684\u65f6\u95f4\uff0c\u8fd9\u5c31\u5f88\u6d6a\u8d39\uff0c\u51b5\u4e14\u5076\u7136\u7684\u8d85\u8fc7\u9884\u4f30\u7684\u7b49\u5f85\u65f6\u95f4\u4e5f\u5e76\u4e0d\u610f\u5473\u7740\u4ee3\u7801\u6709\u95ee\u9898\u3002\u8fd8\u6709 <code>sleep<\/code>\u00a0\u65b9\u6cd5\u8fd8\u629b\u51fa\u4e00\u4e2a\u68c0\u6d4b\u5f02\u5e38 <code>InterruptedException<\/code>, \u4e00\u822c\u4f1a\u8981\u5bf9 <code>Thread.sleep(500)<\/code>\u00a0\u4f5c\u4e0b\u7b80\u5355\u5305\u88c5\u3002<br\/><br\/>\n\u4e8e\u662f\u4eca\u5929\u8981\u4ecb\u7ecd\u7684 <a href=\"http:\/\/www.awaitility.org\/\">Awaitility<\/a> \u5c31\u5e94\u8fd0\u800c\u751f\u4e86\uff0c\u4e13\u95e8\u9488\u5bf9\u5f02\u6b65\u65b9\u6cd5\u7684\u6d4b\u8bd5\u3002\u5b83\u7684\u5b98\u65b9\u6587\u6863\u5728 <a href=\"https:\/\/github.com\/awaitility\/awaitility\/wiki\/Usage\">https:\/\/github.com\/awaitility\/awaitility\/wiki\/Usage<\/a>\u3002\u672c\u6587\u4e3b\u8981\u5173\u6ce8\u5728 Java 8 \u73af\u5883\u4e0b\u7528 Lambda \u7684\u4ee3\u7801\u4e66\u5199\u65b9\u5f0f\u3002Awaitlity \u5b9e\u9645\u8fd0\u884c\u662f\u4ee5\u67d0\u79cd\u8f6e\u8be2\u7684\u65b9\u5f0f\u6765\u68c0\u67e5\u662f\u5426\u8fbe\u5230\u67d0\u4e2a\u8fd0\u884c\u72b6\u6001\uff0c\u53ef\u8bbe\u5b9a\u6700\u591a\uff0c\u6700\u5c11\u7b49\u5f85\u65f6\u95f4\uff0c\u6216\u6c38\u4e45\u7b49\u5f85\uff0c\u6216\u81ea\u5b9a\u4e49\u8f6e\u8be2\u7b56\u7565\uff0c\u4e4b\u540e\u5c31\u5f00\u59cb\u8fdb\u884c\u9700\u8981\u7684\u65ad\u8a00\uff0c\u6240\u4ee5\u5b83\u53ef\u4ee5\u5c3d\u53ef\u80fd\u7684\u8282\u7701\u6d4b\u8bd5\u5f02\u6b65\u65b9\u6cd5\u6240\u9700\u7684\u65f6\u957f\u3002\u800c\u4e0d\u50cf <code>Thread.sleep(500)<\/code>\u00a0\u4e00\u8def\u7b49\u5230\u9ed1\uff0c\u5e76\u4e14\u6ca1\u6709\u56de\u5934\u8def\u3002<br\/><br\/>\n\u901a\u5e38\u6211\u4f1a\u5728\u9879\u76ee\u4e2d\u7ed9 JUnit \u914d\u4e0a\u4e09\u4e2a\u6700\u4f73\u4f34\u4fa3\uff0c\u5b83\u4eec\u662f(\u6309 <code>mvn dependency:tree<\/code>\u00a0\u4e2d\u7684\u663e\u793a\u65b9\u5f0f):<br\/>\n<ol>\n<li>org.awaitility:awaitility:2.0.0:test<\/li>\n<li>org.assertj:assertj-core: version: 3.8.0:test<\/li>\n<li>org.mockito:mockito-core:2.7.22:test<\/li>\n<\/ol>\n<br\/>\n\u5f53\u7136\u5982\u679c\u9879\u76ee\u4e2d\u6ca1\u6709\u5f02\u6b65\u8c03\u7528\u81ea\u7136\u662f\u4e0d\u9700\u8981 Awaitility, \u5728\u6211\u7684\u9879\u76ee\u4e2d\u662f\u57fa\u672c\u4e0d\u53ef\u80fd\u7684\u3002\u4ee5\u4e0a\u4e09\u79cd\u90fd\u8ffd\u6c42 DSL\uff0c\u4ee5\u6d41\u7545\u7684\u65b9\u5f0f\u8fdb\u884c\u6109\u5feb\u7684\u6d4b\u8bd5\u3002<br\/><br\/>\n\u73b0\u5728\u6765\u5c1d\u8bd5\u4e0b Awaitility \u7684\u51e0\u79cd\u57fa\u672c\u7684\u7528\u6cd5\uff0c\u5148\u5047\u5b9a\u6709\u4e0b\u9762\u7684\u4ee3\u7801 <code>UserService<\/code>"},{"title":"\u4f7f\u7528 Mockito \u4fee\u6539\u79c1\u6709\u5c5e\u6027","link":"https:\/\/yanbin.blog\/mockito-modify-private-field\/","pubDate":"Sat, 01 Apr 2017 10:59:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-modify-private-field\/","description":"\n\u4fee\u6539\u79c1\u6709\u5c5e\u6027\u6765 Mock \u53ef\u80fd\u4e0d\u662f\u4e00\u79cd\u5f88\u597d\u7684\u6d4b\u8bd5\u65b9\u5f0f, \u56e0\u4e3a\u5c5e\u6027\u540d\u662f\u52a8\u6001\u7684\uff0c\u4f46\u6709\u65f6\u4e0d\u5f97\u5df2\u800c\u4e3a\u4e86\uff0c\u4f8b\u5982\u4e0b\u9762\u7684\u4ee3\u7801\uff1a\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">UserService<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">ExternalApi<\/span><span class=\"w\"> <\/span><span class=\"n\">external<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">ExternalApi<\/span><span class=\"p\">.<\/span><span class=\"na\">default<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">UserDao<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"nf\">UserService<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDao<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"na\">userDao<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">User<\/span><span class=\"w\"> <\/span><span class=\"nf\">findUserById<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"p\">.<\/span><span class=\"na\">findById<\/span><span class=\"p\">(<\/span><span class=\"n\">external<\/span><span class=\"p\">.<\/span><span class=\"na\">convertId<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6d4b\u8bd5\u65f6\u6b32\u9694\u79bb\u5bf9 ExternalApi \u7684\u5916\u90e8\u4f9d\u8d56, \u5f53\u7136\u53ef\u4ee5\u628a\u5b83\u4e5f\u4f5c\u4e3a\u6784\u9020\u51fd\u6570\u7684\u4e00\u4e2a\u53c2\u6570\uff0c\u8fd9\u6837\u521b\u5efa UserService \u5b9e\u4f8b\u65f6\u5c31\u53ef\u4ee5 Mock external \u5c5e\u6027\u3002\u4e0d\u8fc7 external \u7ecf\u5e38\u662f\u4e0d\u53d8\u7684\uff0c\u6240\u4ee5\u4f5c\u4e3a\u65b9\u6cd5\u53c2\u6570\u7684\u5fc5\u8981\u6027\u4e5f\u4e0d\u5927\u3002\u8fd9\u5c31\u5e0c\u671b\u80fd\u5728\u6784\u9020\u51fa UserService \u4e4b\u540e\u5bf9 external \u79c1\u6709\u5c5e\u6027\u8fdb\u884c Mock \u5904\u7406\u3002<br\/><br\/>\n\u5728 Mockito 1.x \u548c 2.x \u4e0b\u8981\u4f7f\u7528\u4e0d\u540c\u7684\u65b9\u5f0f\uff0c\u5206\u522b\u4f7f\u7528\u5230 Whitebox \u548c FieldSetter \u7c7b\uff0c\u5b83\u4eec\u90fd\u6765\u81ea\u4e8e \u00a0<code>mockito.internal.util.reflection<\/code>\u00a0\u5305\uff0c\u53ef\u89c1 Mockito \u6253\u5fc3\u5e95\u4e0d\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u4eec\uff0c\u4f46\u8c01\u53eb\u5b83\u4eec\u662f public \u7684\u5462\u3002\u8fd8\u6709\u4e00\u79cd\u65b9\u5f0f\u662f\u4f7f\u7528 PowerMock + Mockito, \u8fd9\u662f\u540e\u8bdd\u3002"},{"title":"\u4f7f\u7528 JMockit \u6765 mock \u6784\u9020\u51fd\u6570","link":"https:\/\/yanbin.blog\/jmockit-mock-constructors\/","pubDate":"Tue, 28 Feb 2017 01:50:57 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-mock-constructors\/","description":"\nJava \u6d4b\u8bd5\u7684 Mock \u6846\u67b6\u4ee5\u524d\u662f\u7528 JMockit, \u6700\u8fd1\u7528\u4e86\u4e00\u6bb5\u65f6\u95f4\u7684 Mockito, \u9664\u4e86\u5b83\u6d41\u7545\u7684\u4e66\u5199\u65b9\u5f0f\uff0c\u7ecf\u5e38\u8fd9\u4e5f Mock \u4e0d\u4e86\uff0c\u90a3\u4e5f Mock \u4e0d\u4e86\uff0c\u9700\u8981\u8fc1\u5c31\u4e8e\u6d4b\u8bd5\u6765\u8c03\u6574\u5b9e\u73b0\u4ee3\u7801\uff0c\u4f7f\u5f97\u5b9e\u73b0\u6781\u4e0d\u4f18\u96c5\u3002\u6bd4\u5982 Mockito \u5728 \u79c1\u6709\u65b9\u6cd5\uff0cfinal \u65b9\u6cd5\uff0c\u9759\u6001\u65b9\u6cd5\uff0cfinal \u7c7b\uff0c\u6784\u9020\u65b9\u6cd5\u9762\u524d\u7edf\u7edf\u7684\u7f34\u68b0\u4e86\u3002powermock \u867d\u7136\u53ef\u4f5c Mockito \u7684\u4f34\u4fa3\u6765\u7a81\u7834 Mockito \u672c\u8eab\u7684\u4e00\u4e9b\u5c40\u9650\uff0c\u4f46\u662f\u6211\u4e00\u7528\u5b83\u6765 Mock \u4e00\u4e2a\u6784\u9020\u65b9\u6cd5\u5c31\u51fa\u9519<\/p>\n<br\/>\n<blockquote>\nCaused by: java.lang.ClassNotFoundException: org.mockito.exceptions.Reporter\n<\/blockquote>\n<br\/>\n\u539f\u56e0\u662f Mockito \u53d8\u5316\u592a\u5feb\uff0cpowermock \u8ddf\u4e0d\u4e0a\u5b83\u7684\u6b65\u4f10 -- <a href=\"https:\/\/github.com\/powermock\/powermock\/issues\/684\">https:\/\/github.com\/powermock\/powermock\/issues\/684<\/a>\uff0c\u4e8e\u662f\u6211\u53ea\u80fd\u6b62\u6b65\u3002<br\/><br\/>\n\u4e0d\u5f97\u5df2\u518d\u796d\u51fa JMockit \u8fd9\u53f7\u79f0(\u4e5f\u786e\u5b9e\u662f)\u4e00\u65e0\u6240\u4e0d\u80fd\u7684\u5927\u6740\u5668\uff0c\u5728\u6b64\u89c1\u8bc6\u4e00\u4e0b\u5b83\u600e\u4e48 Mock \u6784\u9020\u51fd\u6570\u7684<br\/><br\/>\n\u672c\u7bc7\u5b9e\u4f8b\u6240\u4f7f\u7528\u7684 JMockit \u7248\u672c\u662f 1.30, \u5f53\u524d\u6700\u65b0\u7248 1.31, \u7531\u4e8e\u5c1a\u672a\u88ab Maven \u4e2d\u592e\u4ed3\u5e93\u6536\u5f55\uff0c\u6240\u4ee5\u6682\u7528 1.30\u3002\u5728 pom.xml \u4e2d\u5982\u4e0b\u65b9\u5f0f\u5f15\u5165"},{"title":"Java \u7684\u53c2\u6570\u68c0\u67e5\u4e0e\u65ad\u8a00 - Spring Assert","link":"https:\/\/yanbin.blog\/java-assertion-spring-assert\/","pubDate":"Sat, 25 Feb 2017 03:12:23 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-assertion-spring-assert\/","description":"\n<p>\u4e4b\u524d\u6709\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-assertion-guava-preconditions\/\">Java \u7684\u53c2\u6570\u68c0\u67e5\u4e0e\u65ad\u8a00<\/a> \u4ecb\u7ecd\u4e86\u5728 Java \u4e2d\u5982\u4f55\u5e94\u7528 Guava \u7684 Preconditions \u6765\u8fdb\u884c\u53c2\u6570\u68c0\u67e5\u4e0e\u72b6\u6001\u65ad\u8a00\uff0c\u539f\u672c\u662f\u53ef\u4ee5\u5fc3\u65e0\u65c1\u9a9b\uff0c\u4e13\u5fc3\u7684\u7528\u5b83\u5c31\u884c\u4e86\uff0c\u53ef\u662f\u521a\u521a\u56e0\u7422\u78e8\u6211\u4eec\u4f7f\u7528 JdbcTemplate \u5b58\u5728\u7684\u4e00\u5927 Bug\uff0c\u9605\u8bfb Spring \u7684\u6e90\u4ee3\u7801\u65f6\u53d1\u73b0 spring-util \u4e5f\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7c7b\u4f3c\u4e8e Gruva Preconditions \u7684\u5de5\u5177\u7c7b -- <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/util\/Assert.html\">Assert<\/a>\uff0c\u5b83\u662f\u81ea Spring 1.1.2 \u5f00\u59cb\u5c31\u9759\u9759\u7684\u8eba\u5728\u90a3\u513f\u4e86\u3002<\/p>\n<p>\u6240\u4ee5\u73b0\u5728\u8981\u68c0\u67e5\u53c2\u6570\u6216\u72b6\u6001\u65ad\u8a00\u65f6\u53cd\u800c\u72af\u4e0a\u4e86\u9009\u62e9\u7efc\u5408\u8bc1\uff0c\u867d\u7136\u5185\u5fc3\u8fd8\u662f\u504f\u5411\u4e8e Guava Preconditions\uff0c\u4f46\u603b\u4e4b\u4e0d\u90a3\u4e48\u575a\u51b3\u4e86\uff0c\u4e5f\u4e0d\u77e5\u5230\u5e95\u662f\u8c01\u5728\u91cd\u65b0\u53d1\u660e\u7740\u8f6e\u5b50\u3002\u53ef\u4ee5\u8bf4 Spring Assert \u4e0e Guava Preconditions \u7684\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u4e5f\u662f\u9488\u5bf9\u5165\u53e3\u53c2\u6570\u6216\u4e2d\u95f4\u8fd0\u884c\u7ed3\u679c\u7684\u68c0\u67e5\u5206\u522b\u629b\u51fa <code>IllegalArgumentException<\/code>\u00a0\u548c <code>IllegalStateException<\/code>\u00a0. \u4e0b\u9762\u4e00\u5f20\u56fe\u6765\u4e86\u89e3\u5b83\u7684\u6240\u6709\u65b9\u6cd5\u3002"},{"title":"Java \u53ef\u53d8\u53c2 Object...objects \u65b9\u6cd5\u7684\u9677\u8fdb","link":"https:\/\/yanbin.blog\/java-varargs-method-error-prone\/","pubDate":"Thu, 23 Feb 2017 00:04:01 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-varargs-method-error-prone\/","description":"\n<p>Java \u7684\u53ef\u53d8\u53c2\u6570(Varargs) \u65b9\u6cd5\u8ba9\u6211\u4eec\u8c03\u7528\u8d77\u6765\u5f88\u65b9\u4fbf\uff0c\u4e0d\u9700\u8981\u603b\u662f\u53bb\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\u6765\u4f20\u9012\u4e0d\u5b9a\u6570\u91cf\u7684\u53c2\u6570\uff0c\u800c\u4e14\u8fd8\u53ef\u4ee5\u4f5c\u4e3a\u65b9\u6cd5\u7684\u4e00\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u5982<\/p>\n<blockquote>\nvoid foo(int id, String...name) {<br \/>\n\u00a0\u00a0\u00a0 String yourName = name.length == 0 ? \"Anonymous\" : name[0];<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ......<br \/>\n}\n<\/blockquote>\n<p>\u60f3\u8981\u544a\u8bc9\u540d\u5b57\u5c31\u8c03\u7528 <code>foo(1, \"Yanbin\")<\/code>, \u4e0d\u60f3\u7684\u8bdd\u5c31\u7528 <code>foo(1)<\/code>.<\/p>\n<p>\u4f46\u6211\u4eec\u5728\u4f7f\u7528 Java Varargs \u65f6\uff0c\u5f53\u53d8\u53c2\u7c7b\u578b\u5b9a\u4e49\u4e3a <code>Object...objects<\/code> \u65f6\u5c31\u8981\u5f53\u5fc3\u4e86\uff0c\u56e0\u4e3a Object \u7c7b\u578b\u7684\u5305\u5bb9\u6027\u539f\u56e0\u4e00\u4e0d\u5c0f\u5fc3\u5c31\u53ef\u4ee5\u6389\u5230\u5751\u91cc\u53bb\u4e86\uff0c\u4f8b\u5982\u4e0b\u9762\u7684\u65b9\u6cd5<\/p>\n<blockquote>\nvoid foo(Object...objects) {<br \/>\n\u00a0\u00a0\u00a0\u00a0 Arrays.stream(objects).forEach(System.out::println());<br \/>\n}\n<\/blockquote>\n<p>\u5f53\u5f15\u7528\u7c7b\u578b\u662f <code>Object[]<\/code> \u65f6\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u4e0b\u9762\u4ee3\u7801\u8c03\u7528\u53ef\u4ee5\u5f97\u5230\u9884\u671f\u7684\u7ed3\u679c"},{"title":"Java \u4e0e Python \u901a\u8fc7 Apache Avro \u4ea4\u6362\u6570\u636e","link":"https:\/\/yanbin.blog\/java-python-communicate-via-apache-avro\/","pubDate":"Mon, 20 Feb 2017 00:22:02 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-python-communicate-via-apache-avro\/","description":"\n\u6700\u8fd1\u8f6c\u6218\u5230 Amazon \u7684\u4e91\u670d\u52a1 AWS \u4e0a\uff0c\u8003\u8651\u5230\u5728\u4f7f\u7528\u5b83\u7684 Lambda \u670d\u52a1\u65f6 Python \u5e94\u7528\u6709\u6bd4\u8f83\u53ef\u89c2\u7684\u542f\u52a8\u901f\u5ea6\uff0c\u4e0e\u4e4b\u76f8\u6bd4\u800c\u8a00\uff0cJava \u603b\u662f\u6162\u70ed\u578b\uff0c\u8fd8\u662f\u4e00\u4e2a\u5185\u5b58\u5927\u6237\u3002\u6240\u4ee5\u6709\u60f3\u6cd5 Lambda \u51fd\u6570\u7528 Python \u6765\u5199\uff0c\u6765\u589e\u5f3a\u54cd\u5e94\u901f\u5ea6\uff0c\u800c\u5185\u90e8\u7684\u5e94\u7528\u4ecd\u7136\u91c7\u7528 Java, \u4e8e\u662f\u5c31\u6709\u4e86 Java \u4e0e Python \u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u3002\u4f7f\u7528 Kafka \u7684\u65f6\u5019\u662f\u7528\u7684 <a href=\"https:\/\/avro.apache.org\/\">Apache Avro<\/a>, \u56e0\u6b64\u7ee7\u7eed\u8003\u5bdf\u5b83\u3002<\/p>\n<br\/>\n\u6ce8\u610f\uff0c\u672c\u6587\u7684\u5185\u5bb9\u4f1a\u6709\u5f88\u5927\u90e8\u4efd\u4e0e\u524d\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/apache-avro-serializing-deserializing\/\">Apache Avro \u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316 (Java \u5b9e\u73b0)<\/a> \u96f7\u540c\uff0c\u4e0d\u8fc7\u518d\u7ecf\u4e00\u6b21\u7684\u4e86\u5e94\u7528\uff0c\u4e86\u89e3\u66f4\u6df1\u4e86\u3002<br\/><br\/>\n\u5728\u4e0d\u540c\u7c7b\u578b\u8bed\u8a00\u95f4\u8fdb\u884c\u6570\u636e\u4ea4\u6362\uff0c\u5f88\u5bb9\u6613\u4f1a\u60f3\u5230\u7528 JSON \u683c\u5f0f\uff0c\u90a3\u6211\u4eec\u4e3a\u4ec0\u4e48\u8fd8\u8981\u7528 Apache Avro \u5462\uff1f\u901a\u8fc7\u63a5\u4e0b\u6765\u7684\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u4ee5\u4e0b\u51e0\u70b9\uff1a<br\/><br\/>\n<ol>\n<li>Apache Avro \u5e8f\u5217\u5316\u7684\u683c\u5f0f\u4e5f\u662f JSON \u7684\uff0cJava \u7684 Avro \u5e93\u4f9d\u8d56\u4e8e Jackson \u5e93<\/li>\n<li>\u5e8f\u5217\u5316\u6570\u636e\u5e93\u672c\u8eab\u5e26\u6709 Schema \u5b9a\u4e49\u7684\uff0c\u65b9\u4fbf\u4e8e\u53cd\u5e8f\u5217\u5316\uff0c\u7279\u522b\u662f\u5bf9\u4e8e Java \u4ee3\u7801; \u800c JavaScript \u4f1a\u8868\u793a\u591a\u6b64\u4e00\u4e3e<\/li>\n<li>\u81ea\u52a8\u652f\u6301\u5e8f\u5217\u5316\u6570\u636e\u7684\u538b\u7f29\uff0c\u5728\u5b98\u65b9\u63d0\u4f9b\u7684\u5e93\u4e2d\uff0cJava \u53ef\u652f\u6301 <code>deflate<\/code>, <code>snappy<\/code>, <code>bzip2<\/code>, \u548c <code>xz<\/code>. \u5176\u4ed6\u8bed\u8a00\u4e2d\u53ef\u80fd\u5c11\u4e9b\uff0c\u5982 Python \u53ea\u652f\u6301 <code>deflate<\/code>, \u548c <code>snappy<\/code>, \u5e94\u8be5\u53ef\u6269\u5145\u3002\u5e8f\u5217\u5316\u6570\u636e\u4e2d Schema \u90e8\u5206\u4e0d\u88ab\u538b\u7f29<\/li>\n<li>\u5929\u7136\u652f\u6301\u5e8f\u5217\u5316\u5bf9\u8c61\u5217\u8868\uff0c\u8fd9\u6837\u5728\u5e8f\u5217\u5316\u6570\u636e\u4e2d\u53ea\u9700\u8981\u4e00\u4efd Schema\uff0c\u7c7b\u4f3c\u4e8e\u6570\u636e\u5e93\u8868 Schema \u52a0\u4e0a\u591a\u8bb0\u5f55\u884c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u53ea\u7528 Apache Avro \u4f20\u8f93\u5c0f\u5bf9\u8c61\u7684\u8bdd\uff0c\u6570\u636e\u91cf\u6bd4 JSON \u4e8b JDK \u5e8f\u5217\u5316\u7684\u6570\u636e\u8981\u5927\u3002<\/li>\n<\/ol>\n<br\/>\nApache Avro \u5b98\u65b9\u63d0\u4f9b\u6709 C, C++, C#, Java, PHP, Python \u548c Ruby \u7684\u652f\u6301\u5e93\uff0c\u53ef\u5728\u7f51\u4e0a\u627e\u5230\u5176\u4ed6\u8bed\u79cd\u7684\u7c7b\u5e93\uff0c\u5982 NodeJS, Go \u7684\uff0c\u7b49\u7b49\u3002"},{"title":"\u4e00\u4e2a\u7b80\u5355\u7684 Java \u81ea\u52a8\u6279\u5904\u7406\u961f\u5217","link":"https:\/\/yanbin.blog\/simple-java-auto-batch-queue\/","pubDate":"Fri, 17 Feb 2017 01:58:38 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/simple-java-auto-batch-queue\/","description":"\n\u5b9e\u9645\u4e2d\u53ef\u80fd\u6709\u8fd9\u6837\u7684\u5e94\u7528\u573a\u666f\uff0c\u5f97\u5230\u4e00\u4e2a\u8bb0\u5f55\u4e0d\u9700\u8981\u7acb\u5373\u53bb\u5904\u7406\u5b83\uff0c\u800c\u662f\u7b49\u7d2f\u79ef\u5230\u4e00\u5b9a\u6570\u91cf\u65f6\u518d\u6279\u91cf\u5904\u7406\u5b83\u4eec\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u6765\u4e00\u4e2a\u52a0\u4e00\u4e2a\uff0c\u91cf\u5927\u65f6\u4e00\u5757\u5904\u7406\uff0c\u7136\u540e\u53c8\u91cd\u96f6\u5f00\u59cb\u8ba1\u6570\u3002\u5982\u679c\u8bb0\u5f55\u7684\u6765\u6e90\u5355\u4e00\u8fd8\u597d\u529e\uff0c\u8981\u662f\u6709\u591a\u4e2a\u6570\u636e\u6e90\u6765\u63d0\u4f9b\u8bb0\u5f55\u5c31\u4f1a\u6709\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\u6570\u636e\u4e22\u5931\u7684\u95ee\u9898\u3002<\/p>\n<br\/>\n\u8fd9\u91cc\u6211\u7f16\u5199\u4e86\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u4efb\u52a1\u6279\u5904\u7406\u7684\u961f\u5217\uff0c\u6784\u9020\u4e86\u544a\u8bc9\u5b83\u6279\u5904\u7406\u6570\u91cf\uff0c\u6d88\u8d39\u8005\uff0c\u7136\u540e\u5c31\u53ea\u7ba1\u5f80\u961f\u5217\u91cc\u6dfb\u52a0\u8bb0\u5f55\uff0c\u961f\u5217\u5728\u6ee1\u8db3\u6761\u4ef6\u65f6\u81ea\u52a8\u8fdb\u884c\u6279\u5904\u7406\u3002\u56e0\u4e3a\u5185\u90e8\u4f7f\u7528\u7684\u662f <code>BlockingQuque<\/code> \u6765\u5b58\u50a8\u8bb0\u5f55\uff0c\u6240\u4ee5\u591a\u7ebf\u7a0b\u5f80\u91cc\u540c\u65f6\u6dfb\u52a0\u8bb0\u5f55\u4e5f\u6ca1\u5173\u7cfb\uff0c\u6700\u540e\u7684\u672a\u8fbe\u5230 <code>batchSize<\/code>, \u7684\u90a3\u4e9b\u8bb0\u5f55\u53ef\u4e3b\u52a8\u8c03\u7528 <code>completeAll()<\/code> \u51fd\u6570\u6216\u5728\u8fbe\u5230 timeout \u540e\u6765\u89e6\u53d1\u6279\u5904\u7406\uff0c\u5e76\u4e14\u7ed3\u675f\u961f\u5217\u5185\u7684\u5faa\u73af\u7ebf\u7a0b\u3002<br\/><br\/>\n\u6ce8\u610f: \u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\u5f80\u4e00\u4e2a\u65e0\u7ebf\u7a0b\u4fdd\u62a4\u7684\u96c6\u5408\u6216\u7ed3\u6784\u4e2d\uff0c\u5982 ArrayList, LinkedList, HashMap, StringBuilder \u4e2d\u6dfb\u52a0\u8bb0\u5f55\u975e\u5e38\u5bb9\u6613\u9020\u6210\u6570\u636e\u7684\u4e22\u5931\uff0c\u800c\u5f80\u6709\u7ebf\u7a0b\u4fdd\u62a4\u7684\u76ee\u7684\u5730\u5199\u4e1c\u897f\u5c31\u5b89\u5168\u4e86\uff0c\u5982 Vector, Hashtable, StringBuffer, BlockingQueue\u3002\u5f53\u7136\u6027\u80fd\u4e0a\u8981\u4ed8\u51fa\u4e00\u70b9\u4ee3\u4ef7\uff0c\u4e0d\u8fc7\u5bf9\u4e8e\u4f7f\u7528\u4e86\u53ef\u91cd\u5165\u9501(ReentrantLock), \u800c\u975e\u540c\u6b65\u9501(synchronized) \u7684\u6570\u636e\u7ed3\u6784\u8fd8\u662f\u53ef\u4ee5\u653e\u5fc3\u4f7f\u7528\u7684\u3002<br\/><br\/>\n\u4e0b\u9762\u662f BatchQueue \u7684\u7b80\u5355\u5b9e\u73b0"},{"title":"Java \u8fd0\u884c\u65f6\u5982\u4f55\u83b7\u53d6\u6cdb\u578b\u53c2\u6570\u7684\u7c7b\u578b","link":"https:\/\/yanbin.blog\/java-how-to-get-generic-type\/","pubDate":"Sun, 05 Feb 2017 00:57:12 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-how-to-get-generic-type\/","description":"\n\u5728 Java \u4e2d\u5bf9\u4e8e\u4e0b\u9762\u6700\u7b80\u5355\u7684\u6cdb\u578b\u7c7b<br\/>\n<blockquote>\nclass A&lt;T&gt; {<br \/>\n\u00a0\u00a0\u00a0 public void foo() {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u5982\u4f55\u5728\u6b64\u5904\u83b7\u5f97\u8fd0\u884c\u65f6 T \u7684\u5177\u4f53\u7c7b\u578b\u5462\uff1f<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n}\n<\/blockquote>\n\u8bbe\u60f3\u6211\u4eec\u4f7f\u7528\u65f6<br\/>\n<blockquote>\nnew A&lt;String&gt;().foo();\n<\/blockquote>\n<br\/>\n\u662f\u5426\u80fd\u5728 <code>foo()<\/code> \u65b9\u6cd5\u4e2d\u83b7\u5f97\u5f53\u524d\u7684\u7c7b\u578b\u662f String \u5462\uff1f\u7b54\u6848\u662f\u5426\u5b9a\u7684\uff0c\u4e0d\u80fd\u3002\u5728 <code>foo()<\/code> \u65b9\u6cd5\u4e2d this \u5f15\u7528\u7ed9\u4e0d\u51fa\u7c7b\u578b\u4fe1\u606f\uff0c<code>this.getClass()<\/code> \u5c31\u66f4\u4e0d\u53ef\u80fd\u4e86\uff0c\u56e0\u4e3a Java \u7684\u6cdb\u578b\u4e0d\u7b49\u540c\u4e8e C++ \u7684\u6a21\u677f\u7c7b\uff0c<code>this.getClass()<\/code> \u5b9e\u4f8b\u4f8b\u662f\u88ab\u6240\u6709\u7684\u4e0d\u540c\u5177\u4f53\u7c7b\u578b\u7684 A \u5b9e\u4f8b(new A&lt;String&gt;(), new A&lt;Integer&gt;() \u7b49) \u5171\u4eab\u7684\uff0c\u6240\u4ee5\u5728\u5b57\u8282\u7801\u4e2d\u7c7b\u578b\u4f1a\u88ab\u64e6\u9664\u5230\u4e0a\u9650\u3002<br\/><br\/>\n\u6211\u4eec\u53ef\u4ee5\u5728 IDE \u7684\u8c03\u8bd5\u65f6\u770b\u5230\u8fd9\u4e2a\u6cdb\u578b\u7c7b\u7684\u7b7e\u540d<br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2017\/java-how-to-get-generic-type\/generic_signature-1.png\"\nwidth=\"399px\"\n\/>"},{"title":"\u4f7f\u7528 Byte Buddy \u8fd0\u884c\u65f6\u751f\u6210\u6cdb\u578b\u5b50\u7c7b","link":"https:\/\/yanbin.blog\/leverage-bytebuddy-generate-generic-subclass\/","pubDate":"Wed, 01 Feb 2017 22:59:54 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/leverage-bytebuddy-generate-generic-subclass\/","description":"\n\u5728\u4e0a\u4e00\u7bc7\u4e2d\u5c1d\u8bd5\u4e86 <a href=\"https:\/\/yanbin.blog\/leverage-javassist-generate-generic-subclass\">\u4f7f\u7528 Javassist \u8fd0\u884c\u65f6\u751f\u6210\u6cdb\u578b\u5b50\u7c7b<\/a>\uff0c\u8fd9\u91cc\u8981\u7528\u53e6\u4e00\u4e2a\u66f4\u65b9\u4fbf\u7684\u5b57\u8282\u7801\u589e\u52a0\u7ec4\u4ef6 <a href=\"http:\/\/bytebuddy.net\/#\/\">Byte Buddy<\/a> \u6765\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd, \u4f46\u4ee3\u7801\u4e0a\u8981\u76f4\u767d\u4e00\u4e9b\u3002\u5c31\u662f\u8fd0\u7528 Byte Buddy \u5728\u8fd0\u884c\u65f6\u751f\u6210\u4e00\u4e2a\u7c7b\u7684\u5b50\u7c7b\uff0c\u5e26\u6cdb\u578b\u7684\uff0c\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u6ce8\u89e3\uff0c\u53ef\u751f\u6210\u7c7b\u6587\u4ef6\u6216 Class \u5b9e\u4f8b\uff0c\u4e0d\u8fc7\u8fd9\u91cc\u66f4\u8fdb\u4e00\u6b65\uff0c\u5b9e\u73b0\u7684\u65b9\u6cd5\u662f\u5e26\u53c2\u6570\u7684\u3002<br\/><br\/>\n\u7528 Byte Buddy \u64cd\u4f5c\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u6839\u672c\u4e0d\u9700\u8981\u63a5\u89e6\u4efb\u4f55\u5b57\u8282\u7801\u76f8\u5173\u7684\uff0c\u8bf8\u5982\u5e38\u91cf\u6c60\u7b49\u6982\u5ff5\u3002\u4e0e Javassist \u76f8\u6bd4\uff0cByte Buddy \u66f4\u4e3a\u5148\u8fdb\u7684\u662f\u80fd\u751f\u6210\u7684\u7c7b\u6587\u4ef6\u90fd\u662f\u53ef\u52a0\u8f7d\u8fd0\u884c\u7684\uff0c\u4e0d\u50cf Javassist \u751f\u6210\u7684\u7c7b\u6587\u4ef6\u53cd\u7f16\u8bd1\u51fa\u6765\u662f\u770b\u8d77\u6765\u662f\u6b63\u5e38\u7684\uff0c\u4f46\u4e00\u52a0\u8f7d\u6267\u884c\u5374\u4e0d\u90a3\u56de\u4e8b\u3002<br\/><br\/>\n\u672c\u4f8b\u6240\u4f7f\u7528\u7684 Byte Buddy \u7684\u7248\u672c\u662f\u5f53\u524d\u6700\u65b0\u7684 1.6.7\uff0c\u5728 Maven \u9879\u76ee\u4e2d\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u5f15\u5165\u4f9d\u8d56<br\/>\n<blockquote>\n&lt;dependency&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;groupId&gt;net.bytebuddy&lt;\/groupId&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;artifactId&gt;byte-buddy&lt;\/artifactId&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;version&gt;1.6.7&lt;\/version&gt;<br \/>\n&lt;\/dependency&gt;\n<\/blockquote>\n\u4e0b\u9762\u662f\u51e0\u4e2a\u9700\u8981\u5728\u672c\u4f8b\u4e2d\u7528\u5230\u7684\u7c7b\u5b9a\u4e49"},{"title":"\u4f7f\u7528 Javassist \u8fd0\u884c\u65f6\u751f\u6210\u6cdb\u578b\u5b50\u7c7b","link":"https:\/\/yanbin.blog\/leverage-javassist-generate-generic-subclass\/","pubDate":"Wed, 01 Feb 2017 01:30:35 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/leverage-javassist-generate-generic-subclass\/","description":"\n<p>\u8d8a\u662f\u590d\u6742\u7684\u9879\u76ee\u5e0c\u671b\u4f7f\u7528\u8005\u80fd\u6109\u5feb\u7684\u7f16\u7801\u7684\u8bdd\uff0c\u53ef\u80fd\u5c31\u8981\u4f7f\u7528\u5230\u5b57\u8282\u7801\u589e\u5f3a\u5de5\u5177\u6765\u6697\u5730\u91cc\u505a\u4e9b\u624b\u811a\u3002\n\u8fd9\u65b9\u9762\u7684\u5de5\u5177\u6709 JDK \u7684 Instrumentation, <a href=\"http:\/\/asm.ow2.org\/\">ASM<\/a>,\n<a href=\"http:\/\/commons.apache.org\/proper\/commons-bcel\/\">BCEL<\/a>, <a href=\"https:\/\/github.com\/cglib\/cglib\/wiki\">CGLib<\/a>, i\n<a href=\"http:\/\/jboss-javassist.github.io\/javassist\/\">Javassist<\/a>,\n\u8fd8\u6709 <a href=\"http:\/\/bytebuddy.net\/#\/\">Byte Buddy<\/a>. Javassist \u548c Byte Buddy \u66f4\u8d34\u8fd1\u6211\u4eec\u7f16\u7801\u4e2d\u7684\u6982\u5ff5\uff0c\u4f7f\u7528\u8d77\u6765\u4e5f\u7b80\u5355\uff0c\n\u800c\u5176\u4ed6\u51e0\u4e2a\u5de5\u5177\u9700\u8981\u6211\u4eec\u66f4\u591a\u7684\u4e86\u89e3\u5b57\u8282\u7801\u6307\u4ee4\uff0c\u4ee5\u53ca\u5e38\u91cf\u6c60\u7b49\u6982\u5ff5\u3002\u6240\u4ee5\u6211\u7740\u91cd\u53bb\u4e86\u89e3\u600e\u4e48\u8fd0\u7528 Javassist \u548c Byte Buddy \u6765\u52a8\u6001\u4fee\u6539\u6765\u751f\u6210\u7c7b\u6587\u4ef6\u3002<\/p>\n<br\/>\n\u6240\u4ee5\u672c\u6587\u662f\u7cfb\u5217\u4e2d\u7684\u7b2c\u4e00\u7bc7\uff0c\u65e8\u5728\u4ee5\u4e00\u4e2a Javassist \u7684\u4f8b\u5b50\u6765\u4e86\u89e3\u5b83\u7684\u57fa\u672c\u4f7f\u7528\u65b9\u6cd5\u3002\u672c\u4f8b\u4e2d\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u751f\u6210\u4e00\u4e2a\u7c7b\u7684\u5b50\u7c7b\uff0c\u5e76\u4e14\u662f\u6cdb\u578b\u7684\uff0c\u5b9e\u73b0\u4e86\u4e00\u4e2a\u65b9\u6cd5\uff0c\u7ed9\u7c7b\u52a0\u4e0a\u4e86\u4e00\u4e2a\u6ce8\u89e3\uff0c\u6700\u7ec8\u751f\u6210\u4e00\u4e2a\u7c7b\u6587\u4ef6\u3002\u603b\u4e4b\u5c3d\u53ef\u80fd\u7684\u8ba9\u8fd9\u4e2a\u4f8b\u5b50\u5177\u6709\u4ee3\u8868\u6027\uff0c\u540c\u65f6\u53c8\u9700\u63a7\u5236\u5b83\u7684\u590d\u6742\u6027\u3002\u6700\u540e\u901a\u8fc7\u52a0\u8f7d\u7c7b\u6587\u4ef6\u7684\u65b9\u5f0f\u6765\u9a8c\u8bc1\u524d\u9762\u751f\u6210\u7684\u7c7b\u662f\u5426\u662f\u6b63\u786e\u7684\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u53cd\u7f16\u8bd1\u751f\u6210\u7684\u7c7b\u6587\u4ef6\u6765\u67e5\u770b\u6e90\u4ee3\u7801\uff0c\u4e0d\u8fc7\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6211\u4eec\u53ef\u80fd\u4f1a\u88ab\u53cd\u7f16\u8bd1\u51fa\u6765\u7684\u6e90\u4ee3\u7801\u6b3a\u9a97\u3002<br\/><br\/>\n\u672c\u4f8b\u6240\u4f7f\u7528\u7684 Javassist \u7684\u7248\u672c\u662f 3.21.0-GA, \u662f\u5728\u4e00\u4e2a Maven \u9879\u76ee\u4e2d\u6d4b\u8bd5\u7684\uff0c\u6240\u4ee5 Maven \u7684\u4f9d\u8d56\u662f<br\/>\n<blockquote>\n&lt;dependency&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;groupId&gt;org.javassist&lt;\/groupId&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;artifactId&gt;javassist&lt;\/artifactId&gt;<br \/>\n\u00a0\u00a0\u00a0 &lt;version&gt;3.21.0-GA&lt;\/version&gt;<br \/>\n&lt;\/dependency&gt;\n<\/blockquote>"},{"title":"Java 8 \u53ef\u91cd\u590d\u6ce8\u89e3\u7684\u7406\u89e3\u4e0e\u5e94\u7528","link":"https:\/\/yanbin.blog\/java8-repeatable-annotations\/","pubDate":"Mon, 16 Jan 2017 23:08:46 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java8-repeatable-annotations\/","description":"\n<h2>Java 8 \u4e4b\u524d\u5982\u4f55\u91cd\u590d\u4f7f\u7528\u6ce8\u89e3<\/h2>\n\u5728 Java 8 \u4e4b\u524d\u6211\u4eec\u4e0d\u80fd\u5728\u4e00\u4e2a\u7c7b\u578b\u91cd\u590d\u4f7f\u7528\u540c\u4e00\u4e2a\u6ce8\u89e3\uff0c\u4f8b\u5982 Spring \u7684\u6ce8\u89e3 <code>@PropertySource<\/code>\u00a0\u4e0d\u80fd\u4e0b\u9762\u90a3\u6837\u6765\u5f15\u5165\u591a\u4e2a\u5c5e\u6027\u6587\u4ef6<\/p>\n<blockquote>\n@PropertySource(\"classpath:config.properties\")<br \/>\n@PropertySource(\"file:application.properties\")<br \/>\npublic class MainApp {}\n<\/blockquote>\n\u4e0a\u9762\u7684\u4ee3\u7801\u65e0\u6cd5\u5728 Java 7 \u4e0b\u901a\u8fc7\u7f16\u8bd1\uff0c\u9519\u8bef\u662f: <span style=\"color: #800000;\">Duplicate annotation<\/span><br\/><br\/>\n\u4e8e\u662f\u6211\u4eec\u5728 Java 8 \u4e4b\u524d\u60f3\u5230\u4e86\u4e00\u4e2a\u65b9\u6848\u6765\u89c4\u907f Duplicate Annotation \u7684\u9519\u8bef: \u5373\u58f0\u660e\u4e00\u4e2a\u65b0\u7684 Annotation \u6765\u5305\u88f9 <code>@PropertySource<\/code>, \u5982 <code>@PropertySources<\/code><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nd\">@Retention<\/span><span class=\"p\">(<\/span><span class=\"n\">RetentionPolicy<\/span><span class=\"p\">.<\/span><span class=\"na\">RUNTIME<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"nd\">@interface<\/span><span class=\"w\"> <\/span><span class=\"n\">PropertySources<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">PropertySource<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"nf\">value<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u7136\u540e\u4f7f\u7528\u65f6\u4e24\u4e2a\u6ce8\u89e3\u9f50\u4e0a\u9635"},{"title":"Mockito \u5982\u4f55 mock \u8fd4\u56de\u503c\u4e3a void \u7684\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/mockito-how-to-mock-void-method\/","pubDate":"Mon, 16 Jan 2017 00:59:35 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-how-to-mock-void-method\/","description":"\n\u6700\u521d\u63a5\u89e6 Mockito \u8fd8\u601d\u8003\u5e76\u5c1d\u8bd5\u8fc7\u5982\u4f55\u7528\u5b83\u6765 mock \u8fd4\u56de\u503c\u4e3a void \u7684\u65b9\u6cd5\uff0c\u7136\u800c Google \u67e5\u627e\u5230\u7684\u4e00\u822c\u90fd\u4f1a\u8bf4\u7528 <code>doThrow()<\/code> \u7684\u529e\u6cd5<\/p>\n<blockquote>\ndoThrow(new RuntimeException()).when(mockObject).methodWithVoidReturn();\n<\/blockquote>\n\u56e0\u4e3a\u65e0\u6cd5\u4f7f\u7528\u5e38\u89c4\u7684 <code>when(mockObject.foo()).thenReturn(...)<\/code> \u7684\u65b9\u6cd5\u3002<br\/><br\/>\n\u5f53\u65f6\u6211\u5c31\u7eb3\u95f7\uff0c\u4e3a\u4f55\u6211\u60f3 mock \u4e00\u4e2a\u8fd4\u56de\u503c\u4e3a void \u7684\u65b9\u6cd5\uff0c\u5374\u662f\u5728\u6a21\u62df\u629b\u51fa\u4e00\u4e2a\u5f02\u5e38\uff0c\u73b0\u5728\u60f3\u6765\u5982\u679c\u4e00\u4e2a\u8fd4\u56de\u503c\u4e3a void \u7684\u65b9\u6cd5\uff0c\u4e3a\u4f55\u8981\u53bb mock \u8fd9\u4e2a\u65b9\u6cd5\u5462\uff1f<br\/><br\/>\n\u56de\u60f3\u4e00\u4e2a\u6211\u4eec\u8981 mock \u4e00\u4e2a\u65b9\u6cd5\u7684\u610f\u56fe\u662f\u4ec0\u4e48\uff1a<br\/><br\/>\n<ol>\n<li>\u5728\u7279\u5b9a\u8f93\u5165\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\u671f\u5f85\u9700\u8981\u7684\u8f93\u51fa\u7ed3\u679c(\u8fd4\u56de\u503c)<\/li>\n<li>\u5728\u65b9\u6cd5\u629b\u51fa\u67d0\u79cd\u7c7b\u578b\u5f02\u5e38\u8c03\u7528\u8005\u4f5c\u51fa\u7684\u53cd\u5e94<\/li>\n<\/ol>\n<br\/>\n\u5bf9\u4e8e void \u8fd4\u56de\u503c\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u8981\u9a8c\u8bc1\u6709\u6ca1\u6709\u88ab\u8c03\u7528\u8fc7\u51e0\u6b21\u53ef\u4ee5\u5728\u4e8b\u540e\u7528 <code>verify()<\/code> \u65b9\u6cd5\u53bb\u65ad\u8a00\u3002\u6240\u4ee5\u57fa\u672c\u4e0a\u5bf9\u4e8e void \u8fd4\u56de\u503c\u7684\u65b9\u6cd5\u4e00\u822c\u53ef\u4e0d\u7528\u53bb mock \u5b83\uff0c\u53ea\u9700\u7528\u00a0 verify() \u53bb\u9a8c\u8bc1\uff0c\u6216\u8005\u5c31\u662f\u50cf\u524d\u9762\u4e00\u6837\u6a21\u62df\u51fa\u73b0\u5f02\u5e38\u65f6\u7684\u60c5\u51b5\u3002<br\/><br\/>\n\u6240\u4ee5\u672c\u6587\u5e76\u4e0d\u50cf\u662f\u53bb\u76f4\u63a5\u56de\u7b54\u6807\u9898\u6240\u793a\u7684\u95ee\u9898: Mockito \u5982\u4f55 mock\u00a0 \u8fd4\u56de\u503c\u4e3a\u00a0 void \u7684\u65b9\u6cd5\uff0c\u800c\u662f\u5982\u4f55\u5e94\u5bf9 mock\u00a0 \u5bf9\u8c61\u7684\u00a0 void \u65b9\u6cd5"},{"title":"Mockito \u4e2d\u6355\u83b7 mock \u5bf9\u8c61\u65b9\u6cd5\u7684\u8c03\u7528\u53c2\u6570","link":"https:\/\/yanbin.blog\/mockito-capture-method-paramters\/","pubDate":"Sun, 15 Jan 2017 01:57:46 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/mockito-capture-method-paramters\/","description":"\nMockito \u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u521b\u5efa Mock \u5bf9\u8c61\uff0cmock \u88ab\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u65ad\u8a00\u8c03\u7528\u6b21\u6570\uff0c\u5728\u65b9\u6cd5\u53c2\u6570\u4e0d\u6613\u786e\u5b9a\u7684\u60c5\u51b5\u4e0b\u8fd8\u80fd\u5e2e\u6211\u4eec\u6355\u83b7\u53c2\u6570\u3002\u4e0b\u9762\u662f\u6211\u4eec\u7b2c\u4e00\u4e2a\u95ee\u9898:<br\/><br\/>\n<h2>\u4e3a\u4ec0\u4e48\u8981\u6355\u83b7\u8c03\u7528\u53c2\u6570<\/h2>\n\u5728\u88ab mocker \u65b9\u6cd5\u8c03\u7528\u53c2\u6570\u660e\u786e\u7684\u60c5\u51b5\u4e0b\u53ef\u65e0\u9700\u6355\u83b7\u53c2\u6570\uff0c\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u60c5\u666f\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">dontCaptureArgument<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">UserDao<\/span><span class=\"w\"> <\/span><span class=\"n\">userDao<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Mockito<\/span><span class=\"p\">.<\/span><span class=\"na\">mock<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDao<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">UserService<\/span><span class=\"w\"> <\/span><span class=\"n\">userService<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">UserService<\/span><span class=\"p\">(<\/span><span class=\"n\">userDao<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">User<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">User<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Yanbin&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">userService<\/span><span class=\"p\">.<\/span><span class=\"na\">saveUser<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u5047\u5982\u5b83\u7684\u5b9e\u73b0\u662f userDao.save(user)<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">verify<\/span><span class=\"p\">(<\/span><span class=\"n\">userDao<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">times<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">)).<\/span><span class=\"na\">save<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u65ad\u8a00\u4e86 userDao.save(user) \u64cd\u4f5c\u7684\u8fd8\u662f user \u5bf9\u8c61<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5982\u679c UserService \u7684 save(user) \u6700\u7ec8\u64cd\u4f5c\u7684\u4e0d\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5b83\u7684\u5b9e\u73b0\u7a0d\u52a0\u53d8\u5316\u5982\u4e0b"},{"title":"Java 8 CompletableFuture \u6d45\u5165","link":"https:\/\/yanbin.blog\/java-8-completablefuture-brief-touch\/","pubDate":"Fri, 23 Dec 2016 01:50:09 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-completablefuture-brief-touch\/","description":"\nJava 1.5 \u6709\u4e86 <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/Future.html\">Future<\/a>, \u53ef\u8c13\u662f\u8de8\u4e86\u4e00\u5927\u6b65\uff0c\u7ee7\u800c Java 1.8 \u65b0\u52a0\u5165\u4e00\u4e2a Future \u7684\u5b9e\u73b0<a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\"> CompletableFuture<\/a>, \u4ece\u6b64\u7ebf\u7a0b\u4e0e\u7ebf\u7a0b\u4e4b\u95f4\u53ef\u4ee5\u6109\u5feb\u7684\u5bf9\u8bdd\u4e86\u3002\u6700\u521d\u4e24\u4e2a\u7ebf\u7a0b\u95f4\u7684\u534f\u8c03\u6211\u91c7\u7528\u8fc7 Object \u7684 \u00a0<code>wait()<\/code>\u00a0\u548c <code>notify()<\/code>\u00a0, Thread \u7684 <code>join()<\/code> \u65b9\u6cd5\uff0c\u90a3\u53ef\u7b97\u662f\u5f88\u4f4e\u7ea7\u7684 API \u4e86\uff0c\u662f\u5426\u5f88\u591a Java \u7a0b\u5e8f\u90fd\u4e0d\u77e5\u9053\u5b83\u4eec\u7684\u5b58\u5728\uff0c\u6216\u6839\u672c\u6ca1\u7528\u8fc7\u5b83\u4eec\u3002<\/p>\n<br\/>\n\u5982\u679c\u662f\u7b80\u5355\u7684\u7b49\u5f85\u6240\u6709\u7ebf\u7a0b\u5b8c\u6210\u53ef\u4f7f\u7528 Java 1.5 \u7684 <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/CountDownLatch.html\">CountDownLatch<\/a>, \u8fd9\u91cc\u6709\u4e00\u7bc7\u4ecb\u7ecd <a href=\"http:\/\/unmi.cc\/countdownlatch-threads\/\">CountDownLatch \u534f\u8c03\u7ebf\u7a0b<\/a>, \u5c31\u662f\u5b9e\u73b0\u7684 waitAll(threads) \u529f\u80fd\u3002\u800c Java 8 \u7684 <code>CompletableFuture<\/code>\u00a0\u7684\u529f\u80fd\u5c31\u591a\u53bb\uff0c\u53ef\u7b80\u5355\u4f7f\u7528\u5b83\u5b9e\u73b0\u5f02\u6b65\u65b9\u6cd5\u3002\u867d\u8bf4 <code>CompletableFuture<\/code>\u00a0\u5b9e\u73b0\u4e86 <code>Future<\/code>\u00a0\u63a5\u53e3\uff0c\u4f46\u5b83\u591a\u6570\u65b9\u6cd5\u6e90\u81ea\u4e8e <code>CompletionStage<\/code>, \u6240\u4ee5\u8fd8\u91cc\u6c0f\u4ee3\u6362\uff0c\u7528 <code>Future<\/code>\u00a0\u6765\u5f15\u7528 <code>CompletableFuture<\/code>\u00a0\u5b9e\u4f8b\u5c31\u5f88\u7275\u5f3a\u4e86; \u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48 PlayFramework \u81ea 2.5 \u5f00\u59cb\u76f4\u63a5\u66b4\u9732\u7684\u7c7b\u578b\u662f <code>CompletionStage<\/code>\u00a0\u800c\u975e\u5176\u4ed6\u4e24\u4e2a\u3002<br\/><br\/>\n\u987e\u540d\u601d\u4e49\uff0cCompletableFuture \u4ee3\u8868\u7740\u4e00\u4e2a Future \u5b8c\u6210\u540e\u8be5\u5e72\u70b9\u4ec0\u4e48\uff0c\u5177\u4f53\u5927\u81f4\u6709\uff1a<br\/><br\/>\n<ol>\n<li>Future \u5b8c\u6210\u540e\u6267\u884c\u52a8\u4f5c\uff0c\u6216\u6c42\u53d6\u4e0b\u4e00\u4e2a Future \u7684\u503c\u3002then...<\/li>\n<li>\u591a\u4e2a Future \u7684\u534f\u8c03; \u540c\u65f6\u5b8c\u6210\u8be5\u600e\u4e48\uff0c\u5176\u4e2d\u4e00\u4e2a\u5b8c\u6210\u8be5\u5982\u4f55\u3002allOf, anyOf<\/li>\n<\/ol>\n<br\/>\n\u6709\u65f6\u5019\u53ef\u4ee5\u628a Future \u60f3\u50cf\u6210\u4e0e\u7ebf\u7a0b\u662f\u4e00\u4e00\u5bf9\u5e94\u7684\u3002"},{"title":"\u5de9\u56fa Java Future \u7684\u4f7f\u7528","link":"https:\/\/yanbin.blog\/consolidate-use-of-java-future\/","pubDate":"Thu, 22 Dec 2016 00:13:11 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/consolidate-use-of-java-future\/","description":"\n<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/Future.html\">Future<\/a> \u8fd8\u662f\u4e00 Java 1.5 \u5e26\u8fdb\u6765\u7684\u4ea7\u7269\uff0c\u4f46\u8fc7\u53bb\u90a3\u4e48\u591a\u5e74\u5b9e\u9645\u4ee3\u7801\u4e2d\u5374\u5f88\u5c11\u6709\u76f4\u63a5\u63a5\u89e6, \u5927\u7ea6\u5b83\u591a\u662f\u9690\u533f\u5728\u5404\u79cd\u73b0\u6210\u6846\u67b6\u4e2d\u9ed8\u9ed8\u7684\u4e3a\u6211\u4eec\u670d\u52a1\u3002Future \u672c\u8eab\u4e0d\u4ee3\u8868\u7740\u591a\u7ebf\u7a0b\uff0c\u800c\u662f\u4ee3\u8868\u7740\u9700\u5f02\u6b65\u8ba1\u7b97\u7684\u7ed3\u679c, \u5c06\u6765\u7684\u4e00\u4e2a\u671f\u5f85\uff0c\u81f3\u4e8e\u540e\u6765\u771f\u6b63\u7684\u7ed3\u679c\u4e0d\u53ef\u77e5\u3002\u5728\u6b64\u4e4b\u524d\u60f3\u8981\u83b7\u5f97\u4e00\u4e2a <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Runnable.html\">Runnable<\/a> \u5728\u5176\u4ed6\u7ebf\u7a0b\u4e2d\u7684\u8ba1\u7b97\u7ed3\u679c\u9887\u8d39\u6ce2\u6298\uff0c\u6709\u4e86 Future \u52a0\u4e4b\u5b83\u8eab\u540e\u7684 <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/Callable.html\">Callable<\/a> \u4e00\u5207\u5c31\u53d8\u5f97\u7b80\u5355\u4e86\u3002<\/p>\n<br\/>\n\u5bf9\u6bd4\u4e00\u4e0b Java 1.5 \u524d\u540e\u7684\u4e0b\u9762\u51e0\u4e2a\u6982\u5ff5<br\/><br\/>\n<ol>\n<li>Callable \u76f8\u5f53\u4e8e\u4e4b\u524d\u7684 Runnable, \u53ea\u662f Callable \u662f\u6709\u8fd4\u56de\u503c\u7684<\/li>\n<li>ExecuteService.submit(callable): Future \u5c31\u7c7b\u4f3c\u4e8e\u4e4b\u524d\u7684 Thread(runnable)<br \/>\n\u53ea\u662f\u524d\u8005 submit \u540e\u7acb\u5373\u6267\u884c\uff0c\u901a\u8fc7 get() \u83b7\u5f97\u7ed3\u679c\uff0c\u540e\u8005\u7528 start() \u65b9\u6cd5\u542f\u52a8\uff0crunnable \u662f\u6ca1\u6709\u7ed3\u679c\u7684\u3002\u5982\u679c\u4f60\u4e5f\u4e0d\u60f3\u5173\u5fc3 Future \u7684\u7ed3\u679c\u4e5f\u80fd ExecuteService.submit(runnable)<\/li>\n<\/ol>\n<br\/>\n\u53ea\u6709 callable \u88ab\u63d0\u4ea4(\u5230\u7ebf\u7a0b\u6c60) \u540e\u8fd4\u56de\u7684 Future \u624d\u53ef\u80fd\u4f1a\u6709\u7ed3\u679c, \u6240\u4ee5\u4e0b\u9762\u7684\u4ee3\u7801\u6c38\u8fdc\u7b49\u4e0d\u5230\u7ed3\u679c<br\/>\n<blockquote>\nFuture<String> future = new FutureTask<>(() -> \"Never\");<br \/>\nString result = future.get();\n<\/blockquote>\n<br\/>\n\u6700\u5bb9\u6613\u7406\u89e3\u7684 Future \u57fa\u672c\u4f7f\u7528\u4ee3\u7801\u5982\u4e0b\uff1a"},{"title":"Java \u7684\u53c2\u6570\u68c0\u67e5\u4e0e\u65ad\u8a00 - Guava Preconditions","link":"https:\/\/yanbin.blog\/java-assertion-guava-preconditions\/","pubDate":"Tue, 13 Dec 2016 00:11:13 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-assertion-guava-preconditions\/","description":"\n\u5728\u524d\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/scala-parameter-check-and-assertion\/\">Scala \u7684\u53c2\u6570\u68c0\u67e5\u4e0e\u65ad\u8a00: require, assert, assume \u548c ensuring<\/a>\uff0c\u6349\u6478 Scala \u7684\u65ad\u8a00\u65f6\u63d0\u5230\u4e86 JDK \u5185\u7f6e\u5bf9\u65ad\u8a00\u7684\u7c97\u7565\u652f\u6301\uff0c\u4e5f\u5c31\u662f\u00a0<code>assert<\/code>\u00a0\u8bed\u53e5\uff0c\u5e76\u4e14\u9ed8\u8ba4\u8be5\u7279\u6027\u662f\u88ab\u5173\u6389\uff0c\u9700 <code>-ea<\/code>\u00a0\u5f00\u542f\u3002<\/p>\n<blockquote>\nassert object != null;<br \/>\nassert object != null : \"object can't be null\";\n<\/blockquote>\n\u8fd8\u8fdb\u4e00\u6b65\u63a5\u89e6\u4e86 Scala \u7684 <code>Predef<\/code>\u00a0\u65b9\u6cd5 <code>require<\/code>, <code>assert<\/code>, <code>assume<\/code>, \u548c <code>ensuring<\/code>\u00a0\u662f\u600e\u4e48\u68c0\u9a8c\u53c2\u6570\u4e0e\u65ad\u8a00\u8fd0\u7b97\u7ed3\u679c\u7684\uff0cScala \u7684\u8fd9\u4e9b\u65b9\u6cd5\u5728\u6821\u9a8c\u5931\u8d25\u65f6\u76f8\u5e94\u7684\u629b\u51fa <code>IllegalArgumentException<\/code>\u00a0\u548c \u00a0<code>AssertionError<\/code>\u00a0\u5f02\u5e38\u3002<br\/><br\/>\nJDK \u00a07 \u5f15\u5165\u4e86 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Objects.html\">Objects<\/a> \u5de5\u5177\u7c7b\uff0c\u5b83\u7684\u4e09\u4e2a <code>T requireNotNull(T object)<\/code>\u00a0\u65b9\u6cd5\u80fd\u5bf9\u53c2\u6570\u8fdb\u884c null \u503c\u68c0\u67e5\uff0cnull \u65f6\u629b\u51fa <code>NullPointerException<\/code><br\/><br\/>\n<a href=\"https:\/\/yanbin.blog\/posts\/2016\/java-assertion-guava-preconditions\/Java-Objects-requireNotNull.png\" target=\"_blank\" rel=\"noreferrer\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2016\/java-assertion-guava-preconditions\/Java-Objects-requireNotNull-800x119.png\"\nwidth=\"800px\"\n\/>\n<\/a>"},{"title":"Java \u5355\u5143\u6d4b\u8bd5\u5982\u4f55\u65ad\u8a00(\u68c0\u67e5)\u63a7\u5236\u53f0\u8f93\u51fa","link":"https:\/\/yanbin.blog\/java-unit-test-assert-console-output\/","pubDate":"Tue, 18 Oct 2016 00:09:02 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-unit-test-assert-console-output\/","description":"\n<p>\u5173\u4e8e\u5728 JUnit \u5355\u5143\u6d4b\u8bd5\u4e2d\u5982\u4f55\u65ad\u8a00\u67d0\u4e2a\u51fd\u6570\u7684\u63a7\u5236\u53f0\u8f93\u51fa\u5df2\u662f\u6211\u4e00\u4e2a\u957f\u4e45\u7684\u95ee\u9898. \u867d\u7136\u6709\u63a7\u5236\u53f0\u8f93\u51fa\u7684\u51fd\u6570\u6709\u4e86\u526f\u4f5c\u7528, \u4e0d\u80fd\u79f0\u4e4b\u4e3a\u4e00\u4e2a\u7eaf\u51fd\u6570, \u5728\u8bb2\u6c42\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u4eca\u5929, \u7eaf\u51fd\u6570\u662f\u6700\u597d\u6d4b\u8bd5\u7684, \u6240\u8c13\u7684 Data In, Data Out. \u4f46\u603b\u8fd8\u662f\u6709\u8fd9\u6837\u7684\u9700\u6c42, \u6bd4\u5982\u81ea\u5df1\u5b9e\u73b0\u7684\u67d0\u4e2a\u65e5\u5fd7\u6846\u67b6\u7684 Appender, \u9700\u8981\u9a8c\u8bc1\u5b83\u5411\u63a7\u5236\u53f0\u7684\u8f93\u51fa\u5185\u5bb9.<\/p>\n<p>\u6211\u5148\u524d\u5728\u9879\u76ee\u4e2d\u7684\u529e\u6cd5\u662f, \u5148\u628a\u628a\u6807\u51c6\u8f93\u51fa\u5b9a\u5411\u5230\u4e00\u4e2a <code>ByteArrayOutputStream<\/code>\u00a0\u4e2d\u53bb, \u5b8c\u540e\u628a\u8fd9\u4e2a\u6d41\u8f6c\u6210\u5b57\u7b26\u4e32\u6765\u65ad\u8a00\u5b83\u7684\u5185\u5bb9, \u6700\u540e\u6062\u590d\u6807\u51c6\u8f93\u51fa\u4e3a <code>System.out<\/code>, \u4ee3\u7801\u5982\u4e0b:<\/p>\n<blockquote>\n<p>ByteArrayOutputStream output = new ByteArrayOutputStream();<br \/>\nSystem.setOut(new PrintStream(output));<\/p>\n<p>System.out.print(\"Hello\");<br \/>\n<br \/>\nassertThat(output.toString(), is(\"Hello\");<br \/>\nSystem.setOut(System.out);<\/p>\n<\/blockquote>\n<p>\u8fd9\u6837\u4e5f\u80fd\u5b8c\u6210\u4efb\u52a1, \u672c\u8d28\u4e5f\u662f\u5bf9\u7684, \u4f46\u7a0d\u663e\u590d\u6742\u4e86\u4e9b. \u4eca\u5929\u8bfb <code>Spring in Action<\/code>\u00a0\u4e00\u4e66, \u53d1\u73b0\u5b83\u7528\u4e86 <code>StandardOutputStreamLog<\/code>\u00a0\u8fd9\u4e2a JUnit \u7684 <code>@Rule<\/code>, \u6765\u81ea\u4e8e <a href=\"http:\/\/stefanbirkner.github.io\/system-rules\/\">System Rules<\/a>. \u5176\u5b9e <code>StandardOutputStreamLog<\/code>\u00a0\u7c7b\u5df2\u4e0d\u63a8\u8350\u4f7f\u7528, \u53d6\u800c\u4ee3\u4e4b\u7684\u662f <a href=\"http:\/\/stefanbirkner.github.io\/system-rules\/#SystemErrAndOutRule\">SystemOutRule<\/a>, \u6240\u4ee5\u5e94\u7528 <code>SystemOutRule<\/code>\u00a0\u6765\u65ad\u8a00\u63a7\u5236\u53f0\u8f93\u51fa\u7684\u6d4b\u8bd5\u65b9\u6cd5\u5c31\u662f"},{"title":"Kafka \u751f\u4ea7\u6d88\u8d39 Avro \u5e8f\u5217\u5316\u6570\u636e","link":"https:\/\/yanbin.blog\/kafka-produce-consume-avro-data\/","pubDate":"Sun, 16 Oct 2016 15:53:15 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/kafka-produce-consume-avro-data\/","description":"\n\u672c\u6587\u5b9e\u8df5\u4e86\u5982\u4f55\u8fde\u63a5 Kafka \u751f\u4ea7\u548c\u6d88\u8d39 Avro \u5e8f\u5217\u5316\u683c\u5f0f\u7684\u6570\u636e, \u4e0d\u80fd\u50cf NgAgo-gDNA \u90a3\u6837, \u4e3a\u4fdd\u8bc1\u5b9e\u9a8c\u5185\u5bb9\u53ca\u7ed3\u679c\u7684\u53ef\u91cd\u590d\u6027, \u6587\u4e2d\u6240\u7528\u7684\u5404\u4e2d\u95f4\u4ef6\u548c\u7ec4\u4ef6\u7248\u672c\u5982\u4e0b:<br\/><br\/>\n<ol>\n<li>Apache Kafka: <a href=\"https:\/\/www.apache.org\/dyn\/closer.cgi?path=\/kafka\/0.10.0.1\/kafka_2.11-0.10.0.1.tgz\">kafka_2.11-0.10.0.1<\/a>, \u8fd9\u4e2a\u7248\u672c\u5728\u521d\u59cb\u59cb\u5316\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u7684\u5c5e\u6027\u4e0e\u4e4b\u524d\u7248\u672c\u6709\u6240\u4e0d\u540c.<\/li>\n<li>kafka-clients: Java API \u5ba2\u6237\u7aef, \u7248\u672c\u4e3a \u00a00.10.0.1<\/li>\n<li>Apache Avro: 1.8.1.\u00a0\u5173\u4e8e Avro \u5e8f\u5217\u5316\u7684\u5185\u5bb9\u53ef\u53c2\u89c1 <a href=\"https:\/\/yanbin.blog\/apache-avro-serializing-deserializing\">Apache Avro \u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316 (Java \u5b9e\u73b0)<\/a><\/li>\n<li>Java 8<\/li>\n<\/ol>\n<br\/>\nApache Kafka \u6d88\u606f\u7cfb\u7edf\u8bbe\u8ba1\u4e3a\u53ef\u4ee5\u4f20\u8f93\u5b57\u7b26\u4e32, \u4e8c\u8fdb\u5236\u7b49\u6570\u636e, \u4f46\u76f4\u63a5\u7528\u4e8e\u4f20\u8f93\u751f\u4ea7\u6d88\u8d39\u4e24\u7aef\u90fd\u80fd\u7406\u89e3\u7684\u5bf9\u8c61\u6570\u636e\u4f1a\u66f4\u53cb\u597d. \u00a0\u6240\u4ee5\u6211\u4eec\u8fd9\u91cc\u7528 Avro \u7684 Schema \u00a0\u6765\u5b9a\u4e49\u8981\u4f20\u8f93\u7684\u6570\u636e\u683c\u5f0f, \u901a\u4fe1\u65f6\u91c7\u7528\u81ea\u5b9a\u4e49\u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u7c7b\u8fdb\u884c\u5bf9\u8c61\u4e0e\u5b57\u8282\u6570\u7ec4\u95f4\u7684\u8f6c\u6362.<br\/><br\/>\n\u4ee5\u4e0b\u662f\u6574\u4e2a\u5b9e\u9a8c\u8fc7\u7a0b<br\/><br\/>\n<h3>\u672c\u5730\u542f\u52a8 Apache Kafka \u670d\u52a1<\/h3>\n\u8bf7\u53c2\u8003 <a href=\"https:\/\/yanbin.blog\/initial-apache-kafka-environment\">\u7b80\u5355\u642d\u5efa Apache Kafka \u5206\u5e03\u5f0f\u6d88\u606f\u7cfb\u7edf<\/a>\u00a0\u542f\u52a8 ZooKeeper \u548c Kafka \u5373\u53ef. \u7a0b\u5e8f\u8fd0\u884c\u4f1a\u81ea\u52a8\u521b\u5efa\u76f8\u5e94\u7684\u4e3b\u9898. \u542f\u52a8\u540e Kafka \u5f00\u542f\u4e86\u672c\u5730\u7684 9092 \u7aef\u53e3, \u7a0b\u5e8f\u4e2d\u53ea\u9700\u8981\u8fde\u63a5\u8fd9\u4e2a\u7aef\u53e3, \u4e0d\u7528\u7ba1 ZooKeeper \u7684\u00a0 2181 \u7aef\u53e3."},{"title":"Apache Avro \u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316 (Java \u5b9e\u73b0)","link":"https:\/\/yanbin.blog\/apache-avro-serializing-deserializing\/","pubDate":"Sat, 15 Oct 2016 16:54:28 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/apache-avro-serializing-deserializing\/","description":"\n\u50cf\u4e24\u4e2a\u4eba\u4ea4\u6d41\u4e00\u6837\u8981\u627e\u4e00\u4e2a\u4e92\u76f8\u80fd\u7406\u89e3\u7684\u8bed\u8a00, \u5728\u56fd\u5185\u4e3a\u666e\u901a\u8bdd, \u8dd1\u56fd\u5916\u591a\u7528\u82f1\u8bed\u76f8\u901a, \u4e24\u4e2a\u8fdb\u7a0b\u95f4\u901a\u4fe1\u4e5f\u9700\u8981\u627e\u4e00\u4e2a\u5927\u5bb6\u90fd\u80fd\u7406\u89e3\u7684\u6570\u636e\u683c\u5f0f. \u7b80\u5355\u7684\u5982 JSON, XML, \u90a3\u662f\u81ea\u6211\u63cf\u8ff0\u6027\u683c\u5f0f, XML \u6709 Schema \u5b9a\u4e49, \u4f46\u5c1a\u65e0\u6b63\u5f0f\u7684 <a href=\"http:\/\/json-schema.org\/\">JSON Schema<\/a> \u89c4\u8303. \u5728\u8bb2\u6c42\u6548\u7387\u7684\u573a\u5408, \u7eaf\u6587\u672c\u5f0f\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u65e0\u6cd5\u6ee1\u8db3\u8981\u6c42, \u4e8e\u662f\u6709\u4e8c\u8fdb\u5236\u7684 Google Protobuf \u548c Apache Avro. \u5728 Apache \u7684\u751f\u6001\u50cf Hadoop, Kafka \u4e2d\u81ea\u7136\u662f\u9009\u7528 Avro.<br\/><br\/>\nAvro \u652f\u6301\u591a\u79cd\u8bed\u8a00, \u5982 C, C++, C#, Java, PHP, Python \u548c Ruby. \u5b83\u4f7f\u7528 JSON \u6765\u5b9a\u4e49 Schema, \u901a\u8fc7\u5de5\u5177\u53ef\u4ee5\u7531 Schema \u751f\u6210\u76f8\u5e94\u8bed\u8a00\u7684\u6570\u636e\u5bf9\u8c61, \u6bd4\u5982 Java \u7684 \u00a0avro-tools.jar. \u8fd9\u6837\u53ef\u4ee5\u5728\u8de8\u8fdb\u7a0b\u8de8\u8bed\u8a00\u900f\u660e\u7684\u5b9e\u73b0\u4e3a\u5bf9\u8c61\u4ea4\u6362.<br\/><br\/>\n\u672c\u6587\u4f53\u9a8c Java \u73af\u5883\u4e2d Avro \u6570\u636e\u683c\u5f0f\u7684\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316.<br\/><br\/>\nAvro Schema \u6587\u4ef6\u5c31\u662f\u6570\u636e\u751f\u4ea7\u548c\u6d88\u8d39\u7aef\u7684\u901a\u4fe1\u534f\u8bae; \u6211\u4eec\u53ef\u4ee5\u7531 Schema \u751f\u6210\u76f8\u5e94\u7684 Java \u5bf9\u8c61, \u7136\u540e\u4ee5\u5177\u4f53\u7684 Java \u5bf9\u8c61\u4ea4\u6362, \u6216\u8005\u4e0d\u751f\u6210 Java \u5bf9\u8c61\u800c\u7eaf\u7cb9\u4ee5 <code>GenericRecord<\/code>\u00a0\u4ea4\u4e92. \u4e3a\u64cd\u4f5c\u6570\u636e\u7684\u7b80\u5355, \u6211\u4eec\u901a\u5e38\u91c7\u7528\u524d\u4e00\u79cd\u65b9\u5f0f, \u5373\u751f\u6210\u5177\u4f53\u6570\u636e\u4f20\u8f93\u5bf9\u8c61."},{"title":"\u7b80\u5355\u642d\u5efa Apache Kafka \u5206\u5e03\u5f0f\u6d88\u606f\u7cfb\u7edf","link":"https:\/\/yanbin.blog\/initial-apache-kafka-environment\/","pubDate":"Thu, 06 Oct 2016 16:12:33 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/initial-apache-kafka-environment\/","description":"\n<p>\u65e9\u5148\u90fd\u662f\u7528\u7684\u57fa\u4e8e JMS \u89c4\u8303\u7684\u6d88\u606f\u7cfb\u7edf, \u50cf ActiveMQ, IBM MQSeries \u7b49. \u968f\u7740\u4e92\u8054\u7f51\u7684\u53d1\u5c55, \u5927\u7ea6\u662f\u8981\u9002\u5e94\u5f53\u4eca\u5927\u6570\u636e, \u9ad8\u53ef\u7528\u6027, \u9ad8\u6548\u7684\u9700\u6c42, \u4e8e\u662f\u8bde\u751f\u4e86 <a href=\"http:\/\/kafka.apache.org\/\">Apache Kafka<\/a> \u8fd9\u4e00\u65b0\u65f6\u4ee3\u7684\u5206\u5e03\u5f0f\u6d88\u606f\u7cfb\u7edf. Apache Kafka \u4e5f\u662f\u53d1\u5e03-\u8ba2\u9605\u5f0f\u7684\u6d88\u606f\u7cfb\u7edf, \u7528 Scala \u8bed\u8a00\u5199\u7684, \u5b83\u6700\u521d\u7531 LinedIn \u5f00\u53d1\u5e76\u8d21\u732e\u5230 Apache \u57fa\u91d1\u4f1a.<\/p>\n<p>Kafka \u7684\u96c6\u7fa4\u5b9e\u8d28\u662f\u4f9d\u8d56\u4e8e ZooKeeper \u7684\u96c6\u7fa4\u6765\u534f\u540c\u7ba1\u7406, \u6240\u4ee5\u8fd9\u91cc\u53ef\u4ee5\u53c2\u7167\u4e4b\u524d\u7684 <a href=\"https:\/\/yanbin.blog\/zookeeper-fast-get-started\/\">ZooKeeper \u5feb\u901f\u642d\u5efa\u4e0e\u4f53\u9a8c<\/a>\u00a0\u6765\u642d\u5efa\u4e00\u4e2a ZooKeeper \u96c6\u7fa4(\u5176\u5b9e\u8fd9\u662f\u4e00\u4e2a\u4f2a\u96c6\u7fa4, \u5b9e\u9645\u4ea7\u54c1\u4e2d\u5e94\u8be5\u628a ZooKeeper \u96c6\u7fa4\u5206\u5e03\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a).<\/p>\n<p>\u672c\u6587\u4e3b\u8981\u662f\u53c2\u8003\u5b98\u65b9\u7684 <a href=\"http:\/\/kafka.apache.org\/quickstart\">Kafka Quickstart<\/a> \u6765\u5feb\u901f\u4f53\u9a8c Kafka \u6d88\u606f\u7cfb\u7edf, \u4e0b\u8f7d\u7684 Kafka \u81ea\u5e26\u4e86 ZooKeeper, \u9ed8\u8ba4\u53ea\u542f\u52a8\u4e86\u4e00\u4e2a \u00a0ZooKeeper \u8282\u70b9. \u5982\u9700 ZooKeeper \u96c6\u7fa4\u53ef\u4ee5\u4e0d\u4f9d\u8d56\u4e8e Kafka \u81ea\u5e26\u7684 ZooKeeper \u800c\u5355\u72ec\u642d\u5efa.<\/p>\n<p>\u4e0b\u9762\u5f00\u59cb\u6f14\u793a\u5efa\u7acb\u4e00\u4e2a\u6700\u7b80\u5355\u7684 Kafka \u7cfb\u7edf"},{"title":"ZooKeeper \u5feb\u901f\u642d\u5efa\u4e0e\u4f53\u9a8c","link":"https:\/\/yanbin.blog\/zookeeper-fast-get-started\/","pubDate":"Tue, 04 Oct 2016 01:36:38 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/zookeeper-fast-get-started\/","description":"\nApache\u00a0<a href=\"https:\/\/zookeeper.apache.org\/\">ZooKeeper<\/a> \u662f\u4e00\u4e2a\u9762\u5411\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u7684\u9ad8\u6027\u80fd\u534f\u8c03\u670d\u52a1\u5668, \u81f3\u4e8e\u5b83\u7684\u5177\u4f53\u4ecb\u7ecd\u50cf\u80fd\u63d0\u4f9b\u547d\u540d\u548c\u914d\u7f6e\u7ba1\u7406\u3001\u540c\u6b65\u548c\u7ec4\u670d\u52a1\u7b49, \u8bf7\u81ea\u4e2a Google. \u867d\u7136\u5bf9 ZooKeeper \u65e9\u6709\u8033\u95fb, \u4e5f\u53ea\u6700\u8fd1\u56e0\u4e3a\u9879\u76ee\u4e2d\u6709 <a href=\"http:\/\/kafka.apache.org\/\">Kafka<\/a>\u00a0\u5185\u90e8\u7528\u5230\u4e86 ZooKeeper, \u6240\u4ee5\u624d\u4fc3\u4f7f\u6211\u7740\u624b\u53bb\u4e86\u89e3\u4e00\u4e0b ZooKeeper \u4e3a\u4f55\u7269. ZooKeeper \u8131\u80ce\u4e8e\u8457\u540d\u7684\u9879\u76ee Hadoop, \u5b83\u4e5f\u50cf\u00a0<a href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a> \u90a3\u6837\u672a\u91c7\u7528\u4e25\u683c\u610f\u4e49\u7684 Master-Slave \u7684\u96c6\u7fa4\u65b9\u5f0f, \u800c\u662f\u52a8\u6001\u9009\u51fa Leader, \u8fd9\u907f\u514d\u4e86\u5355\u70b9\u6545\u969c\u7684\u95ee\u9898.<br\/><br\/>\n\u65e2\u7136\u662f\u96c6\u7fa4, \u5b9e\u9645\u5e94\u7528\u662f\u4f1a\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\u542f\u52a8\u670d\u52a1, \u73b0\u5982\u4eca\u6709\u4e86 docker \u5f88\u5bb9\u6613\u7528\u5b83\u6765\u6d4b\u8bd5\u591a\u4e3b\u673a\u73af\u5883, \u7528 <code>docker search zookeeper<\/code>\u00a0\u5c31\u77e5\u9053\u4e86. \u672c\u5b9e\u4f8b\u4e2d\u6682\u4e0d\u6d89\u53ca docker, \u800c\u662f\u5728\u540c\u4e00\u4e2a\u7cfb\u7edf\u4e2d\u7528\u591a\u4e2a\u7aef\u53e3\u6765\u542f\u52a8\u4e09\u4e2a ZooKeeper \u5b9e\u4f8b\u8fdb\u884c\u6d4b\u8bd5. \u4e0b\u9762\u4ee5 Mac\/Linux \u4e3a\u4f8b:<br\/><br\/>\n<h3>\u4e0b\u8f7d\u5b89\u88c5 ZooKeeper<\/h3>\n\u5230 <a href=\"https:\/\/zookeeper.apache.org\/releases.html#download\">https:\/\/zookeeper.apache.org\/releases.html#download<\/a>\u00a0\u4e0b\u8f7d, \u5199\u4e0b\u6b64\u6587\u65f6\u7684\u6700\u65b0\u7a33\u5b9a\u7248\u662f\u00a0<a id=\"file-link\" tabindex=\"0\" href=\"http:\/\/mirrors.gigenet.com\/apache\/zookeeper\/stable\/zookeeper-3.4.9.tar.gz\">zookeeper-3.4.9.tar.gz<\/a>, \u4e0b\u8f7d\u540e\u89e3\u538b\u5230\u67d0\u5904, \u4e3a\u65b9\u4fbf\u8d77\u89c1\u628a\u89e3\u538b\u540e\u7684 zookeeper-3.4.9\/bin \u52a0\u5230\u7cfb\u7edf\u73af\u5883\u53d8\u91cf $PATH \u4e2d, \u4ee5\u540e\u65b9\u4fbf\u4efb\u4f55\u65f6\u5019\u8fd0\u884c zkServer.sh, zkCli.sh \u8fd9\u6837\u7684\u547d\u4ee4."},{"title":"Hazelcast \u4ecb\u7ecd\u4e0e\u4f7f\u7528(\u6574\u7406)","link":"https:\/\/yanbin.blog\/hazelcast-introduction\/","pubDate":"Mon, 26 Sep 2016 22:51:14 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/hazelcast-introduction\/","description":"\n\u8981\u7528\u5230 Hazelcast \u8fd9\u4e2a\u4e1c\u897f\u7528\u4f5c\u5206\u5e03\u5f0f\u7f13\u5b58, \u7f51\u4e0a\u641c\u7d22\u4e86\u4e0b\u53d1\u73b0\u8fd9\u7bc7\u6587\u7ae0\u5bf9\u6211\u7406\u89e3 Hazelcast \u90a3\u79cd\u65e0\u4e3b\u4ece\u4e4b\u5206, \u907f\u514d\u4e86\u5355\u70b9\u6545\u969c\u5f88\u6709\u5e2e\u52a9, Hazelcast \u7684\u6570\u636e\u5206\u5e03\u65b9\u5f0f\u5f88\u6709\u70b9\u50cf\u78c1\u76d8\u9635\u5217 RAID 1, RAID0+1 \u7684\u5f71\u5b50. \u57fa\u672c\u4e0a\u5728\u4e00\u4e2a\u8282\u70b9\u51fa\u73b0\u6545\u969c\u7684\u60c5\u51b5\u4e0b\u662f\u4e0d\u4f1a\u5f71\u54cd\u6570\u636e\u8bbf\u95ee\u7684.<br\/><br\/>\n\u4e0b\u9762\u8fd9\u4e2a\u7cfb\u5217\u8bb2\u7684\u5f88\u8be6\u7ec6:<br\/>\n<ol>\n<li><strong><a href=\"https:\/\/my.oschina.net\/chkui\/blog\/729698\">Hazelcast\u96c6\u7fa4\u670d\u52a1(1)\u2014\u2014Hazelcast\u4ecb\u7ecd<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/my.oschina.net\/chkui\/blog\/732408\">Hazelcast\u96c6\u7fa4\u670d\u52a1(2)\u2014\u2014Hazelcast\u57fa\u672c\u914d\u7f6e<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/my.oschina.net\/chkui\/blog\/736892\">Hazelcast\u96c6\u7fa4\u670d\u52a1(3)\u2014\u2014\u96c6\u7fa4\u529f\u80fd\u8be6\u89e3<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/my.oschina.net\/chkui\/blog\/746496\">Hazelcast\u96c6\u7fa4\u670d\u52a1(4)\u2014\u2014\u5206\u5e03\u5f0fMap<\/a><\/strong><\/li>\n<\/ol>\n<hr \/><br\/>\nHazelcast \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u53ef\u5d4c\u5165\u5f0f\u6570\u636e\u7f51\u683c\uff08\u793e\u533a\u7248\u514d\u8d39\uff0c\u4f01\u4e1a\u7248\u6536\u8d39\uff09\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u770b\u505a\u662f\u5185\u5b58\u6570\u636e\u5e93\uff0c\u4e0d\u8fc7\u5b83\u4e0e Redis \u7b49\u5185\u5b58\u6570\u636e\u5e93\u53c8\u6709\u4e9b\u4e0d\u540c\u3002\u9879\u76ee\u5730\u5740\uff1a<a title=\"http:\/\/hazelcast.org\/\" href=\"http:\/\/hazelcast.org\/\">http:\/\/hazelcast.org\/<\/a><br\/><br\/>\nHazelcast \u4f7f\u5f97 Java \u7a0b\u5e8f\u5458\u66f4\u5bb9\u6613\u5f00\u53d1\u5206\u5e03\u5f0f\u8ba1\u7b97\u7cfb\u7edf\uff0c\u63d0\u4f9b\u4e86\u5f88\u591a Java \u63a5\u53e3\u7684\u5206\u5e03\u5f0f\u5b9e\u73b0\uff0c\u5982\uff1aMap, Queue, Topic, ExecutorService, Lock, \u4ee5\u53ca JCache \u7b49\u3002\u5b83\u4ee5\u4e00\u4e2a JAR \u5305\u7684\u5f62\u5f0f\u63d0\u4f9b\u670d\u52a1\uff0c\u53ea\u4f9d\u8d56\u4e8e Java\uff0c\u5e76\u4e14\u63d0\u4f9b Java, C\/C++, .NET \u4ee5\u53ca REST \u5ba2\u6237\u7aef\uff0c\u56e0\u6b64\u5341\u5206\u5bb9\u6613\u4f7f\u7528\u3002<br\/><br\/>\n<h2>\u5982\u4f55\u5b58\u50a8\u6570\u636e<\/h2>\nHazelcast \u670d\u52a1\u4e4b\u95f4\u662f\u7aef\u5bf9\u7aef\u7684\uff0c\u6ca1\u6709\u4e3b\u4ece\u4e4b\u5206\uff0c\u56e0\u6b64\u4e5f\u4e0d\u5b58\u5728\u5355\u70b9\u6545\u969c\u3002\u96c6\u7fa4\u4e2d\u6240\u6709\u7684\u8282\u70b9\u90fd\u5b58\u50a8\u7b49\u91cf\u7684\u6570\u636e\u4ee5\u53ca\u8fdb\u884c\u7b49\u91cf\u7684\u8ba1\u7b97\u3002<br\/><br\/>\nHazelcast \u7f3a\u7701\u60c5\u51b5\u4e0b\u628a\u6570\u636e\u5206\u4e3a 271 \u4e2a\u533a\u3002\u8fd9\u4e2a\u503c\u53ef\u914d\u7f6e\u4e8e\u7cfb\u7edf\u5c5e\u6027<em> <code>hazelcast.partition.count\u3002<\/code><\/em> \u5bf9\u4e8e\u4e00\u4e2a\u7ed9\u5b9a\u7684\u952e\uff0c\u5728\u7ecf\u8fc7\u5e8f\u5217\u53f7\u3001\u54c8\u5e0c\u5e76\u5bf9\u5206\u533a\u603b\u6570\u53d6\u6a21\u4e4b\u540e\u80fd\u5f97\u5230\u6b64\u952e\u5bf9\u5e94\u7684\u5206\u533a\u53f7\u3002\u6240\u6709\u7684\u5206\u533a\u7b49\u91cf\u7684\u5206\u5e03\u4e0e\u96c6\u7fa4\u4e2d\u6240\u6709\u7684\u8282\u70b9\u4e2d\uff0c\u6bcf\u4e2a\u5206\u533a\u5bf9\u5e94\u7684\u5907\u4efd\u4e5f\u540c\u6837\u5206\u5e03\u5728\u96c6\u7fa4\u4e2d\u3002"},{"title":"\u4f7f\u7528 Java8 Optional \u7684\u6b63\u786e\u59ff\u52bf","link":"https:\/\/yanbin.blog\/proper-ways-of-using-java8-optional\/","pubDate":"Mon, 05 Sep 2016 01:52:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/proper-ways-of-using-java8-optional\/","description":"\n\u6211\u4eec\u77e5\u9053 Java 8 \u589e\u52a0\u4e86\u4e00\u4e9b\u5f88\u6709\u7528\u7684 API, \u5176\u4e2d\u4e00\u4e2a\u5c31\u662f Optional. \u5982\u679c\u5bf9\u5b83\u4e0d\u7a0d\u5047\u63a2\u7d22, \u53ea\u662f\u8f7b\u63cf\u6de1\u5199\u7684\u8ba4\u4e3a\u5b83\u53ef\u4ee5\u4f18\u96c5\u7684\u89e3\u51b3 NullPointException \u7684\u95ee\u9898, \u4e8e\u662f\u4ee3\u7801\u5c31\u5f00\u59cb\u8fd9\u4e48\u5199\u4e86<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">User<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">......<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"p\">())<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">getOrders<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">Collections<\/span><span class=\"p\">.<\/span><span class=\"na\">emptyList<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u90a3\u4e48\u4e0d\u5f97\u4e0d\u8bf4\u6211\u4eec\u7684\u601d\u7ef4\u4ecd\u7136\u662f\u5728\u539f\u5730\u8e0f\u6b65, \u53ea\u662f\u672c\u80fd\u7684\u8ba4\u4e3a\u5b83\u4e0d\u8fc7\u662f User \u5b9e\u4f8b\u7684\u5305\u88c5, \u8fd9\u4e0e\u6211\u4eec\u4e4b\u524d\u5199\u6210<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">User<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">.....<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">!=<\/span><span class=\"w\"> <\/span><span class=\"kc\">null<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">getOrders<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">Collections<\/span><span class=\"p\">.<\/span><span class=\"na\">emptyList<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u5b9e\u8d28\u4e0a\u662f\u6ca1\u6709\u4efb\u4f55\u5206\u522b. \u8fd9\u5c31\u662f\u6211\u4eec\u5c06\u8981\u8bb2\u5230\u7684\u4f7f\u7528\u597d Java 8 Optional \u7c7b\u578b\u7684\u6b63\u786e\u59ff\u52bf.<br\/><br\/>\n\u5728\u91cc\u7ea6\u5965\u8fd0\u4e4b\u65f6, \u65b0\u95fb\u4e00\u518d\u63d0\u8d77\u4e94\u661f\u7ea2\u65d7\u6709\u95ee\u9898, \u53ef\u662f\u6211\u600e\u4e48\u770b\u90fd\u770b\u4e0d\u51fa\u6765\u6709\u4ec0\u4e48\u95ee\u9898, \u540e\u6765\u624d\u9053\u662f\u5c0f\u661f\u661f\u819c\u62dc\u4e2d\u592e\u7684\u59ff\u52bf\u4e0d\u5bf9. \u56e0\u6b64\u6211\u4eec\u5343\u4e07\u4e5f\u522b\u5bf9\u81ea\u5df1\u4e60\u4ee5\u4e3a\u5e38\u7684\u4e8b\u60c5\u89c9\u5f97\u7406\u6240\u5f53\u7136, \u4e1d\u6beb\u4e0d\u4f1a\u89c9\u5f97\u6709\u4f55\u4e0d\u59a5, \u6362\u53e5\u8bdd\u8bf4\u4e5f\u5c31\u662f\u5f53\u6211\u4eec\u5207\u6362\u5230 Java 8 \u7684 Optional \u65f6, \u4e0d\u80fd\u7ee7\u627f\u6027\u7684\u5bf9\u5f85\u8fc7\u5f80 null \u65f6\u7684\u90a3\u79cd\u601d\u7ef4, \u5e94\u8be5\u638c\u63e1\u597d\u65b0\u7684, \u6b63\u786e\u7684\u4f7f\u7528 Java 8 Optional \u7684\u6b63\u786e\u59ff\u52bf."},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u516d: \u65e0\u5b57\u7b26\u4e32\u63d2\u503c","link":"https:\/\/yanbin.blog\/java-language-defect-no-string-interpolation\/","pubDate":"Tue, 12 Jul 2016 02:07:43 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-no-string-interpolation\/","description":"\nJava \u5728\u5b9a\u4e49\u5b57\u7b26\u4e32\u7684\u65f6\u5019\u4e0d\u652f\u6301\u5b57\u7b26\u4e32\u63d2\u503c, \u5373\u4e0d\u80fd\u5728\u5b57\u7b26\u4e32\u4e2d\u6355\u83b7\u4f5c\u7528\u57df\u4e2d\u7684\u53d8\u91cf, \u7528\u6765\u7ec4\u6210\u5f53\u524d\u5b57\u7b26\u4e32. \u800c\u8fd9\u53ef\u4ee5\u8bf4\u662f\u5176\u4ed6\u5404\u79cd\u8a00\u90fd\u5177\u5907\u7684\u57fa\u672c\u7279\u6027. \u4f8b\u5982 Bash \u4e2d\u53ef\u4ee5\u8fd9\u6837\n<br\/>\n<blockquote>\nbash-3.2$ name=Yanbin<br \/>\nbash-3.2$ echo \"Hello $name\"<br \/>\nHello Yanbin\n<\/blockquote>\nJava \u4e2d\u4e0d\u652f\u6301\u7c7b\u4f3c\u7684\u65b9\u5f0f<br\/>\n<blockquote>\nString name = \"Yanbin\";<br \/>\nString greeting = \"Hello $name\"; \u00a0\/\/Java \u4e2d\u65e0\u6cd5\u628a $name \u66ff\u6362\u4e3a name \u53d8\u91cf\u503c \"Yanbin\"\n<\/blockquote>\n\u800c\u4f7f\u7528 Java \u5fc5\u987b\u7528 String \u7684\u9759\u6001\u65b9\u6cd5 format (\u6ce8\u610f\u662f\u9759\u6001\u65b9\u6cd5\u54e6) \u6765\u95f4\u63a5\u7684\u683c\u5f0f\u5316\u51fa\u4e00\u4e2a\u5b57\u7b26\u4e32, \u53ef\u4ee5\u8fd9\u4e48\u5199<br\/>\n<blockquote>\nString.format(\"Hello %s\", \"World\");<br \/>\nString.format(\"%1$s %1$s %s %s %2$s\", \"aa\", 10); \u00a0 \u00a0\/\/aa aa aa 10 10\n<\/blockquote>\n\u6211\u4eec\u770b\u5230\u5728\u7528 format \u683c\u5f0f\u5316\u65f6\u5339\u914d\u53c2\u6570\u4f1a\u662f\u4e00\u4e2a\u4e0d\u5c0f\u7684\u95ee\u9898, \u76f8\u540c\u4f7f\u7528\u6cd5\u7684\u6253\u5370\u8f93\u51fa\u65b9\u6cd5\u662f <code>System.out.printf()<\/code>. \u522b\u8bf4\u5b57\u7b26\u4e32\u63d2\u503c\u4e86, \u5982\u679c format \u65b9\u6cd5\u662f String \u7684\u4e00\u4e2a\u5b9e\u4f8b\u65b9\u6cd5\u5e94\u7528\u8d77\u6765\u90fd\u4f1a\u4fbf\u5229\u4e9b, \u5982 <code>\"Hello %s\".format(\"World\")<\/code>\u00a0\u4f1a\u5bb9\u6613\u8bfb\u4e9b, Scala \u7684\u5b57\u7b26\u4e32\u5b9e\u4f8b\u5c31\u6709 <code>format<\/code>\u00a0\u65b9\u6cd5\u4e86."},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u4e94: \u591a\u8fd4\u56de\u503c\u95ee\u9898","link":"https:\/\/yanbin.blog\/java-language-defect-no-multiple-returns\/","pubDate":"Sun, 10 Jul 2016 02:10:26 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-no-multiple-returns\/","description":"\n\u5e0c\u671b Java \u80fd\u652f\u6301\u52a8\u6001\u5bf9\u8c61(\u533f\u540d\u5bf9\u8c61) \u7684\u7279\u6027\u662f\u6e90\u4e8e\u60f3\u8981 Java \u65b9\u6cd5\u80fd\u4f18\u96c5\u7684\u8fd4\u56de\u591a\u4e2a\u503c. \u76ee\u524d\u5982\u679c\u5e0c\u671b Java \u65b9\u6cd5\u8fd4\u56de\u591a\u4e2a\u503c\u7684\u505a\u6cd5\u6709\u8fd4\u56de\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5bf9\u8c61, \u6570\u7ec4\u6216\u5217\u8868, \u6216 Map. \u8fd9\u79cd\u9700\u6c42\u591a\u53d1\u751f\u5728\u79c1\u6709\u65b9\u6cd5\u4e0a, \u4f46\u76ee\u524d\u7684\u89e3\u51b3\u529e\u6cd5\u6709\u5982\u4e0b\u5f0a\u7aef:<\/p>\n<br\/>\n<ol>\n<li>\u5982\u679c\u7528\u81ea\u5b9a\u4e49\u7c7b\u6765\u4f5c\u4e3a\u8fd4\u56de\u7c7b\u578b\u7684\u8bdd, \u4f1a\u4f7f\u5f97\u7c7b\u8fc7\u4e8e\u6742\u4e71, \u800c\u4e14\u8fd9\u4e9b\u81ea\u5b9a\u4e49\u7c7b\u7684\u590d\u7528\u6027\u4e0d\u9ad8<\/li>\n<li>\u6570\u7ec4\u6216\u5217\u8868\u6709\u592a\u5f3a\u7684\u987a\u5e8f\u4f9d\u8d56, \u6ca1\u6709\u5c5e\u6027\u540d\u544a\u77e5\u6bcf\u4e2a\u4f4d\u7f6e\u4e0a\u503c\u7684\u610f\u4e49, \u800c\u4e14\u7c7b\u578b\u90fd\u5fc5\u987b\u4e3a Object<\/li>\n<li>\u8fd4\u56de Map \u7684, \u5728\u7ef4\u62a4 Key \u4e0a\u5bb9\u6613\u51fa\u9519(\u6216\u987b\u4e3a Key \u5b9a\u4e49\u5f88\u591a\u5b57\u7b26\u4e32\u5e38\u91cf), \u4e14\u7c7b\u578b\u4e5f\u662f\u4e3a Object.<\/li>\n<\/ol>\n<br\/>\n\u8bf4\u4e86\u4e0a\u9762\u8bb8\u591a, \u5404\u4f4d\u53ef\u80fd\u8fd8\u4e0d\u5b9a\u6e05\u695a\u6211\u60f3\u8981\u7684\u662f\u4ec0\u4e48, \u5176\u5b9e\u5c31\u662f\u7c7b\u4f3c\u4e8e C# \u7684\u533f\u540d\u5bf9\u8c61(\u6216\u66f0\u52a8\u6001\u5bf9\u8c61), \u770b\u4e00\u6bb5 C# \u00a0\u7684\u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a\u533f\u540d\u5bf9\u8c61\u7684\u4f8b\u5b50(.NET3.5 \u5f00\u59cb\u5f15\u5165\u533f\u540d\u5bf9\u8c61, .NET 4.0 \u540e\u533f\u540d\u5bf9\u8c61\u53ef\u4ee5\u4f5c\u4e3a\u51fd\u6570\u503c)"},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u56db: \u8fc7\u65f6\u7684 JavaBean","link":"https:\/\/yanbin.blog\/java-language-defect-4-outdated-javabean\/","pubDate":"Sat, 09 Jul 2016 03:35:14 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-4-outdated-javabean\/","description":"\n\u66fe\u51e0\u4f55\u65f6\u5728\u4e1a\u52a1\u5206\u5c42\u7ed3\u6784\u4e2d\u7684 VO \u6216 DTO \u5c42\u5145\u65a5\u7740\u65e0\u6570\u7684\u6807\u51c6 JavaBean \u7c7b, \u90a3\u4e9b\u788d\u624b\u811a\u7684 getter\/setter \u65b9\u6cd5\u7b80\u503c\u4e0d\u5fcd\u76f4\u89c6. \u6216\u8bb8 JavaBean \u8bbe\u5b9a\u89c4\u8303\u7684\u7528\u610f\u662f\u5f53\u67d0\u4e9b\u5c5e\u6027\u4e3a\u53ea\u8bfb\u65f6\u4e0d\u63d0\u4f9b setter \u65b9\u6cd5, \u800c\u5b9e\u9645\u4f7f\u7528\u65f6, \u56e0 getter\/setter \u90fd\u540c\u65f6\u5177\u5907, \u90a3\u4e48 JavaBean \u7684\u6240\u6709\u79c1\u6709\u5c5e\u6027\u53c8\u4f55\u5f02\u4e8e\u516c\u6709\u5c5e\u6027\u5462.\u00a0<\/p>\n<br\/>\n\u66f4\u522b\u8bf4\u5bf9\u4e8e\u67d0\u4e9b\u5f62\u5f0f\u7684\u5c5e\u6027\u540d, \u82e5\u5c5e\u6027\u540d\u4e3a <code>xCoordinate<\/code>\u00a0\u00a0\u65f6, \u5b83\u6240\u5bf9\u5e94\u7684 getter \u65b9\u6cd5\u5206\u522b\u662f <code>getxCoordinate()<\/code>,\u4e00\u822c\u7684 IDE \u90fd\u4f1a\u4e3a\u5b83\u81ea\u52a8\u751f\u6210 <code>getXCoordinate()<\/code>\u00a0\u65b9\u6cd5, \u8fd9\u662f\u9519\u8bef\u7684. \u00a0\u5b9e\u9645\u4e0a <code>getXCoordinate()<\/code>\u00a0\u5bf9\u5e94\u7684\u5c5e\u6027\u540d\u662f <code>XCoordinate<\/code>.\u00a0<br\/><br\/>\n\u6240\u4ee5 Play Framework 1 \u4ee5\u53ca Play Framework 2.4.6 \u4e4b\u524d\u7684\u7248\u672c\u91c7\u7528\u4e86\u5b57\u8282\u7801\u589e\u5f3a\u7684\u6280\u672f, \u5b9e\u73b0\u4e86\u50cf Objective-C \u7684 @property \u7684\u7279\u6027, \u5373\u53ea\u8981\u58f0\u660e\u516c\u6709\u5c5e\u6027, \u7f16\u8bd1\u5668\u4e3a\u8be5\u5c5e\u6027\u751f\u6210\u9ed8\u8ba4\u7684 getter\/setter \u65b9\u6cd5, \u60a8\u4e5f\u53ef\u4ee5\u624b\u5de5\u53bb\u8986\u76d6\u4e2a\u522b\u9ed8\u8ba4\u7684 getter\/setter \u65b9\u6cd5.<br\/><br\/>\n\u56e0\u6b64\u5728 Play Framework \u4e2d\u4e66\u5199\u7684\u7684 \u00a0model \u7c7b\u5c31\u53ea\u9700\u8981\u5c5e\u6027\u4e86, \u50cf<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">id<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">name<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">email<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">address<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5c31\u8fd9\u4e48\u7b80\u5355, \u60f3\u50cf\u4e00\u4e0b\u5982\u679c\u6211\u4eec\u4e3a\u4e00\u4e2a\u4f17\u591a\u5c5e\u6027\u7684 model \u7c7b\u8865\u5168\u6240\u6709\u7684 getter\/setter \u65b9\u6cd5\u8bfb\u8d77\u6765\u6709\u591a\u6050\u6016."},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u4e09: \u4e0d\u652f\u6301 var \u7c7b\u578b\u63a8\u65ad","link":"https:\/\/yanbin.blog\/java-language-defect-3-not-support-var-type-infer\/","pubDate":"Sat, 09 Jul 2016 02:26:36 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-3-not-support-var-type-infer\/","description":"\n<p>\u867d\u8bf4 Java \u7684\u652f\u6301\u6cdb\u578b\u4ee5\u53ca\u8fd1\u671f Lambda \u00a0\u8868\u8fbe\u5f0f\u7684\u52a0\u5165, \u5728\u5bf9\u7c7b\u578b\u8fdb\u884c\u63a8\u65ad\u4e0a\u5df2\u7ecf\u5f88\u5f3a\u5927\u4e86, \u4f46\u5728\u7c7b\u578b\u58f0\u660e\u7684\u65f6\u5019\u4ecd\u7136\u7565\u663e\u5197\u4f59,\n\u6700\u4e3b\u8981\u7684\u4e00\u70b9\u662f Java \u4e0d\u80fd\u50cf Scala \u90a3\u6837\u5728\u58f0\u660e\u53d8\u91cf\u6709\u8d4b\u503c\u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u7c7b\u578b\u63a8\u65ad. \u6211\u4eec\u5148\u6765\u770b\u4e0b Java \u00a0\u5df2\u7ecf\u4e3a\u6211\u4eec\u6240\u8fdb\u884c\u7684\u6539\u8fdb:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">strings<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u521a\u5f15\u5165\u6cdb\u578b\u65f6\u6211\u4eec\u662f\u8fd9\u6837<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">strings<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u540e\u6765\u53d8\u6210\u8fd9\u6837\u4e86, \u53ef\u4ee5\u94bb\u77f3\u7b26\u53f7\u63a8\u65ad, Java 7<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">addAll<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">());<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u6839\u636e list.addAll() \u4e0a\u4e0b\u6587\u63a8\u65ad\u8981\u521b\u5efa\u7684\u7c7b\u578b\u662f new ArrayList&lt;String&gt;(), Java 8<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"kd\">interface<\/span> <span class=\"nc\">Foo<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">dodo<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"n\">Foo<\/span><span class=\"w\"> <\/span><span class=\"n\">foo<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Foo:dodo()&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/Java 8 Lambda \u53ef\u4ee5\u6839\u636e Lambda \u8868\u8fbe\u5f0f\u7684\u7b7e\u540d\u63a8\u65ad\u51fa\u63a5\u53e3\u7c7b\u578b<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"n\">foo<\/span><span class=\"p\">.<\/span><span class=\"na\">dodo<\/span><span class=\"p\">();<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p>\u5728 Java 7 \u7684\u6cdb\u578b\u65b9\u6cd5\u5176\u5b9e\u4e5f\u662f\u53ef\u4ee5\u901a\u8fc7\u58f0\u660e\u7c7b\u578b\u4e0e\u65b9\u6cd5\u53c2\u6570\u6765\u63a8\u65ad\u8981\u8fd4\u56de\u7684\u5177\u4f53\u7c7b\u578b\u7684."},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u4e8c: equals() \u6bd4\u8f83\u5b57\u7b26\u4e32","link":"https:\/\/yanbin.blog\/java-language-defect-2-equals-compare-strings\/","pubDate":"Sat, 09 Jul 2016 00:50:45 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-2-equals-compare-strings\/","description":"\n\u5bf9\u4e8e\u9762\u5411\u5bf9\u8c61\u7684\u8bed\u8a00\u4e0d\u77e5\u9053\u9664\u4e86 Java \u8fd8\u6709\u6ca1\u522b\u7684\u8bed\u8a00\u4f1a\u62ff\u600e\u4e48\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u76f8\u7b49\u9891\u9891\u4f5c\u4e3a\u9762\u8bd5\u9898\u6765\u8003. \u539f\u672c\u662f\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u4e24\u4e2a\u5b57\u7b26\u4e32\u5185\u5bb9\u662f\u5426\u76f8\u7b49\u65f6\u7528 <code>==<\/code>\u00a0\u6bd4\u8f83\u65f6\u5374\u53ef\u80fd\u662f\u4e0d\u5bf9\u7684. \u5728 Java \u4e2d\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"s\">&#34;ab&#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">==<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;ab&#34;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/true<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"s\">&#34;ab&#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">==<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;new String(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;) \/\/false\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"s\">&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34; == String.value(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;) \/\/true\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"s\">new String(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;).equals(new String(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;)) \/\/true\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"s\">new String(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;).intern() == new String(&#34;<\/span><span class=\"n\">ab<\/span><span class=\"s\">&#34;).intern() \/\/true<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5728 Java \u4e2d\u660e\u660e\u770b\u5230\u4e24\u4e2a\u5b57\u7b26\u4e32\u5185\u5bb9\u4e00\u6837\u7528 <code>==<\/code>\u00a0\u8fdb\u884c\u6bd4\u8f83\u591a\u6570\u65f6\u5019\u4e0d\u662f\u4f60\u60f3\u8981\u7684\u7ed3\u679c, \u53ea\u6709\u7528 <code>equals()<\/code>\u00a0\u65b9\u6cd5\u624d\u662f\u738b\u9053. \u00a0\u4f7f\u7528 Java \u7684\u5b57\u7b26\u4e32\u5fc5\u987b\u4e86\u89e3\u5b83\u5185\u90e8\u662f\u600e\u4e48\u5b58\u50a8\u7684. \u6bd4\u4e8e\u4e0a\u9762\u7684\u7ed3\u679c\u6211\u4e0d\u4f5c\u7ec6\u8bf4, \u4e3b\u8981\u6d89\u53ca\u5230\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u53ca\u5185\u90e8\u72b6\u6001, <code>==<\/code>\u00a0\u6bd4\u8f83\u5f15\u7528, <code>equals()<\/code>\u00a0\u6bd4\u8f83\u5185\u5bb9.<br\/><br\/>\nJava \u8fd8\u5e38\u5e38\u5bf9 <code>equals<\/code>\u00a0\u6bd4\u8f83\u5b57\u7b26\u4e32\u6d25\u6d25\u4e50\u9053, \u800c\u6211\u4ecd\u7136\u8ba4\u4e3a\u5b83\u662f\u8bed\u8a00\u8bbe\u8ba1\u4e0a\u7684\u4e00\u4e2a\u7f3a\u9677, \u6240\u4ee5 JVM \u4e0a\u7684\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u5982 Groovy, Scala \u7eb7\u7eb7\u5012\u52fe, \u65e0\u4e00\u4e0d\u662f\u7528<code>==<\/code>\u00a0\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\u7684\u5185\u5bb9, \u5b83\u4eec\u4e5f\u63d0\u4f9b\u5b57\u7b26\u4e32\u5f15\u7528\u7684\u6bd4\u8f83, \u4f46\u591a\u5c11\u4eba\u5b9e\u9645\u5173\u5fc3\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5f15\u7528\u662f\u5426\u76f8\u540c\u5462, \u53cd\u6b63\u5b57\u7b26\u4e32\u8bbe\u8ba1\u7684\u662f Immutable \u7684.<br\/><br\/>\n\u82e5\u8bf4\u662f\u56e0\u4e3a Java \u4e0d\u652f\u6301\u64cd\u4f5c\u7b26\u7684\u91cd\u8f7d, \u4f46\u53ef\u4ee5\u50cf Scala, Groovy \u90a3\u6837\u5728\u7f16\u8bd1\u5668\u4e0a\u4e0b\u529f\u592b\u7684. \u6700\u7ec8\u6211\u60f3\u4f9d\u7136\u662f\u53d7\u7d2f\u4e8e 100% \u6e90\u4ee3\u7801\u4e0e\u4e8c\u8fdb\u5236\u7684\u517c\u5bb9\u6027, \u6539\u8fdb\u7684\u8bdd\u4f1a\u9020\u6210\u65e9\u5148\u4ee3\u7801\u7684\u884c\u4e3a\u9519\u4e71."},{"title":"Java \u8bed\u8a00\u7684\u51e0\u4e2a\u7f3a\u9677\u4e4b\u4e00: \u65e0 Here Document","link":"https:\/\/yanbin.blog\/java-language-defect-1-no-here-document\/","pubDate":"Fri, 08 Jul 2016 23:43:47 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-language-defect-1-no-here-document\/","description":"\nJava \u00a0\u8bed\u8a00\u7531\u4e8e\u4e00\u76f4\u8981\u4fdd\u6301\u6e90\u4ee3\u7801\u53ca\u4e8c\u8fdb\u5236\u7684\u5411\u540e\u517c\u5bb9, \u6240\u4ee5\u5c3d\u7ba1\u8bed\u6cd5\u4e0a\u6709\u4e86\u5f88\u5927\u7684\u6f14\u8fdb, \u4f46\u6709\u4e9b\u4e1c\u897f\u4ecd\u7136\u65e0\u6cd5\u89e6\u53ca. \u00a0\u4e0d\u50cf\u6709\u4e9b\u65b0\u751f\u4ee3\u7684\u8bed\u8a00\u8bbe\u8ba1\u65f6\u53ef\u4ee5\u535a\u91c7\u4f17\u957f, \u6216\u8005\u50cf Scala \u90a3\u79cd\u8bed\u8a00\u5411\u540e\u517c\u5bb9\u6027\u7684\u8981\u6c42\u6ca1\u8fd9\u4e48\u82db\u523b, Scala \u53ea\u8981\u4fdd\u6301\u4e3b, \u6b21\u7248\u672c\u76f8\u540c\u65f6\u7684\u517c\u5bb9\u6027. Java \u5219\u4e0d\u540c, 1.0 \u7684\u4ee3\u7801\u6216\u5b57\u8282\u7801\u653e\u5230 1.8 \u4e0b\u8fd8\u8981\u80fd\u8dd1.\n<br\/>\n\u5b9e\u9645\u5e94\u7528\u4e2d\u5728\u591a\u4e2a\u8bed\u8a00\u5207\u6362\u65f6, \u5f88\u81ea\u7136\u7684\u4f1a\u5bf9\u5176\u4ed6\u8bed\u8a00\u4e0e Java \u8fdb\u884c\u6a2a\u5411\u5bf9\u6bd4. \u611f\u89c9 Java \u8bed\u8a00\u6709\u51e0\u4e2a\u7f3a\u9677, \u4e0d\u5728\u6b64\u7bc7\u4e2d\u4e00\u4e00\u5217\u4e3e, \u53ea\u628a\u7b2c\u4e00\u4e2a\u4e0d\u8db3\u4e4b\u5904\u9053\u6765.<br\/><br\/>\nJava \u6ca1\u6709 Here Document \u7684\u652f\u6301, Here Document \u53c8\u79f0 heredoc, hereis, here-string, here-script, \u518d\u901a\u4fd7\u70b9\u8bb2\u5c31\u662f\u591a\u884c\u5b57\u7b26\u4e32(multiline string). \u5728 Java \u4e2d\u5982\u679c\u8981\u5b9a\u4e49\u591a\u884c\u5b57\u7b26\u4e32, \u9700\u8981\u8fde\u4e32\u7684\u52a0\u53f7\u53ca\u6362\u884c\u7b26(\\n), \u5982\u4e0b<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">content<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;This is a\\n&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;multiline\\n&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;string content&#34;<\/span><span class=\"w\"> <\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u66fe\u7ecf\u4e3a\u4e86\u5bfb\u6c42 Java \u5bf9 Here Document \u7684\u652f\u6301, \u5c1d\u8bd5\u8fc7 Java \u7684 \u00a0APT(Java Annotation Processing Tool), \u5b9a\u4e49\u6ce8\u89e3 @HereDocument \u4f7f\u7528\u6ce8\u91ca, \u7f16\u8bd1\u65f6\u5e26 <code>-processor<\/code> \u53c2\u6570, \u4f46\u662f\u6ce8\u91ca\u4e2d\u7684\u683c\u5f0f\u5f88\u5bb9\u6613\u88ab IDE \u7ed9\u81ea\u52a8\u683c\u5f0f\u5316\u6389, \u89c1 <a href=\"java-implement-here-document\/\">Java \u7684\u591a\u884c\u5b57\u7b26\u4e32 Here Document \u7684\u5b9e\u73b0<\/a>. \u6240\u4ee5\u8fd9\u79cd\u5c1d\u8bd5\u5f88\u5feb\u5c31\u653e\u5f03\u4e86, \u56e0\u4e3a\u9879\u76ee\u4e2d\u7528 Java \u548c \u00a0Scala \u6df7\u5408\u7f16\u7a0b, \u771f\u6b63\u9700\u8981 Here Document \u7684\u5730\u65b9\u76f4\u63a5\u7528 Scala \u4ee3\u7801\u5c31\u884c\u4e86."},{"title":"JMockit \u5982\u4f55 Mock \u90e8\u5206\u65b9\u6cd5\/\u5c5e\u6027","link":"https:\/\/yanbin.blog\/jmockit-partial-mock\/","pubDate":"Tue, 17 May 2016 23:32:08 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-partial-mock\/","description":"\n<p>\u73b0\u5728\u7684 JMockit \u5df2\u7ecf\u5077\u5077\u5347\u7ea7\u5230\u4e86 1.23 \u7248\u4e86\uff0c\u5728 JVM \u4e0a\u7684 Mock \u5de5\u5177\u4e2d\u5c31\u6570\u5b83\u6700\u65e0\u654c\u4e86\uff0c\u56e0\u4e3a\u5b83\u62a2\u593a\u4e86\u6700\u4f73\u63a7\u5236\u70b9 \u00a0--javaagent\uff0c\n\u53ef\u4ee5\u8bf4\u5b83\u662f\u65e0\u6240\u4e0d\u80fd\u7684\u3002\u4e00\u822c\u6211\u4eec\u4f7f\u7528 JMockit \u662f\u901a\u8fc7\u4e24\u79cd\u65b9\u5f0f\uff0c<code>new MockUp<\/code> \u548c <code>new Expectations<\/code>.\nJMock \u4e0d\u4ec5\u80fd\u591f Mock \u7c7b\u7684\u6240\u6709\u65b9\u6cd5\uff0c\u8fd8\u80fd\u90e8\u5206 Mock -- \u8fd9\u4e2a\u662f <code>new Expectations<\/code>\u00a0\u7684\u9ed8\u8ba4\u884c\u4e3a\u3002\n\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u6765\u770b\u4e0b\u5728\u4f7f\u7528 <code>new Expectations<\/code>\u00a0\u7684\u60c5\u51b5\u4e0b\u5982\u4f55\u5bf9\u7c7b\u7684\u90e8\u4efd\u9759\u6001\u65b9\u6cd5\u6216\u90e8\u5206\u5b9e\u4f8b\u65b9\u6cd5\u8fdb\u884c Mock\u3002<\/p>\n<p>\u5927\u81f4\u8868\u8ff0\u4e00\u4e0b\uff0c\u5171\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5<\/p>\n<ol>\n<li>\u9488\u5bf9\u7c7b\u8fdb\u884c Mock, \u53ea\u6709\u5f55\u5236\u7684\u9759\u6001\u65b9\u6cd5\u88ab Mock \u4f4f\uff0c\u5176\u4ed6\u7684\u9759\u6001\u65b9\u6cd5\u6216\u5b9e\u4f8b\u65b9\u6cd5\u90fd\u4f1a\u8c03\u7528\u5b9e\u9645\u5b9e\u73b0<\/li>\n<li>\u9488\u5bf9\u67d0\u4e00\u5b9e\u4f8b\u8fdb\u884c Mock\uff0c\u53ea\u5728\u8c03\u7528\u8be5\u5b9e\u4f8b\u5df2\u5f55\u5236\u7684\u65b9\u6cd5\u624d\u88ab Mock \u4f4f\uff0c\u9759\u6001\u65b9\u6cd5\u6216\u65b0\u5efa\u5b9e\u4f8b\u8c03\u7528\u4efb\u4f55\u65b9\u6cd5\u90fd\u662f\u5b9e\u9645\u5b9e\u73b0<\/li>\n<li>\u9488\u5bf9\u7c7b\u8fdb\u884c Mock\uff0c\u4f46\u5f55\u5236\u7684\u662f\u4e00\u4e2a\u5b9e\u4f8b\u65b9\u6cd5\uff0c\u90a3\u4e48\u8be5\u5b9e\u4f8b\u6216\u4efb\u4f55\u65b0\u5efa\u5b9e\u4f8b\u5728\u8c03\u7528\u8be5\u5f55\u5236\u65b9\u6cd5\u65f6\u90fd\u4f1a\u88ab Mock \u4f4f<\/li>\n<\/ol>\n<p>\u4e0d\u77e5\u9053\u4e0a\u9762\u5728\u8bf4\u4ec0\u4e48\uff0c\u672c\u6765\u5c31\u662f\u7a7a\u6d1e\u65e0\u51ed\uff0c\u6240\u4ee5\u8fd8\u662f\u4e0b\u5b9e\u4f8b\uff0c\u5047\u5b9a\u8981\u6d4b\u8bd5\u4e0b\u9762\u8fd9\u4e2a\u7c7b\uff0c\u6216\u8005\u8bf4\u662f\u6d4b\u8bd5\u4f7f\u7528\u5230\u4e0b\u9762\u7c7b\u7684\u5176\u4ed6\u7c7b"},{"title":"Google Guice \u8f7b\u88c5\u4e0a\u9635","link":"https:\/\/yanbin.blog\/google-guice-hello-world\/","pubDate":"Tue, 26 Apr 2016 23:24:48 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/google-guice-hello-world\/","description":"\n<p>PlayFramework \u5df2\u5168\u9762\u5411 <a href=\"https:\/\/github.com\/google\/guice\">Google Guice<\/a> \u6f14\u8fdb, \u7531\u4e8e\u6211\u4eec\u7684\u9879\u76ee\u662f\u4ece Play 2.0 \u5f00\u59cb\u642d\u5efa,\n\u73b0\u867d\u5df2\u5347\u7ea7\u5230\u4e86 2.4.6, \u4f46\u5bf9 Guice \u7684\u8fd8\u6ca1\u62b1\u5f97\u90a3\u4e48\u7684\u7d27, \u6709\u70b9\u79ef\u91cd\u800c\u6162\u6b65\u524d\u632a. Google Guice \u4e5f\u662f\u4e00\u4e2a\u4f9d\u8d56\u6ce8\u5165(DI) \u5bb9\u5668, \u636e\u8bf4\u5b83\u6bd4 Spring \u5feb\u4e86\u5f88\u591a\u5f88\u591a,\n\u662f\u8f7b\u91cf\u7ea7\u9879\u76ee\u6216\u6846\u67b6\u9996\u9009, Google \u51fa\u54c1\u4ff1\u662f\u7cbe\u54c1.<\/p><p>\u65e2\u7136\u5b83\u662f\u8f7b\u91cf\u7ea7\u7684 DI, \u90a3\u4e48\u5fc5\u987b\u5448\u4e0a\u4e00\u4e2a\u6700\u8f7b\u91cf\u7ea7\u7684\u5165\u95e8, \u5b98\u65b9\u7684\n<a href=\"https:\/\/github.com\/google\/guice\/wiki\/GettingStarted\">Get Started<\/a> \u6587\u6863\u5176\u5b9e\u5570\u55e6\u4e86\u70b9, \u5bf9\u4e8e BillingService \u4f9d\u8d56\u7684\nCreditCardProcess, TransactionLog, \u548c Receipt \u90fd\u672a\u6709\u4ea4\u5f85, \u7b97\u4e0d\u4e0a\u4e00\u4e2a\u5b8c\u6574\u9879\u76ee. \u6240\u4ee5\u6211\u8fd9\u91cc\u5c3d\u91cf\u7b80\u5316, \u53c8\u4e0d\u504f\u79bb\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u9879\u76ee\u6a21\u578b.\n\u90a3\u5c31\u662f\u4e0b\u9762\u90a3\u4e2a\u4f8b\u5b50, \u5b83\u5b9e\u73b0\u4e86\u5728\u4e0d\u540c\u65f6\u95f4\u53d1\u51fa\u4e0d\u540c\u7684\u95ee\u5019.<\/p><p>\u9879\u76ee\u9700\u8981\u4f9d\u8d56 Guice \u53ca\u5b83\u7684\u5b50\u4f9d\u8d56, \u8fd9\u5f97\u770b\u4f60\u662f\u7528\u4ec0\u4e48\u6765\u7ba1\u7406\u4f9d\u8d56\u7684, \u4f9d\u7167\u00a0\n<a href=\"http:\/\/mvnrepository.com\/artifact\/com.google.inject\/guice\/4.0\">http:\/\/mvnrepository.com\/artifact\/com.google.inject\/guice\/4.0<\/a>\n\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u52a0\u4e0a\u4f9d\u8d56\u914d\u7f6e, \u524d\u9762\u8fd9\u4e2a\u94fe\u63a5\u9ed8\u8ba4\u4e3a sbt \u7684, \u6211\u8fd8\u771f\u504f\u7231\u4e86 sbt, \u82e5\u662f Maven \u5c31\u914d\u7f6e Maven \u7684 pom.xml \u5427. Guice \u7684\u5f15\u5165\u5e26\u4e0a\u4ee5\u4e0b\u51e0\u4e2a\u4f9d\u8d56\u5305<\/p>\n<blockquote>\n<p>\u00a0\u00a0 +-com.google.inject:guice:4.0<br \/>\n\u00a0\u00a0\u00a0\u00a0 +-aopalliance:aopalliance:1.0<br \/>\n\u00a0\u00a0\u00a0\u00a0 +-com.google.guava:guava:16.0.1<br \/>\n\u00a0\u00a0\u00a0\u00a0 +-javax.inject:javax.inject:1<\/p>\n<\/blockquote>\n<p>Guice \u76ee\u524d\u662f 4.0."},{"title":"Java \u7684 fork-join \u6846\u67b6\u5b9e\u4f8b\u5907\u5fd8","link":"https:\/\/yanbin.blog\/java-fork-join-framework-memo\/","pubDate":"Tue, 29 Dec 2015 00:17:41 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-fork-join-framework-memo\/","description":"\nJava 7 \u9996\u6b21\u5f15\u5165\u4e86 fork\/join \u6846\u67b6\uff0c\u4f46\u4e00\u76f4\u672a\u66fe\u76f4\u63a5\u5c1d\u8bd5. \u800c\u4e14\u57fa\u672c\u4e0a\u4e5f\u5f88\u5c11\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u76f4\u63a5\u5199 fork-join \u7684\u4ee3\u7801\uff0c\u5728\u6211\u4eec\u4f7f\u7528\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u65f6\u5012\u662f\u95f4\u63a5\u4f1a\u63a5\u89e6\u5230 fork\/join \u6846\u67b6\u3002\u8b6c\u5982 Akka \u7684 fork-join-executor, sbt \u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u65f6\u4e5f\u662f\u9ed8\u8ba4 fork\/join \u5e76\u53d1\u6267\u884c\u3002fork-join \u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u628a\u8ba1\u7b97\u4efb\u52a1\u7c92\u5ea6\u7ec6\u5316\uff0c\u5e76\u66f4\u6709\u6548\u7684\u5229\u7528\u591a CPU \u5185\u6838\u3002<br\/><br\/>\nfork-join \u4e0e map-reduce \u6709\u4e9b\u76f8\u59a8\uff0c\u5728 Java 7 \u65f6\u4ee3\u6211\u5176\u5b9e\u662f\u5ffd\u89c6\u4e86\u5b83\u7684\u5b58\u5728\u3002\u76ee\u4eca\u6b63\u5728\u4e86\u89e3 Java 8 \u7684\u00a0 parallelStream \u65f6\uff0c\u56e0\u4e3a\u5b83\u7684\u5e95\u5c42\u5b9e\u73b0\u4e5f\u662f fork\/join, \u6240\u4ee5\u6709\u5174\u81f4\u53bb\u7a0d\u52a0\u4f53\u9a8c\u4e00\u4e0b\u3002fork\/join \u7684\u7b97\u6cd5\u7b80\u5355\u6765\u8bb2\u5c31\u662f\u9012\u5f52\u5bf9\u534a\u53bb\u7ec6\u5316\u8ba1\u7b97\u4efb\u52a1\uff0c\u53ca\u5230\u4e0d\u80fd\u7ec6\u5316\u65f6\u7531\u591a\u5185\u6838(\u7ebf\u7a0b)\u53bb\u8ba1\u7b97\u88ab\u62c6\u5206\u7684\u4efb\u52a1\uff0c\u6700\u540e\u53cd\u65b9\u5411\u628a\u7ed3\u679c\u6c47\u603b\u3002<br\/><br\/>\n\u4e0b\u9762\u662f\u4ece \u300aJava 8 IN ACTION\u300b\u4e2d\u622a\u7684\u4e00\u4e2a\u8bf4\u660e fork\/join \u7684\u5904\u7406\u8fc7\u7a0b"},{"title":"Java 8 \u7684 groupingBy \u4ea7\u751f\u7a7a\u7684 Map \u5206\u7ec4","link":"https:\/\/yanbin.blog\/java-8-groupingby-empty-map-group\/","pubDate":"Fri, 25 Dec 2015 22:25:49 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-groupingby-empty-map-group\/","description":"\n\u524d\u9762\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-8-groupingby-howto-generate-empty-map\/\" target=\"_blank\" rel=\"noopener\">Java 8 \u7684 groupingBy \u80fd\u5426\u4ea7\u751f\u7a7a\u7684 Map \u5206\u7ec4<\/a> \u662f\u63d0\u51fa\u6765\u7684\u601d\u8003\uff0c\u672c\u7bc7\u5c31\u662f\u4e0a\u4e00\u7bc7\u7684\u7b54\u6848\u3002<\/p>\n<br\/>\n\u7531\u4e8e\u5728 Java 8 \u4e2d\u7528 Collectors.groupingBy \u5bf9 List \u8fdb\u884c\u5206\u7ec4\u65f6\u6bcf\u4e2a\u7ec4\u91cc\u90fd\u5fc5\u987b\u5b58\u5728\u5143\u7d20\uff0c\u4e5f\u5c31\u662f<br\/>\n<blockquote>\nStream&lt;Person&gt; stream = Stream.of(new Person(\"Tom\", \"male\"), new Person(\"Jerry\", \"male\"));<br \/>\nSystem.out.println(stream.collect(Collectors.groupingBy(person -&gt; person.gender)));\n<\/blockquote>\n\u53ea\u80fd\u5f97\u5230\u7ed3\u679c<br\/>\n<blockquote>\n{male=[Tom, Jerry]}\n<\/blockquote>\n\u800c\u65e0\u6cd5\u8868\u793a\u5b58\u5728\u5176\u4ed6 gender \u7684\u53ef\u80fd\u6027\uff0c\u5e76\u4e14 female=[] \u7684\u60c5\u51b5\uff0c\u5373\u60f3\u8981\u7ed3\u679c<br\/>\n<blockquote>\n{male=[Tom, Jerry], female=[]}\n<\/blockquote>\n\u5982\u679c\u60f3\u5f97\u5230\u4ee5\u4e0a\u7684\u7ed3\u679c\u8be5\u5f53\u5982\u4f55\u5462? stream.collect() \u63a5\u53d7\u4e00\u4e2a Collector, Collectors \u4e2d\u53ea\u662f\u5b9a\u4e49\u4e86\u8bb8\u591a\u5e38\u7528\u7684 Collector \u5b9e\u73b0\uff0c\u5982\u679c\u4e0d\u591f\u7528\u7684\u8bdd\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u81ea\u5df1\u7684 Collector. \u4e0b\u9762\u5c31\u6765\u5b9a\u4e49\u4e00\u4e2a GroupingWithKeys, \u5b83\u9700\u8981\u5b9e\u73b0 java.util.stream.Collector \u63a5\u53e3\uff0c\u6709\u4e94\u4e2a\u63a5\u53e3\u65b9\u6cd5. \u4e8b\u6210\u4e4b\u540e\u6211\u4eec\u5199"},{"title":"Java 8 \u8fd4\u56de\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u7684\u5143\u7d20","link":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","pubDate":"Thu, 17 Dec 2015 01:10:52 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","description":"\n\u5728 Java 8 \u4e4b\u524d\u5982\u679c\u6211\u4eec\u8981\u627e\u5230\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u5143\u7d20\uff0c\u8981\u4f7f\u7528\u5916\u90e8\u5faa\u73af\uff0c\u5982\u4e0b\u9762\u65b9\u6cd5 findFirstMatch() \u5982\u679c\u627e\u5230\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u7acb\u5373\u8fd4\u56de\u5b83\uff0c\u5426\u5219\u8fd4\u56de null<\/p>\n<blockquote>\n\u00a0 public Integer findFirstMatch() {<br \/>\n\u00a0\u00a0\u00a0 List&lt;Integer&gt; integers = Arrays.asList(1, 4, 2, 5, 6, 3);<br \/>\n\u00a0\u00a0\u00a0 for(int i: integers) {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(i &gt; 3) return i;<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0 return null;<br \/>\n\u00a0 }\n<\/blockquote>\n\u56e0\u4e3a\u5728 for \u5faa\u73af\u4e2d\u627e\u5230\u7b2c\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u662f 4, \u5e76\u4e14\u7acb\u5373\u8fd4\u56de\uff0c\u6240\u4ee5\u4e0d\u7ba1\u96c6\u5408 integers \u518d\u5927\uff0c\u4e5f\u4e0d\u4f1a\u904d\u5386\u6574\u4e2a\u96c6\u5408\u3002<br\/><br\/>\n\u6ce8\uff1a\u4e0d\u8981\u7ea0\u7ed3\u4e8e\u4e0a\u9762\u793a\u4f8b\u65b9\u6cd5\u7684\u5b9e\u9645\u7528\u9014\uff0c\u5b9e\u9645\u4e0a\u96c6\u4f53\u548c\u5339\u914d\u6761\u4ef6\u90fd\u8be5\u901a\u8fc7\u53c2\u6570\u4f20\u5165\u65b9\u6cd5\u7684\uff0c\u8fd9\u91cc\u53ea\u4f5c\u6f14\u793a\u5faa\u73af\u3002<br\/><br\/>\n\u90a3\u4e48\u6211\u4eec\u6765\u5230 Java 8 \u4e4b\u540e\u7528 Stream API \u8be5\u5982\u4f55\u5b9e\u73b0\uff0c\u7ffb\u904d\u4e86 Stream API, \u80fd\u8fc7\u6ee4\u5143\u7d20\u7684\u64cd\u4f5c\u4e5f\u5c31\u662f filter \u65b9\u6cd5\uff0c\u4e8e\u662f\u5c1d\u8bd5\u8fd9\u6837\u7684\u5199\u6cd5"},{"title":"Java 8 Stream \u5982\u4f55\u8fd8\u539f\u4e3a\u96c6\u5408","link":"https:\/\/yanbin.blog\/java-8-stream-to-collection\/","pubDate":"Tue, 08 Dec 2015 02:29:11 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-stream-to-collection\/","description":"\n\u7531\u4e8e Java \u5bf9\u96c6\u5408\u7684\u51fd\u6570\u5f0f\u64cd\u4f5c\u5e76\u975e\u539f\u751f\u6001\u7684\uff0c\u5fc5\u987b\u5bf9\u5f97\u5230\u7684 stream() \u8fdb\u884c\u8fc7\u6ee4\u7b49\u64cd\u4f5c\uff0c\u4e4b\u540e\u8fd8\u662f\u4e00\u4e2a stream()\uff0c\u4e00\u822c\u6211\u4eec\u6700\u540e\u8fd4\u56de\u7ed9\u8c03\u7528\u8005\u9700\u8fd8\u539f\u4e3a\u76f8\u5e94\u7684\u96c6\u5408\u3002\u8fd9\u65e0\u6cd5\u4e0e Scala \u7684 <code>for ... yield<\/code> \u64cd\u4f5c\u76f8\u6bd4\u3002\u4f8b\u5982\u4e0b\u9762\u5728\u4f7f\u7528 Stream API \u8fc7\u6ee4\u83b7\u5f97\u6240\u6709\u5927\u4e8e 3 \u7684\u6570\u5b57\u4e4b\u540e\uff0c\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u8fd8\u5e94\u8be5\u8fd8\u539f\u4e3a List&lt;Integer&gt;, \u8fd9\u4e2a\u9700\u6c42\u975e\u5e38\u81ea\u7136\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">2<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">3<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">4<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">5<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"nf\">greaterThan3<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Stream<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">streamOfInteger<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">stream<\/span><span class=\"p\">().<\/span><span class=\"na\">filter<\/span><span class=\"p\">(<\/span><span class=\"w\"> <\/span><span class=\"n\">i<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">i<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">3<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">streamOfInteger<\/span><span class=\"p\">.<\/span><span class=\"na\">ToIntegerList<\/span><span class=\"p\">......;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6211\u4eec\u8fd9\u513f\u7684\u95ee\u9898\u5c31\u662f\u5982\u4f55\u628a\u4e0a\u9762\u7684 streamOfInteger \u8f6c\u6362\u4e3a List&lt;Integer&gt;, \u6709\u4ee5\u4e0b\u51e0\u79cd\u529e\u6cd5"},{"title":"sbt \u9879\u76ee\u901a\u8fc7 sbt-aspectj-plugin \u4f7f\u7528 AspectJ","link":"https:\/\/yanbin.blog\/sbt-project-sbt-aspectj-plugin-use-aspectj\/","pubDate":"Tue, 17 Nov 2015 23:28:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/sbt-project-sbt-aspectj-plugin-use-aspectj\/","description":"\nJava \u5728\u8fd0\u7528\u9762\u5411\u65b9\u5411\u7f16\u7a0b\u65f6\uff0c\u4f9d\u7167\u00a0 <a href=\"https:\/\/eclipse.org\/aspectj\/\" target=\"_blank\" rel=\"noopener\">AspectJ<\/a> \u7684\u8bed\u6cd5\u81ea\u5df1\u4e66\u5199 *.aj \u6587\u4ef6\u53ef\u4ee5\u5f97\u5230\u5c3d\u53ef\u80fd\u5927\u7684\u63a7\u5236\u80fd\u529b\u3002\u5982\u679c\u662f\u4e00\u4e2a <a href=\"http:\/\/www.scala-sbt.org\/\" target=\"_blank\" rel=\"noopener\">sbt<\/a> \u7684\u9879\u76ee\uff0c\u6709\u4e00\u4e2a <a href=\"https:\/\/github.com\/sbt\/sbt-aspectj\" target=\"_blank\" rel=\"noopener\">sbt-aspectj-plugin<\/a> \u63d2\u4ef6\u53ef\u4ee5\u5e2e\u4e0a\u6211\u4eec\u7684\u5fd9\u3002\u90a3\u4e48\u5982\u4f55\u5e94\u7528\u8fd9\u4e2a\u63d2\u4ef6\u5462\uff1f \u8be5\u63d2\u4ef6\u9996\u9875\u9762\u544a\u8bc9\u6211\u4eec\u8981\u5728 <code>project\/plugins.sbt<\/code> \u4e2d\u52a0\u4e0a\u4e0b\u9762\u8fd9\u53e5\u8bdd<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-scala\" data-lang=\"scala\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">addSbtPlugin<\/span><span class=\"o\">(<\/span><span class=\"s\">&#34;com.typesafe.sbt&#34;<\/span> <span class=\"o\">%<\/span> <span class=\"s\">&#34;sbt-aspectj&#34;<\/span> <span class=\"o\">%<\/span> <span class=\"s\">&#34;0.10.4&#34;<\/span><span class=\"o\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u5176\u4ed6\u5c31\u662f\u53c2\u8003\u4f8b\u5b50 <a href=\"https:\/\/github.com\/sbt\/sbt-aspectj\/tree\/v0.10.4\/src\/sbt-test\">runnable sample projects<\/a>\uff0c\u7136\u800c\u8fd9\u51e0\u4e2a\u4f8b\u5b50\u5e76\u975e\u90a3\u4e48\u76f4\u767d\u3002\u6240\u4ee5\u8fd8\u662f\u81ea\u5df1\u505a\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u4f8b\u5b50\u6765\u4f53\u9a8c sbt \u9879\u76ee\u5982\u4f55\u4f7f\u7528 AspectJ."},{"title":"\u81ea\u5b9a\u4e49 Jackson \u6ce8\u89e3\u4e0e\u7981\u7528\u67d0\u4e00\u7279\u5b9a\u7684\u6ce8\u89e3","link":"https:\/\/yanbin.blog\/customize-jackson-annotation-and-disable-specific-annotation\/","pubDate":"Mon, 03 Aug 2015 15:06:09 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/customize-jackson-annotation-and-disable-specific-annotation\/","description":"\nJackson \u662f <a href=\"http:\/\/www.playframewok.com\" target=\"_blank\" rel=\"noopener\">Playfrmework<\/a> 2 \u4e2d\u9ed8\u8ba4\u7684 JSON \u5904\u7406\u6846\u67b6\uff0c\u5148\u524d\u662f\u00a0 GSON\uff0cJSON \u662f Playframework \u4e2d\u7684\u7b2c\u4e00\u7b49\u516c\u6c11\uff0c\u53ef\u89c1 Jackson \u5728 Playframewok \u4e2d\u7684\u91cd\u8981\u5730\u4f4d\u3002Jackson \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684<a href=\"https:\/\/github.com\/FasterXML\/jackson-annotations\" target=\"_blank\" rel=\"noopener\">\u6ce8\u89e3<\/a>\u53ef\u7528\uff0c\u50cf @JsonIgnore, @JsonProperty, @JsonUnwrapped, @JsonFilter \u7b49\u3002\u4eba\u7684\u9700\u6c42\u603b\u662f\u5f88\u96be\u5f97\u5230\u6ee1\u8db3\uff0c\u6240\u4ee5\u514d\u4e0d\u4e86\u8fd8\u662f\u8981\u5b9a\u4e49\u81ea\u5df1\u7684\u6ce8\u89e3\u3002\u6bd4\u5982\u6709\u8fd9\u6837\u4e00\u4e2a\u9700\u6c42\uff0cJavaBean \u4e2d\u88ab @MaskField(\u8fd9\u4e2a\u5373\u5c06\u6210\u4e3a\u6211\u7b2c\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u6ce8\u89e3) \u6807\u8bb0\u7684\u5c5e\u6027\u6216 getter \u65b9\u6cd5\uff0c\u603b\u662f\u8f93\u51fa\u4e3a <code>******<\/code>, \u65e0\u6b64\u6807\u8bb0\u7684\u5c5e\u6027\u6216\u65b9\u6cd5\u8f93\u51fa\u539f\u59cb\u503c\u3002<\/p>\n\u6211\u5c1d\u8bd5\u8fc7 @JsonFilter\u00a0 \u6216\u662f\u5355\u7eaf\u7684\u81ea\u5b9a\u4e49\u00a0 JsonSerializer, \u5e76\u4e0d\u600e\u4e48\u5982\u610f\u3002\u672c\u4eba\u6700\u7ec8\u7684\u5b9e\u73b0\u65b9\u5f0f\u6d89\u53ca\u5230<br\/><br\/>\n<ul>\n<li>@JacksonAnnotationsInside -- \u7528\u6765\u521b\u5efa\u81ea\u5df1\u7684 @MaskField \u6ce8\u89e3<\/li>\n<li>JsonSerializer\u00a0 -- \u88ab @MaskField \u6807\u8bb0\u7684\u5b57\u6bb5\u91c7\u7528\u81ea\u5b9a\u4e49\u7684 JsonSerializer \u6765\u5e8f\u5217\u5316<\/li>\n<li>JacksonAnnotationIntrospector\u00a0 -- \u7981\u7528\u67d0\u4e00\u7279\u5b9a\u7684\u6ce8\u89e3\uff0c\u8fd9\u6837\u53ef\u4ee5\u5728\u505a\u4efb\u610f\u65f6\u5019\u542f\u7528\u6216\u7981\u7528 @MaskField"},{"title":"Java \u63a5\u53e3\u5e38\u91cf\u53cd\u6a21\u5f0f\u53ca\u5982\u4f55\u5b9a\u4e49 Java \u5e38\u91cf","link":"https:\/\/yanbin.blog\/java-constant-interface-anti-pattern\/","pubDate":"Mon, 13 Jul 2015 16:13:46 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-constant-interface-anti-pattern\/","description":"\n<p>\u521d\u5b66 Java \u7684\u4eba\u5f88\u4e0d\u7ecf\u610f\u95f4\u5c31\u4f1a\u628a\u5e38\u91cf\u5b9a\u4e49\u5728\u63a5\u53e3\u4e2d\uff0c\u5927\u6982\u552f\u4e00\u7684\u7406\u7531\u662f\u63a5\u53e3\u4e0d\u80fd\u5b9e\u4f8b\u5316\uff0c\u800c\u4f7f\u7528\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u4e5f\u662f\u4e0d\u7528\u9644\u7740\u5728\u5b9e\u4f8b\u4e0a\u7684\u3002\n\u8fd9\u4e3b\u8981\u8fd8\u662f JDK \u672c\u8eab\u7ed9\u6211\u4eec\u505a\u4e86\u5f88\u591a\u8fd9\u6837\u7684\u699c\u6837,\n\u5982\u00a0 <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/io\/ObjectStreamConstants.html\" target=\"_blank\">java.io.ObjectStreamConstans<\/a>\uff0c\n\u591a\u662f\u51fa\u73b0\u5728 Enum \u7c7b\u578b\u5230\u6765\u4e4b\u524d\u3002<\/p>\n<p>\u5176\u5b9e Java \u7684\u63a5\u53e3\u5e38\u91cf\u662f\u4e00\u79cd\u53cd\u6a21\u5f0f\uff0c\u7406\u7531\u5982\u4e0b\uff1a<\/p>\n<p>1. \u63a5\u53e3\u662f\u4e0d\u80fd\u963b\u6b62\u88ab\u5b9e\u73b0\u6216\u7ee7\u627f\u7684\uff0c \u4e5f\u5c31\u662f\u8bf4\u5b50\u63a5\u53e3\u6216\u5b9e\u73b0\u4e2d\u662f\u80fd\u591f\u8986\u76d6\u6389\u5e38\u91cf\u7684\u5b9a\u4e49(\u91cd\u540d)\uff0c\u8fd9\u6837\u901a\u8fc7\u7236\uff0c\u5b50\u63a5\u53e3(\u6216\u5b9e\u73b0) \u53bb\u5f15\u7528\u5e38\u91cf\u662f\u53ef\u80fd\u4e0d\u4e00\u81f4\u7684<br \/>\n2. \u540c\u6837\u7684\uff0c\u7531\u4e8e\u88ab\u5b9e\u73b0\u6216\u7ee7\u627f\uff0c\u9020\u6210\u5728\u7ee7\u627f\u6811\u4e2d\u53ef\u4ee5\u7528\u5927\u91cf\u7684\u63a5\u53e3, \u7c7b \u6216\u5b9e\u4f8b\u53bb\u5f15\u7528 \u540c\u4e00\u4e2a\u5e38\u91cf\uff0c\u4ece\u800c\u9020\u6210\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u6c61\u67d3\u4e86\u547d\u540d\u7a7a\u95f4\u3002(Java \u7f16\u8bd1\u5668\u7adf\u7136\u5141\u8bb8\u4f7f\u7528\u5b9e\u4f8b\u53bb\u5f15\u7528\u7c7b\u53d8\u91cf)<br \/>\n3. \u63a5\u53e3\u6697\u542b\u7684\u610f\u601d\u662f\uff1a\u5b83\u662f\u9700\u88ab\u5b9e\u73b0\u7684\uff0c\u4ee3\u8868\u7740\u4e00\u79cd\u7c7b\u578b\uff0c\u5b83\u7684\u516c\u6709\u6210\u5458\u662f\u8981\u88ab\u66b4\u9732\u7684 API\u3002\u800c\u5728\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u8bf4\u4e0d\u4e0a\u662f API\n<\/p>\n<p>4. \u8fd9\u70b9\u6709\u4e9b\u91cd\u590d\uff0cJava \u5141\u8bb8\u901a\u8fc7\u5b50\u7c7b\u53bb\u5f15\u7528\u7236\u7c7b\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\uff0c\u5404\u7ea7\u5bf9\u50cf\u5b9e\u4f8b\u53bb\u5f15\u7528\u7236\u7c7b\u7684\u5e38\u91cf\uff0c\u6240\u4ee5\u8fd9\u4f1a\u9020\u6210\u76f8\u5f53\u7684\u6df7\u4e71\u4e0d\u582a\u3002\u5b9a\u4e49\u7684\u5e38\u91cf\u4e0d\u80fd\u4fdd\u8bc1\u5355\u4e00\u7684\u5f15\u7528\u65b9\u5f0f\u3002<\/p>\n<p>\u53c2\u89c1\uff1a <a href=\"http:\/\/blog.csdn.net\/hosterzhu\/article\/details\/9833665\" target=\"_blank\">Effective java \u7b2c 19 \u6761: \u63a5\u53e3\u53ea\u7528\u4e8e\u5b9a\u4e49\u7c7b\u578b<\/a><\/p>\n<p>\u65e2\u7136\u63a5\u53e3\u4e2d\u4e0d\u9002\u4e8e\u5b9a\u4e49\u5e38\u91cf\uff0c\u90a3\u4e48\u8be5\u5728\u4f55\u5904\u4e3a\u5e38\u91cf\u5b89\u5bb6\u5462\uff1f\u63a5\u53e3\u4e3a \u5b9e\u73b0\/\u7ee7\u627f \u800c\u751f\uff0c\u5982\u679c\u653e\u5728\u7c7b\u4e2d\uff0c\u5e76\u4e14\u8fd9\u4e2a\u7c7b\u662f final\uff0c\u4e14\u5c01\u95ed\u6389\u6784\u9020\u65b9\u6cd5\u5c31\u884c\u3002\n\u4e8e\u662f\u6211\u4eec\u5148\u524d\u7684\u63a5\u53e3\u5e38\u91cf\u5b9a\u4e49"},{"title":"\u901a\u8fc7\u53cd\u7f16\u8bd1\u5b57\u8282\u7801\u6765\u7406\u89e3 Java \u679a\u4e3e","link":"https:\/\/yanbin.blog\/understand-java-enum-with-bytecode\/","pubDate":"Wed, 01 Jul 2015 16:27:52 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-enum-with-bytecode\/","description":"\n<p>\u679a\u4e3e\u7684\u58f0\u660e\u5f88\u7b80\u5355, \u50cf <code>enum Gender { Male, Female }<\/code>, \u5176\u4f59\u4e8b\u60c5\u5c31\u662f Java \u7f16\u8bd1\u5668\u5e2e\u6211\u4eec\u5e72\u7684\u4e86\uff0c\u6240\u4ee5 enum \u4e5f\u5c31\u662f\u4e00\u5757\u8bed\u6cd5\u7cd6\u3002\u6709\u4e86\u679a\u4e3e\u786e\u5b9e\u662f\u5f88\u65b9\u4fbf\uff0c\u907f\u514d\u4e86\u4f20\u7edf\u5e38\u91cf\u7684\u65e0\u8303\u56f4\u6027\u3002\u90a3\u4e48\u7f16\u8bd1\u5668\u5230\u5e95\u5728\u540e\u9762\u505a\u4e86\u4ec0\u4e48\u5462\uff1f\u4ee5\u53ca\u7406\u89e3\u4e86\u8fd9\u4e2a\u4e4b\u540e\u6211\u4eec\u53ef\u4ee5\u600e\u4e48\u53bb\u4f7f\u7528 Java \u7684\u679a\u4e3e, \u4e0b\u9762\u5c31\u4ece\u8fd9\u4e2a\u4f8b\u5b50\u8bf4\u8d77\uff1a<\/p>\n<blockquote><p>\npublic enum Gender {<br \/>\n\u00a0\u00a0\u00a0 Male,<br \/>\n\u00a0\u00a0\u00a0 Female<br \/>\n}\n<\/p>\n<\/blockquote><p>\u628a\u4e0a\u9762\u7684\u7f16\u8bd1\u6210 Gender.class, \u7136\u540e\u7528\u00a0 javap -c Gender \u53cd\u7f16\u8bd1\u51fa\u6765\u5c31\u662f"},{"title":"Java \u53cd\u5c04\u4fee\u6539 final \u5c5e\u6027\u503c","link":"https:\/\/yanbin.blog\/java-reflection-modify-final-field-value\/","pubDate":"Thu, 25 Jun 2015 16:47:24 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-reflection-modify-final-field-value\/","description":"\n\u4f7f\u7528\u8fc7 Java \u53cd\u5c04\u7684\u5927\u591a\u90fd\u77e5\u9053, \u60f3\u8981\u4fee\u6539\u67d0\u4e2a\u7c7b\u6216\u5bf9\u8c61\u7684\u79c1\u6709\u53d8\u91cf\u7684\u503c\u7684\u8bdd, \u5728\u8c03\u7528 set \u8bbe\u7f6e\u65b0\u503c\u4e4b\u524d\u6267\u884c\u4e00\u4e0b setAccessible(true) \u5373\u53ef\u3002\u8fd9\u6837\u5229\u7528\u7684 Java \u7684\u53cd\u5c04\u5c31\u80fd\u7ed5\u8fc7 private \u7684\u9650\u5236 \uff0c\u4e0d\u518d\u6709 IllegalAccessException \u5f02\u5e38\u4e86\u3002\u8fd9\u662f\u4e00\u4e2a trick, \u8c03\u7528 Java \u7684\u79c1\u6709\u65b9\u6cd5\u4e5f\u80fd\u8fd9\u4e48\u505a\uff0c\u6709\u4e9b\u4eba\u6216\u8bb8\u6216\u8fd9\u6837\u6765\u6d4b\u8bd5 Java \u79c1\u6709\u65b9\u6cd5\u3002<\/p>\n<br\/>\n\u63d0\u524d\u8bf4\u4e00\u53e5\uff1a\u5728\u4fee\u6539 final \u578b\u503c\u65f6\uff0c\u8981\u7279\u522b\u7559\u610f\u5b83\u7684\u5e38\u91cf\u503c\u672c\u8eab\u662f\u5426\u88ab\u7f16\u8bd1\u5668\u4f18\u5316\u5185\u8054\u5230\u67d0\u5904\uff0c\u5426\u5219\u4f60\u4f1a\u770b\u5230\u867d\u7136\u6ca1\u4ec0\u4e48\u5f02\u5e38\uff0c\u4f46\u53d6\u51fa\u7684\u8fd8\u662f\u539f\u6765\u7684\u503c\u3002\u540e\u9762\u4f1a\u7a0d\u4e3a\u6df1\u5165\u7684\u8bb2\u5230\u3002<br\/><br\/>\n\u4f8b\u5982\u4e0b\u9762\u662f\u4e00\u6bb5\u5b8c\u6574\u7684\u4ee3\u7801, \u7531\u4e8e\u8c03\u7528\u4e86 setAccessiable(true), \u6240\u4ee5\u80fd\u6210\u529f\u628a OneCity \u7684\u79c1\u6709\u5c5e\u6027 name \u7684\u503c\u6539\u4e3a \"Shenzhen\"\uff1a"},{"title":"Java NIO2(AIO) \u8fdb\u884c\u6587\u4ef6\u5f02\u6b65\u8bfb\u53d6","link":"https:\/\/yanbin.blog\/java-nio2-aio-readfile\/","pubDate":"Mon, 12 Jan 2015 17:33:25 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-nio2-aio-readfile\/","description":"\n\u5728\u00a0 NodeJS \u4e2d\u8fdb\u884c\u5f02\u6b65\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u800c Java \u5230\u4e86\u00a0 7 \u5f00\u59cb\u624d\u652f\u6301\u5f02\u6b65\u7684 IO \u64cd\u4f5c\u3002\u867d\u7136\u4e4b\u524d\u7684\u7248\u672c\u6709\u5f15\u5165\u975e\u963b\u585e IO\uff0c\u4f46\u7f16\u7801\u4e2d\u8fd8\u4e0d\u6613\u4f53\u73b0\u51fa\u5b83\u7684\u4f18\u8d8a\u6027\u3002\u4eae\u4e00\u4e0b NodeJS \u7528\u5f02\u6b65 IO \u7684\u4f8b\u5b50\uff1a<\/p>\n<br\/>\n<span style=\"color: #800000;\">var fs = require('fs');<\/span><br \/>\n<span style=\"color: #800000;\">fs.readFile('Test.scala', 'utf-8', function(err, data){<\/span><br \/>\n<span style=\"color: #800000;\">\u00a0 if( !err ) {<\/span><br \/>\n<span style=\"color: #800000;\">\u00a0\u00a0\u00a0 console.log(data);<\/span><br \/>\n<span style=\"color: #800000;\">\u00a0 }<\/span><br \/>\n<span style=\"color: #800000;\">});<\/span><br\/><br\/>\nconsole.log('continue doing other thins');<br\/><br\/>\n\u6267\u884c\u8f93\u51fa\u662f<br\/><br\/>\n<span style=\"color: #800000;\">continue doing other things<\/span><br \/>\n<span style=\"color: #800000;\">CONTENT FROM FILE Test.scala<\/span><br\/><br\/>\n\u5bf9\u7684\uff0c\u7406\u60f3\u4e2d\u7684\u5f02\u6b65\u64cd\u4f5c\u5c31\u662f\uff0c\u4f20\u9012\u56de\u8c03\u51fd\u6570\u6765\u8bfb\u53d6\u6587\u4ef6\uff0c\u8bfb\u53d6\u5b8c\u6210\u540e\u62db\u5f85\u56de\u8c03\uff0c\u4e14\u4e0d\u963b\u585e\u4e3b\u7ebf\u7a0b\u3002<br\/><br\/>\n\u5728 Java 8 \u4e4b\u524d\uff0c\u56e0\u4e3a\u6ca1\u6709 Lambda \u652f\u6301\u53ea\u80fd\u5e94\u7528\u5185\u90e8\u7c7b\u7684\u65b9\u5f0f\u3002JDK \u63d0\u4f9b\u4e86\u4ee5\u4e0b\u5f02\u6b65 Channel \u6765\u5b9e\u73b0\u5f02\u6b65\u64cd\u4f5c<br\/><br\/>\n<strong>AsynchronousFileChannel<\/strong>"},{"title":"\u4e09\u79cd\u65b9\u5f0f\u544a\u77e5\u6cdb\u578b\u7c7b\u6216\u6cdb\u578b\u65b9\u6cd5\u5177\u4f53\u7c7b\u578b","link":"https:\/\/yanbin.blog\/three-ways-tell-generic-concrete-type\/","pubDate":"Wed, 07 Jan 2015 12:28:30 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/three-ways-tell-generic-concrete-type\/","description":"\n\u5728\u4e0a\u4e00\u7bc7\u4e2d\u5199\u9053 <a href=\"https:\/\/yanbin.blog\/java-generic-auto-infer-by-declare-type\/\" target=\"_blank\" rel=\"noopener\">Java \u6cdb\u578b -- \u4f9d\u636e\u58f0\u660e\u7684\u53d8\u91cf\u7c7b\u578b\u81ea\u52a8\u63a8\u65ad<\/a>\uff0c\u4e3b\u8981\u662f\u8bf4\u660e\u4e86\u901a\u8fc7\u58f0\u660e\u7c7b\u578b\u544a\u77e5\u6cdb\u578b\u65b9\u6cd5\u5177\u4f53\u7c7b\u578b\uff0c\u5176\u540e\u6709\u4e2a\u5c0f\u7ed3\u4e09\u79cd\u65b9\u5f0f\u544a\u77e5\u6cdb\u578b\u7c7b\u6216\u6cdb\u578b\u65b9\u6cd5\u5177\u4f53\u7c7b\u578b\uff0c\u5728\u6b64\u91cd\u5217\u5982\u4e0b\uff1a<\/p>\n<br\/>\n<strong><span style=\"color: #0000ff;\">\u4e00. \u5177\u4f53\u7c7b\u578b\u5199\u5728\u4e24\u5c16\u62ec\u53f7\u4e2d<\/span><\/strong><br\/><br\/>\n1. List&lt;String&gt; list<br \/>\n2. new HashMap&lt;String, String&gt;<br \/>\n3. instance.&lt;String&gt;foo()\u00a0\u00a0 \/\/\u5982\u65b9\u6cd5 <span style=\"color: #800000;\">&lt;T&gt; T foo() { return (T) obj; }<\/span><br\/><br\/>\n<strong><span style=\"color: #0000ff;\">\u4e8c. \u53d8\u91cf\u58f0\u660e\u7c7b\u578b\u6307\u793a\u5177\u4f53\u7c7b\u578b<\/span><\/strong><br\/><br\/>\n1. List&lt;String&gt; list = new ArrayList&lt;&gt;()\u00a0\u00a0 \/\/ \u8fd9\u4e2a\u4f8b\u5b50\u5e94\u8be5\u53ef\u4ee5\u5217\u5728\u8fd9\u91cc\uff0cList&lt;String&gt; \u6307\u793a\u4e86\u5177\u4f53\u7c7b\u578b\u662f String, \u6240\u4ee5\u540e\u53ea\u9700\u8981\u7a7a &lt;&gt;\uff0cJDK7 or later<br \/>\n2. String s = obj.foo()\u00a0\u00a0 \/\/\u6bd4\u5982\u65b9\u6cd5\u662f <span style=\"color: #800000;\">&lt;T&gt; T foo() { return (T) obj; }<\/span>, \u7531\u4e8e\u524d\u9762\u7684 String s \u58f0\u660e\uff0c\u6240\u4ee5\u4e0d\u5fc5\u5199\u6210 String s = instance.&lt;String&gt;foo()<br\/><br\/>\n<strong><span style=\"color: #0000ff;\">\u4e09. \u5b9e\u53c2\u7c7b\u578b\u6307\u793a\u5177\u4f53\u7c7b\u578b<\/span><\/strong><br\/><br\/>\n1. instance.foo(String.class)\u00a0 \/\/\u65b9\u6cd5\u4e3a &lt;T&gt; T foo(Class&lt;T&gt; type) { return (T) obj; }, instance.foo(String.class) \u8fd4\u56de\u7684\u5c31\u662f\u5b57\u7b26\u4e32\u503c<br \/>\n2. instance.foo(\"abc\")\u00a0 \/\/\u65b9\u6cd5\u4e3a <span style=\"color: #800000;\">&lt;T&gt; foo(T value) { return (T) obj; }<\/span>, instance.foo(\"abc\") \u8fd4\u56de\u7684\u5c31\u662f\u5b57\u7b26\u4e32\u503c"},{"title":"Java \u6cdb\u578b -- \u4f9d\u636e\u58f0\u660e\u7684\u53d8\u91cf\u7c7b\u578b\u81ea\u52a8\u63a8\u65ad","link":"https:\/\/yanbin.blog\/java-generic-auto-infer-by-declare-type\/","pubDate":"Mon, 05 Jan 2015 18:25:30 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-generic-auto-infer-by-declare-type\/","description":"\nJava \u6cdb\u578b\u5728\u8c03\u7528\u65b9\u6cd5\u64cd\u4f5c\u65f6\u5e94\u7528\u5177\u4f53\u53c2\u6570\u8fd8\u662f\u5f88\u597d\u7406\u89e3\u7684\uff0c\u6bd4\u5982\n<br\/>\n<span style=\"color: #800000;\">Map&lt;String, Integer&gt; map = new HashMap&lt;&gt;();\u00a0<\/span> \/\/\u94bb\u77f3\u64cd\u4f5c\u7b26\u662f JDK 1.7 \u5f15\u5165\u7684<br\/><br\/>\n\u540e\u7eed\u7684 put \u64cd\u4f5c\u8c03\u7528\u7684\u5177\u4f53\u65b9\u6cd5\u5c31\u662f<br\/><br\/>\n<span style=\"color: #800000;\">Integer put(String key, Integer value)<\/span><br\/><br\/>\n\u56e0\u4e3a\u00a0 put \u65b9\u6cd5\u7684\u539f\u578b\u662f<br\/><br\/>\n<span style=\"color: #800000;\">V put(K key, V value)<\/span><br\/><br\/>\n\u4e0a\u9762\u7684\u4ee3\u7801\u6211\u4eec\u662f\u770b\u5230\u4e86 &lt;&gt;\uff0c\u6240\u4ee5\u77e5\u9053\u662f\u6cdb\u578b\u8c03\u7528\u3002\u6709\u65f6\u5019\u5e76\u4e0d\u9700\u8981 &lt;&gt;\uff0c\u4f46\u5b9e\u9645\u4e0a\u4e5f\u662f\u8fdb\u884c\u7684\u6cdb\u578b\u8c03\u7528\uff0c\u90a3\u5c31\u662f Java\u00a0 \u53ef\u4ee5\u4f9d\u636e\u53d8\u91cf\u58f0\u660e\u7c7b\u578b\u6765\u4f5c\u7279\u5316\u8c03\u7528 -- \u5e94\u7528\u5177\u4f53\u53c2\u6570\u7c7b\u578b\u3002<br\/><br\/>\n\u4f8b\u5982\uff1a<br\/><br\/>\n<span style=\"color: #800000;\">List&lt;String&gt; list = Collections.emptyList();\u00a0 \/\/\u867d\u4e0d\u89c1 &lt;&gt;, \u4f46\u540c\u6837\u662f\u6cdb\u578b\u8c03\u7528\uff0c\u7c7b\u578b\u4e3a String<\/span>"},{"title":"Java \u89e3\u6790 XML \u65f6\u5982\u4f55\u5c4f\u853d\u6389 \u201c[Fatal Error]\u201d \u7684\u8f93\u51fa","link":"https:\/\/yanbin.blog\/java-parse-xml-suppress-fatal-error-output\/","pubDate":"Fri, 26 Sep 2014 01:05:29 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-parse-xml-suppress-fatal-error-output\/","description":"\n\u6211\u4eec\u5728\u7528 Java \u89e3\u6790 XML\uff0c\u5f53\u6587\u6863\u4e0d\u662f\u4e00\u4e2a\u5408\u6cd5\u7684 XML \u65f6\uff0c\u53ef\u80fd\u4f1a\u6536\u5230\u00a0<code>[Fatal Error]<\/code> \u7684\u63a7\u5236\u53f0\u8f93\u51fa\uff0c\u5373\u4f7f\u628a\u6574\u4e2a\u4ee3\u7801\u90fd catch \u4f4f\uff0c\u4ecd\u7136\u4e0d\u80fd\u6291\u5236\u4f4f [Fatal Error] \u7684\u4fe1\u606f\u8f93\u51fa\u3002\u6bd4\u5982\u5e38\u89c1\u5230\u8fd9\u6837\u7684\u8f93\u51fa\uff1a<br\/>\n<blockquote>[Fatal Error] :1:1: Content is not allowed in prolog.<\/blockquote>\n\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u7981\u6389\u5b83\u5462\uff0c\u672c\u6765 catch \u4e86\u5f02\u5e38\u5bf9\u7a0b\u5e8f\u5df2\u7ecf\u6709\u4e86\u5f88\u597d\u7684\u4fdd\u62a4\uff0c\u60f3\u773c\u4e0d\u89c1\u5fc3\u4e0d\u70e6\uff0c\u4f46\u8fd8\u662f\u907f\u4e4b\u4e0d\u53ca\u3002<br\/>\n<br\/>\n\u56e0\u4e3a\uff0c\u56e0\u4e3a\u8fd9\u4e2a XML \u89e3\u6790\u5668\u7528\u00a0<code>System.error.print()<\/code> \u8f93\u51fa\u6765\u4e86\uff0c\u5f53\u7136\u4f60\u53ef\u4ee5\u7528 System.setErr(PrintStream) \u91cd\u5b9a\u5411\u6389\u9519\u8bef\u8f93\u51fa\uff0c\u4f46\u4e0d\u73b0\u5b9e\uff0c\u6ce2\u53ca\u9762\u592a\u5927\u3002\u6211\u4eec\u9700\u8981\u627e\u5230\u6e90\u5934\uff0c\u9996\u5148\u4ea4\u4ee3\u89e3\u51b3\u65b9\u6848\u5c31\u662f\u8986\u76d6\u6389\u9ed8\u8ba4\u7684 ErrorHandler\u3002<br\/>\n<br\/>\n\u770b\u4e0b\u8fd9\u6bb5 XML \u89e3\u6790\u4ee3\u7801\uff1a"},{"title":"Java \u7684\u533f\u540d\u7c7b\u521d\u59cb\u5316\u5757\u4e2d\u5982\u4f55\u8bbf\u95ee\u540c\u540d\u53c2\u6570?","link":"https:\/\/yanbin.blog\/java-anonymous-class-access-same-name-parameter\/","pubDate":"Tue, 26 Aug 2014 23:54:44 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-anonymous-class-access-same-name-parameter\/","description":"\n\u56e0\u4e3a\u5199\u8fc7\u7c7b\u4f3c\u4e0b\u9762\u7684\u4e00\u6bb5\u4ee3\u7801\u6765\u5b9e\u59cb\u5316\u4e00\u4e2a\u533f\u540d\u5b9e\u4f8b<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">Test<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">name<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"n\">Test<\/span><span class=\"w\"> <\/span><span class=\"nf\">buildTest<\/span><span class=\"p\">(<\/span><span class=\"kd\">final<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Test<\/span><span class=\"w\"> <\/span><span class=\"n\">test<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Test<\/span><span class=\"p\">(){{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"na\">name<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">name<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u5e0c\u671b\u628a buildTest() \u65b9\u6cd5\u53c2\u6570\u4e2d\u7684 name \u8d4b\u7ed9 this.name<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}};<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">test<\/span><span class=\"p\">.<\/span><span class=\"na\">name<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/ \u4ecd\u7136\u662f null<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">test<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u770b\u4e0a\u9762\u7684\u00a0<code>buildTest()<\/code> \u65b9\u6cd5\u4e2d\u7684\u00a0<code>this.name = name<\/code> \u5e0c\u671b\u80fd\u628a\u65b9\u6cd5\u53c2\u6570 final String name \u4e2d\u7684 name \u503c\u8d4b\u503c\u7ed9 this.name, \u4f46\u662f\u65e0\u6548\uff0cthis.name = name \u662f\u5728\u628a\u81ea\u5df1\u8d4b\u7ed9\u81ea\u5df1\u3002"},{"title":"\u4ee3\u7801\u4e2d\u5982\u4f55\u83b7\u5f97 Java \u65b9\u6cd5\u7684\u5f62\u5f0f\u53c2\u6570\u540d","link":"https:\/\/yanbin.blog\/retrieve-java-method-formal-parameter-names\/","pubDate":"Sun, 24 Aug 2014 14:07:48 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/retrieve-java-method-formal-parameter-names\/","description":"\n\u5bf9\u4e8e\u4e00\u4e2a Java \u65b9\u6cd5 foo(int id, String name); \u6211\u4eec\u5982\u4f55\u80fd\u5728\u4ee3\u7801\u4e2d\u83b7\u5f97\u5f62\u5f0f\u53c2\u6570\u540d id \u548c name \u5462\uff1f<\/p>\n<br\/>\n\u6211\u4eec\u77e5\u9053\u901a\u8fc7\u53cd\u5c04 API\u00a0<code>Method.getGenericParameterTypes()<\/code> \u53ef\u4ee5\u83b7\u5f97\u65b9\u6cd5\u7684\u53c2\u6570\u7c7b\u578b\uff0c\u4f46\u662f\u5bf9\u4e8e\u53c2\u6570\u540d\u4e00\u822c\u5c31\u662f arg0, arg1, arg2 ..., \u56e0\u4e3a Java \u7f16\u8bd1\u65f6\u628a\u5f62\u5f0f\u53c2\u6570\u540d\u64e6\u9664\u4e86\u3002\u6240\u4ee5\u5bf9\u5b8c\u5168\u64e6\u9664\u4e86\u5f62\u5f0f\u53c2\u6570\u540d\u7684\u5b57\u8282\u7801\u5e94\u8be5\u662f\u6ca1\u529e\u6cd5\u4e86\uff0c\u4f46\u6211\u4eec\u81ea\u5df1\u5199\u7684\u7c7b\u8fd8\u662f\u6709\u80fd\u529b\u53bb\u7ba1\u63a7\u7684\u3002<br\/><br\/>\n\u5bf9\u4e8e\u81ea\u5df1\u5199\u7684\u7c7b\uff0c\u6709\u4e24\u79cd\u529e\u6cd5\u83b7\u5f97\u5f62\u5f0f\u53c2\u6570\u540d\uff0c\u5206\u522b\u662f<br\/><br\/>\n1) Java8 \u7684 -parameters \u7f16\u8bd1\u53c2\u6570\uff0c\u7136\u540e\u7528 Java8 \u65b0\u5f15\u5165\u7684\u53cd\u5c04 API <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/reflect\/Parameter.html\" target=\"_blank\" rel=\"noopener\">Parameter<\/a><br\/><br\/>\n\u6211\u4eec\u5148\u5728 Java8 \u4e0b\u8fd0\u884c\u4e0b\u9762\u7684\u4ee3\u7801"},{"title":"Java \u548c Scala \u8c03\u7528\u53d8\u53c2\u7684\u65b9\u5f0f","link":"https:\/\/yanbin.blog\/java-scala-call-varargs-method\/","pubDate":"Mon, 21 Jul 2014 00:11:24 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-scala-call-varargs-method\/","description":"\nJava \u548c Scala \u90fd\u652f\u6301\u53d8\u53c2\u65b9\u6cd5, \u5199\u5728\u6700\u540e\u7684\u4f4d\u7f6e\u4e0a\uff0c\u6700\u57fa\u672c\u7684\u8c03\u7528\u65b9\u5f0f\u4e5f\u90fd\u662f\u4e00\u6837\u7684\uff0c\u4e00\u4e2a\u4e2a\u7f57\u5217\u8fc7\u53bb\u3002\u4e5f\u53ef\u4ee5\u4f20\u5165\u6570\u7ec4\u53c2\u6570\uff0c\u56e0\u4e3a\u53d8\u53c2\u672c\u8d28\u4e0a\u5c31\u662f\u4e00\u4e2a\u6570\u7ec4\uff0c\u5c31\u662f\u628a ... \u5f00\u59cb\u4f4d\u7f6e\u5230\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u90fd\u6536\u7eb3\u5230\u6570\u7ec4\u4e2d\u53bb\uff0c\u6240\u4ee5\u53d8\u53c2\u4e4b\u6240\u4ee5\u8981\u653e\u5728\u6700\u540e\u7684\u4f4d\u7f6e\u4e0a\uff0c\u4e14\u4e00\u4e2a\u65b9\u6cd5\u4e2d\u6700\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u53d8\u53c2\u7c7b\u578b\u3002<\/p>\n<br\/>\n\u8fd9\u91cc\u4e3b\u8981\u662f\u5bf9\u6bd4 Scala \u5bf9\u53d8\u53c2\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u57fa\u672c\u8c03\u7528\u6cd5\u5f53\u7136\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u4f46\u662f\u5728\u4f20\u5165\u6570\u7ec4\u4f5c\u4e3a\u53d8\u53c2\u7684\u53c2\u6570\u5217\u8868\u4e0e Java \u76f8\u5bf9\u65f6\u5c31\u7a0d\u6709\u53d8\u5316\u4e86\u3002<br\/><br\/>\n\u53e6\u5916\u63d0\u4e00\u4e0b\uff0c\u5982\u679c\u60f3\u4f20\u5165 List \u4f5c\u4e3a\u53d8\u53c2\u5217\u8868\uff0c\u800c\u4e0d\u662f\u6574\u4f53\u4f5c\u4e3a\u53d8\u53c2\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\u5c31\u662f\u8c03\u7528\u96c6\u5408\u7684 toArray() \u65b9\u6cd5\u8f6c\u6362\u6210\u4e00\u4e2a\u6570\u7ec4\u4f20\u5165\u3002<br\/><br\/>\n\u4e0b\u9762\u770b Java \u4e2d\u5bf9\u53d8\u53c2\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u53c2\u6570\u5217\u8868\u548c\u6570\u7ec4<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">JavaVarArgs<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">foo<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;a&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;b&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;c&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">foo<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"p\">{<\/span><span class=\"s\">&#34;d&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;e&#34;<\/span><span class=\"p\">});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"p\">...<\/span><span class=\"na\">params<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34; : &#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">params<\/span><span class=\"p\">.<\/span><span class=\"na\">length<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">s<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u4e3a Jackson \u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u5bf9\u8c61\u7684 JSON \u683c\u5f0f","link":"https:\/\/yanbin.blog\/jackson-custom-serialize-json-format\/","pubDate":"Thu, 12 Jun 2014 00:58:28 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jackson-custom-serialize-json-format\/","description":"\n\u4f34\u968f\u7740 Play1, \u6211\u4eec\u539f\u6765\u4f7f\u7528\u7684 JSON \u5e93\u662f Gson. \u56de\u5fc6\u4e0b Gson \u662f\u600e\u4e48\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u5bf9\u8c61\u7684 JSON \u683c\u5f0f\uff0c\u5927\u6982\u662f\u8fd9\u6837\u5b50\u7684<\/p>\n<br\/>\nGsonBuilder()..registerTypeHierarchyAdapter(Cat.class, new Cat());<br\/><br\/>\n\u7136\u540e Cat \u9700\u8981\u5b9e\u73b0 JsonSerializer \u7684 serialize() \u65b9\u6cd5\u3002<br\/><br\/>\n\u6765\u5230\u4e86 Play2 \u4e2d\uff0cJSON \u5e93\u53d8\u6210\u4e86 Jackson\uff0c\u90a3\u4e48 Jackson \u8be5\u5982\u4f55\u4e3a\u5bf9\u8c61\u81ea\u5b9a\u4e49 JSON \u683c\u5f0f\u5462\uff1f<br\/><br\/>\n\u4f8b\u5982\uff0c\u9ed8\u8ba4\u65f6 Jackson \u5bf9 Map \u7c7b\u578b\u8f93\u51fa\u7684\u662f\u4e00\u4e2a JSON \u5bf9\u8c61<br\/><br\/>\nMap(\"key1\"-&gt;\"value1\", \"key2\"-&gt;\"value2\")\u00a0\u00a0\u00a0\u00a0 \u8f6c\u6362\u6210 JSON \u662f {\"key1\":\"value1\", \"key2\":\"value2\"}<br\/><br\/>\n\u5f53\u4e3a\u9002\u5e94\u67d0\u4e9b\u5ba2\u6237\u7aef\uff0c\u5bf9\u4e8e LinkedHashMap \u7c7b\u578b\uff0c\u6211\u4eec\u60f3\u8981\u8f93\u51fa\u7684\u662f\u4e00\u4e2a\u6709\u5e8f\u7684 JSON \u6570\u7ec4\uff1a [{\"key1\":\"value1\"},{\"key2\":\"value2\"}]<br\/><br\/>\n\u6211\u4eec\u5c31\u5e94\u8be5\u81ea\u5b9a\u4e49\u67d0\u4e9b Map \u7684\u5e8f\u5217\u5316\u683c\u5f0f\uff0c\u5b9e\u73b0\u65b9\u6cd5\u6709\u4e24\u79cd\uff0caddSerializer \u548c @JsonSerialize\uff0c\u4e0d\u7ba1\u54ea\u79cd\u65b9\u5f0f\u90fd\u9700\u4e8b\u5148\u5177\u4f53\u5316 JsonSerializer \u7c7b\uff0c\u5e76\u5b9e\u73b0\u5b83\u7684 serialize \u62bd\u8c61\u65b9\u6cd5<br\/><br\/>\n\u6240\u4ee5\u6211\u5148\u6765\u5b9e\u73b0\u4e00\u4e2a\u80fd\u5e8f\u5217\u5316 Map \u7684 JsonArrayMapSerializer \u7c7b"},{"title":"logback.xml \u7ed9\u53d8\u91cf\u6307\u5b9a\u9ed8\u8ba4\u503c","link":"https:\/\/yanbin.blog\/logback-xml-variable-with-default-value\/","pubDate":"Mon, 19 May 2014 20:15:07 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/logback-xml-variable-with-default-value\/","description":"\n\u968f\u7740\u901a\u7528\u65e5\u5fd7\u7ec4\u4ef6\u8f6c\u5165 Slf4j\uff0clogback \u4e5f\u53d8\u6210\u4e86\u9ed8\u8ba4\u7684\u65e5\u5fd7\u5b9e\u73b0\uff0c\u50cf log4j \u4e00\u6837\uff0clogback.xml \u4e2d\u4e5f\u53ef\u4ee5\u4f7f\u7528\u7cfb\u7edf\u5c5e\u6027\u6216\u73af\u5883\u53d8\u91cf\uff0c\u5982 ${catalina.home}\u3002\u5728 log4j.properties \u4e2d\uff0c\u5982\u679c\u53d8\u91cf\u5728\u7cfb\u7edf\u5c5e\u6027\u548c\u73af\u5883\u53d8\u91cf\u4e2d\u627e\u4e0d\u5230\u7684\u8bdd\u9ed8\u8ba4\u4e3a \"\" \u7a7a\u5b57\u7b26\u4e32\uff0c\u800c\u5230\u4e86 logback.xml \u4e2d\u5982\u679c\u67d0\u4e2a\u53d8\u91cf\u627e\u4e0d\u5230\u9ed8\u8ba4\u5c31\u662f \"\u53d8\u91cf\u540d_IS_UNDEFINED\" \u4e86\uff0c\u8fd9\u6837\u5c31\u6bd4\u8f83\u5947\u602a\u4e86\u3002<br\/><br\/>\n\u90a3\u5982\u4f55\u5728\u6ca1\u6709\u914d\u7f6e catalina.home \u7cfb\u7edf\u5c5e\u6027\u6216\u73af\u5883\u53d8\u91cf\u65f6\u8bbe\u7f6e\u4e00\u4e2a\u9ed8\u8ba4\u503c\u5462\uff0c\u4f8b\u5982\uff0c\u6ca1\u6709 catalina.home \u00a0\u65f6\u53d6\u503c\u4e3a \".\"\uff0c\u8fd9\u65f6\u503c\u65e5\u5fd7\u6587\u4ef6\u7684\u8def\u5f84\u5c31\u662f<br\/><br\/>\n.\/logs\/unmi-%d{yyyy-MM-dd}.log<br\/><br\/>\n\u4e86\uff0c\u4e5f\u5c31\u662f\u751f\u6210\u4e2d\u5f53\u524d\u76ee\u5f55\u4e0b\u7684 logs \u5b50\u76ee\u5f55\u4e2d\uff0c\u8fd9\u6837\u7b97\u662f\u5f88\u53cb\u597d\u7684\u65b9\u5f0f\u3002\u4e0b\u9762\u5c31\u6765\u5206\u6790\u600e\u4e48\u4e00\u6b65\u6b65\u627e\u5230\u7b54\u6848\u7684\uff0c\u6ca1\u8010\u5fc3\u6216\u662f\u53ea\u6c42\u7ed3\u679c\u7684\u8bdd\uff0c\u76f4\u63a5\u6eda\u5c4f\u5230\u4e0b\u9762\u5c31\u884c\u3002<br\/><br\/>\n\u6211\u4eec\u7684\u95ee\u9898\u662f\uff0c\u5bf9\u4e8e\u4e0b\u9762\u90a3\u6837\u7684 logback.xml \u914d\u7f6e\uff1a"},{"title":"Java \u8bbe\u8ba1\u4e4b\u521d\u4e3a\u4f55\u5c31\u4e0d\u8ba9\u7528 == \u6bd4\u8f83\u4e24\u5b57\u7b26\u4e32\u5462\uff1f","link":"https:\/\/yanbin.blog\/java-why-cannot-compare-strings-with\/","pubDate":"Thu, 24 Apr 2014 00:14:45 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-why-cannot-compare-strings-with\/","description":"\nJava \u7684\u5b57\u7b26\u4e32\u503c\u6bd4\u8f83\u4e0d\u80fd\u7528 == \u53f7\u8fd9\u4e2a\u8bbe\u8ba1\u4e0d\u77e5\u9053\u6700\u521d\u662f\u600e\u4e48\u8003\u8651\u7684\uff0c\u5b83\u6700\u5927\u7684\u8d21\u732e\u65e0\u7591\u662f\u6ecb\u751f\u4e86\u4e00\u4e2a\u957f\u4e45\u672a\u8870\u7684\u9762\u8bd5\u9898\uff0c\u52a0\u4e4b\u8fde Code Review \u90fd\u53ef\u80fd\u88ab\u5ffd\u7565\u6389\u7684 Bug\u3002\u672c\u6765\u4e24\u4e2a\u5b57\u7b26\u4e32\u7528\u7b49\u53f7\u76f8\u6bd4\u8f83\u662f\u6700\u81ea\u7136\u800c\u7136\u7684\u505a\u6cd5\uff0c\u7136\u800c\u5b83\u5374\u662f\u8981\u8feb\u4f7f\u6211\u4eec\u76f8\u4fe1\u60f3\u5f53\u7136\u5f88\u53ef\u80fd\u662f\u9519\u8bef\u7684\u90a3\u6837\u4e00\u4e2a\u9053\u7406\u3002<br\/>\n<br\/>\n\u6211\u4e00\u76f4\u8ba4\u4e3a Java \u7684\u5b57\u7b26\u4e32\u6bd4\u8f83\u503c\u4e0d\u80fd\u7528 == \u800c\u5fc5\u987b\u7528 equals() \u65b9\u6cd5\u662f\u4e2a\u4e0d\u6070\u5f53\u7684\u8bbe\u8ba1\uff0c\u8fd9\u4ece\u5176\u4ed6\u79cd\u79cd\u8bed\u8a00\u7684\u73b0\u5b9e\u505a\u6cd5(\u4eba\u5bb6\u90fd\u7528 == \u6bd4\u8f83\u503c)\u5c31\u77e5\u9053\u3002<br\/>\n<br\/>\n\u731c\u60f3\u4e00\u4e0b Java \u4e3a\u4f55\u8981\u8fd9\u6837\u5bf9\u5f85\u5b57\u7b26\u4e32\uff0c\u53ef\u80fd Java \u53c8\u60f3\u7c7b\u578b\u5168\u90e8\u5bf9\u8c61\u5316\uff0c\u540c\u65f6\u8003\u8651\u5230\u65b9\u4fbf\u6027\uff0c\u4ecd\u7136\u4fdd\u7559\u4e86 int, short, boolean \u7b49\u539f\u59cb\u7c7b\u578b\uff0c\u5b83\u4eec\u662f\u53ef\u4ee5\u7528 == \u6bd4\u8f83\u503c\uff0c\u5176\u4ed6\u771f\u6b63\u7684\u5bf9\u8c61\u7c7b\u578b\u7528 equals() \u65b9\u6cd5\u6bd4\u8f83\u4e5f\u662f\u65e0\u53ef\u539a\u975e\u7684\u3002\u8fd9\u65f6\u5019\u5939\u7f1d\u4e2d\u7684\u5b57\u7b26\u4e32\u5374\u88ab\u4e3a\u96be\u5230\u4e86\uff0c\u5b83\u90a3\u4e48\u7684\u5e38\u7528\uff0c\u8fd8\u5e38\u4ee5\u5b57\u9762\u91cf\u7684\u9762\u76ee\u51fa\u73b0\uff0c\u5b83\u66f4\u8be5\u662f\u4e2a\u57fa\u672c\u7c7b\u578b\uff0c\u800c\u5b9e\u4e3a\u5bf9\u8c61\u7c7b\u578b\uff0c\u56e0\u6b64\u4e0d\u88ab\u8ba4\u53ef\u7528 == \u76f4\u63a5\u6bd4\u8f83\u503c\uff0c \u800c\u9009\u62e9\u4e86\u7528 equals() \u65b9\u6cd5\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\u503c\u3002<br\/>\n<br\/>\n\u800c\u53e6\u4e00\u65b9\u9762\uff0c\u7531\u4e8e\u5b57\u7b26\u4e32\u662f\u591a\u4f8b\u7684\uff0c\u6240\u4ee5\u6709\u4e9b\u60c5\u51b5\u4e0b\u53c8\u66f4\u4ee4\u4eba\u8ff7\u60d1\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u79cd\u79cd\u60c5\u51b5"},{"title":"JMockit \u5982\u4f55 mock \u5f02\u5e38","link":"https:\/\/yanbin.blog\/jmockit-how-to-mock-excepction\/","pubDate":"Tue, 22 Apr 2014 23:51:40 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-how-to-mock-excepction\/","description":"\n2014-07-26 \u4fee\u6539\u672c\u6587<\/p>\n<br\/>\n\u540e\u6765\u53d1\u73b0\u7528 JMockit \u6765 mock \u5f02\u5e38\u6839\u672c\u6ca1\u6709\u4e4b\u524d\u6587\u4e2d\u63cf\u8ff0\u7684\u90a3\u4e48\u590d\u6742\uff0c\u5176\u5b9e\u8fd8\u662f\u5728\u90a3\u4e2a result \u4e0a\uff0c\u7ed9\u5b83\u8d4b\u4e2a\u5f02\u5e38\u5b9e\u4f8b\u5c31\u8f7b\u800c\u6613\u4e3e\u7684\u89e3\u51b3\u4e86\uff0c\u53ea\u9700\u5982\u6b64<br\/><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Expectations<\/span><span class=\"p\">(<\/span><span class=\"n\">MyService<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">ExternalService<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">ExternalService<\/span><span class=\"p\">.<\/span><span class=\"na\">fetchData<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">NetworkException<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;No IPAddress &#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">};<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u539f\u6587\u53ef\u4e0d\u7528\u770b\u4e0b\u53bb\u4e86\u3002<br\/>\n<hr \/><br\/>\n\u505a\u8fc7\u51e0\u7bc7 JMockit \u4f7f\u7528 Expectations \u6765 Mock \u65b9\u6cd5\uff0c\u79c1\u6709\u65b9\u6cd5\uff0c\u79c1\u6709\u5c5e\u6027\u7684\u7684\u65e5\u5fd7\uff0c\u4eca\u5929\u5de5\u4f5c\u4e0a\u7a81\u7136\u6709\u4e2a\u9700\u6c42\u662f\u8981 Mock \u5f02\u5e38\u3002\u73b0\u5728\u518d\u4e5f\u4e0d\u80fd\u4e3a\u4e86\u8dd1\u4e2a\u5355\u5143\u6d4b\u8bd5\u800c\u53bb\u62d4\u4e0b\u7f51\u7ebf\u4e86\uff0c\u4e5f\u4e0d\u8be5\u4eba\u4e3a\u7684\u53bb\u5236\u9020\u5176\u4ed6\u6df7\u4e71\u6765\u6d4b\u8bd5\u3002\u5f00\u59cb\u662f\u60f3\u80fd\u4e0d\u80fd\u7528 Expectations \u6765 Mock \u5f02\u5e38\uff0c\u5c1a\u672a\u53d1\u73b0\u76f8\u5173\u7684\u5c5e\u6027\u53ef\u4ee5\u8bbe\u7f6e\uff0c\u6ca1\u6709\u7c7b\u4f3c result \u90a3\u6837\u7684\u5c5e\u6027\uff0c\u6bd4\u5982\u60f3\u50cf\u4e2d\u6709\u4e2a exception\/throwable \u5c5e\u6027\uff1a"},{"title":"\u521d\u59cb\u5316 Gradle \u5de5\u7a0b\u76ee\u5f55","link":"https:\/\/yanbin.blog\/initialize-gradle-project-layout\/","pubDate":"Mon, 21 Apr 2014 23:37:55 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/initialize-gradle-project-layout\/","description":"\n\u6700\u8fd1\u91cd\u65b0\u5728 Eclipse \u4e2d\u6253\u5f00\u65e7\u7684 Maven \u9879\u76ee\uff0c\u603b\u6709\u4e9b\u4ec0\u4e48\u9519\u8bef\uff0c\u5907\u53d7\u6298\u78e8\u3002\u671f\u95f4\u8bd5\u624b\u4e86 Ant+Ivy, \u73b0\u4eca\u8bd5\u7528\u4e86\u4e0b Gradle\uff0c\u611f\u89c9\u4e0d\u9519\uff0c\u5b83\u5e94\u8be5\u624d\u662f\u6211\u771f\u60f3\u8981\u7684\uff0cMaven \u5dee\u4e0d\u591a\u8be5\u6254\u5230\u4e00\u8fb9\u53bb\u4e86\u3002<\/p>\n<br\/>\nGradle \u50cf sbt \u6784\u5efa\u5de5\u5177\u4e00\u6837\uff0c\u4e5f\u4e0d\u4f1a\u5e2e\u6211\u4eec\u751f\u6210\u9ed8\u8ba4\u7684\u76ee\u5f55\u5e03\u5c40\uff0c\u8fd9\u4e9b\u8981\u81ea\u5df1\u6765\u505a\u3002\u8fd9\u4e0d\u662f\u4ec0\u4e48\u9ebb\u70e6\u4e8b\uff0c\u56e0\u4e3a\u53ea\u9700\u505a\u4e00\u6b21\uff0c\u53ef\u9884\u5148\u5199\u597d\u521d\u59cb\u5316\u811a\u672c\uff0c\u5e78\u597d\u672c\u4eba\u5df2\u4e60\u60ef shell \u64cd\u4f5c\u3002<br\/><br\/>\n\u5047\u8bbe\u6211\u4eec\u6709\u8fd9\u6837\u7684\u00a0<code>build.gradle<\/code>\u00a0\u6587\u4ef6<br\/>\n<blockquote>\napply plugin: 'java'<br \/>\napply plugin: 'war' \u00a0 \u00a0\/\/\u6709\u8fd9\u884c\u65f6\u6211\u4eec\u9700\u8981\u521b\u5efa src\/main\/webapp \u76ee\u5f55<br \/>\napply plugin: 'eclipse'\n<\/blockquote>\n\u6211\u4eec\u6267\u884c <code>gradle eclipse<\/code>\u00a0\u540e\u662f\u4e0d\u4f1a\u751f\u6210<code>src<\/code> \u76ee\u5f55\u7684\uff0c\u5de5\u7a0b\u4e0b\u7684\u6e90\u6587\u4ef6\u76ee\u5f55\u662f\u9700\u8981\u81ea\u5df1\u6765\u751f\u6210\u7684\u3002Gradle \u53c2\u8003 Maven \u7684\u6807\u51c6\u76ee\u5f55\u5e03\u5c40\uff0c\u5373<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-text\" data-lang=\"text\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\">src\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> \u251c\u2500\u2500 main\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> \u2502\u00a0\u00a0 \u251c\u2500\u2500 java\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> \u2502\u00a0\u00a0 \u251c\u2500\u2500 resources\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> \u2502\u00a0\u00a0 \u2514\u2500\u2500 webapp\n<\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"> \u2514\u2500\u2500 test\n<\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"> \u251c\u2500\u2500 java\n<\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"> \u2514\u2500\u2500 resources<\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6211\u4eec\u6709\u4e24\u79cd\u529e\u6cd5\u521d\u59cb\u5316\u76ee\u5f55\u5e03\u5c40"},{"title":"\u57fa\u4e8e Groovy \u7684\u81ea\u52a8\u5316\u6784\u5efa\u5de5\u5177 Gradle \u5165\u95e8","link":"https:\/\/yanbin.blog\/groovy-based-auto-builder-gradle-get-started\/","pubDate":"Sun, 20 Apr 2014 23:20:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/groovy-based-auto-builder-gradle-get-started\/","description":"\n\u672c\u4eba\u5de5\u4f5c\u4e4b\u521d\u6ca1\u6709\u4f7f\u7528\u81ea\u52a8\u5316\u6784\u5efa\uff0c\u540e\u6765\u654f\u6377\u4e86\uff0c\u5f00\u59cb\u4f7f\u7528 Ant - \u5b8c\u5168\u9762\u5411\u8fc7\u7a0b\u7684\u5b9a\u4e49\u6b65\u9aa4\uff0c\u4e0d\u8fdb\u884c\u4f9d\u8d56\u7ba1\u7406\u3002\u518d\u53d1\u5c55\u5230 Maven\uff0c\u9762\u5411\u5bf9\u8c61\u7684\u65b9\u5f0f\u7ba1\u7406\u5de5\u7a0b\uff0c\u6709\u4e86\u4f9d\u8d56\u7684\u7ba1\u7406\uff0cJAR \u5305\u7edf\u4e00\u4ece\u4e2d\u592e\u4ed3\u5e93\u83b7\u5f97\uff0c\u4fdd\u5b58\u5728\u672c\u5730\u5e93\u3002\u540c\u65f6\u4ea7\u751f\u4e86 Ivy + Ant\uff0c\u8ba9 Ant \u4e5f\u80fd\u7ba1\u7406\u4f9d\u8d56\uff0c\u4e0d\u8fc7 JAR \u5305\u4f9d\u8d56\u4ed3\u5e93\u4e5f\u662f\u7528 Maven \u7684\u3002<\/p>\n<br\/>\n\u524d\u9762\u90fd\u662f\u7528 XML \u6765\u914d\u7f6e\u7684\uff0c\u867d\u8bf4 XML \u7684\u6807\u7b7e\u63cf\u8ff0\u6027\u4e5f\u5f88\u5f3a\uff0c\u4f46\u9605\u8bfb\u6027\u8fd8\u662f\u6709\u4e9b\u7275\u5f3a\uff0c\u5e76\u4e14 Maven \u548c Ant+Ivy \u90fd\u9700\u8981 IDE \u7684\u652f\u6301\uff0c\u6bd4\u5982\u5728 Eclipse \u4e2d\u6709\u4e13\u95e8 <strong>Maven Dependencies<\/strong> \u6216 <strong>ivy.xml [*]<\/strong> \u4e2d\u5217\u51fa\u9879\u76ee\u7684\u4f9d\u8d56\u5305\uff0c\u8fd9\u91cc\u5e38\u4f1a\u51fa\u73b0\u4e9b\u95ee\u9898\u3002<br\/><br\/>\n\u800c\u6211\u4eca\u5929\u60f3\u5c1d\u8bd5\u4f7f\u7528\u7684\u662f\u57fa\u4e8e Groovy \u7684 Gradle\uff0c\u53ea\u8981\u4e00\u4e2a build.gradle \u6587\u4ef6\uff0c\u5b9e\u8d28\u662f\u4e00\u4e2a groovy \u6587\u4ef6\uff0c\u7531\u4e8e\u53ef\u4ee5 DSL\uff0c\u6240\u4ee5 Gradle \u6bd4 XML \u66f4\u5199\u610f\uff0c\u66f4\u4e3b\u8981\u7684\u662f Gradle \u9879\u76ee\u4e0d\u9700\u8981 IDE \u7684\u7279\u522b\u652f\u6301\uff0c<a href=\"#maven_ivy\">\u89c1\u540e\u9762\u7684\u56fe<\/a>\u3002<br\/><br\/>\n\u5148\u8981\u5b89\u88c5 Gradle\uff0c\u5728\u6211\u7684 Mac \u7cfb\u7edf\u4e0b\u6211\u662f\u7528\u00a0<code>brew install gradle<\/code> \u5b89\u88c5\u7684\uff0c\u4e0d\u540c\u5e73\u53f0\u4e0b\u53ef\u80fd\u7528 yum, apt-get\uff0c\u5b89\u88c5\u540e\u6267\u884c\u00a0<code>gradle<\/code> \u547d\u4ee4\u9a8c\u8bc1\u3002<br\/><br\/>\n\u63a5\u7740\u6309\u4ee5\u4e0b\u6b65\u9aa4\uff1a<br\/><br\/>\n<span style=\"background-color: #ffffff; color: #0000ff; font-size: 12pt;\"><strong>1. \u521b\u5efa\u9879\u76ee\u76ee\u5f55<\/strong><\/span> testgradle\uff0c\u5e76\u8fdb\u5165\u5230\u65b0\u521b\u5efa\u7684\u76ee\u5f55<br\/>\n<blockquote>\nmkdir testgradle<br \/>\ncd testgradle"},{"title":"Apache \u914d\u7f6e SSL(HTTPS) \u5e76\u6574\u5408 Tomcat","link":"https:\/\/yanbin.blog\/apache-ssl-tomcat\/","pubDate":"Sun, 30 Mar 2014 00:42:57 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/apache-ssl-tomcat\/","description":"\n\u6211\u4eec\u5728 Tomcat \u4e2d\u53ef\u4ee5\u5f00\u542f SSL\uff0c\u7528 HTTPS \u6765\u8bbf\u95ee\uff0c\u89c1\u524d\u4e00\u7bc7\n<a title=\"\u5feb\u901f\u542f\u7528 Tomcat \u7684 HTTPS \u534f\u8bae\u8bbf\u95ee\" href=\"https:\/\/yanbin.blog\/enable-tomcat-https-protocol\/\" target=\"_blank\">\u5feb\u901f\u542f\u7528 Tomcat \u7684 HTTPS \u534f\u8bae\u8bbf\u95ee<\/a>\uff0c\n\u4e0d\u8fc7\u66f4\u63a5\u8fd1\u5b9e\u9645\u7684\u5e94\u7528\u662f Tomcat \u53ea\u62c5\u5f53 Servlet \u5bb9\u5668\uff0cHTTPS \u534f\u8bae\u90e8\u4efd\uff0c\u751a\u81f3\u662f\u9759\u6001\u9875\u9762\u662f\u4ea4\u7ed9 Apache \u7684\u5904\u7406\uff0cApache \u4e0e Tomcat \u4e4b\u95f4\u6709\u4e00\u4e2a\u901a\u9053\u3002\n\u5f53\u7136\u524d\u7aef\u7528 F5 \u90a3\u7c7b\u8d1f\u8f7d\u5747\u8861\u8bbe\u5907\u5c31\u53e6\u5f53\u522b\u8bba\u4e86\u3002<br\/>\n<br\/>\n\u8fd9\u91cc\u5b9e\u8df5\u4e00\u4e0b\u600e\u4e48\u5f00\u542f Apache \u7684 HTTPS\uff0c\u5e76\u4e0e Tomcat \u8fdb\u884c\u6574\u5408\u7684\u64cd\u4f5c\u3002\u5e73\u53f0\u662f Mac OS X, Apache2, Tomat8\uff0c\u5176\u4ed6\u5e73\u53f0\u6216\u4e0d\u540c\u7248\u672c\u7684\u5e94\u7528\u8f6f\u4ef6\u914d\u7f6e\u7c7b\u4f3c\u3002<br\/>\n<br\/>\n<strong>\u7b2c\u4e00\u6b65: \u751f\u6210\u81ea\u7b7e\u7f72\u8bc1\u4e66<\/strong><br\/>\n<br\/>\n\u5b89\u5168\u52a0\u5bc6\u7684\u4e1c\u897f\u90fd\u5f97\u8bc1\u4e66\uff0c\u6211\u4eec\u9700\u8981\u7528\u5230 openssl\uff0c\u6ca1\u6709\u5c31\u5148\u5b89\u88c5\u5b83\uff0c\u547d\u4ee4\u662f\uff1a<br\/>\n<blockquote>openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key<\/blockquote>\n\u4e0a\u9762\u547d\u4ee4\u53ef\u4ee5\u6307\u5b9a\u751f\u6210 server.crt \u548c server.key \u6587\u4ef6\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4ea7\u751f\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\uff0c\u5047\u8bbe\u8fd9\u4e24\u4e2a\u6587\u4ef6\u751f\u6210\u5728&nbsp;<code>\/etc\/apache2<\/code> \u76ee\u5f55\u4e0b\u3002"},{"title":"\u5feb\u901f\u542f\u7528 Tomcat \u7684 HTTPS \u534f\u8bae\u8bbf\u95ee","link":"https:\/\/yanbin.blog\/enable-tomcat-https-protocol\/","pubDate":"Sat, 29 Mar 2014 00:59:36 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/enable-tomcat-https-protocol\/","description":"\n\u6709\u65f6\u5019\u5b89\u5168\u8003\u8651\u4f1a\u8981\u5f00\u542f Tomcat \u7684 https \u534f\u8bae\u8bbf\u95ee\uff0c\u6700\u5feb\u901f\u7684\u914d\u7f6e\uff0c\u4e24\u6b65<\/p>\n<br\/>\n<strong>1. \u521b\u5efa keystore \u6587\u4ef6<\/strong><br\/>\n\u6267\u884c JDK \u5e26\u7684\u547d\u4ee4<br\/>\n<blockquote>\nkeytool -genkey -alias tomcat -keyalg RSA\n<\/blockquote>\n\u6309\u547d\u4ee4\u63d0\u793a\u5404\u4e2a\u4fe1\u606f\u5373\u53ef\uff0c\u6700\u540e\u5728\u7528\u6237\u4e3b\u76ee\u5f55\u4e0b\u521b\u5efa\u4e86\u4e00\u4e2a .keystore \u6587\u4ef6<br\/><br\/>\n<strong>2. \u914d\u7f6e Tomcat \u4f7f\u7528 keystore \u6587\u4ef6<\/strong><br\/><br\/>\n\u6253\u5f00 server.xml \u627e\u5230\u4e0b\u9762\u88ab\u6ce8\u91ca\u7684\u8fd9\u6bb5<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"c\">&lt;!--\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"c\">&lt;Connector port=&#34;8443&#34; protocol=&#34;org.apache.coyote.http11.Http11NioProtocol&#34;\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"c\"> maxThreads=&#34;150&#34; SSLEnabled=&#34;true&#34; scheme=&#34;https&#34; secure=&#34;true&#34;\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"c\"> clientAuth=&#34;false&#34; sslProtocol=&#34;TLS&#34; \/&gt;\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"c\">--&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u7406\u89e3\u65b0\u5f0f\u96c6\u5408\u64cd\u4f5c","link":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","pubDate":"Tue, 25 Mar 2014 03:11:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","description":"\n\u6709\u4e86\u524d\u9762\u7684 SAM\uff0cLambda \u8868\u8fbe\u5f0f\uff0c\u4ee5\u53ca\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u4f5c\u94fa\u57ab\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u53bb\u5f88\u597d\u7684\u53bb\u7406\u89e3 Java8 \u7528 Lambda \u00a0\u8868\u8fbe\u5f0f\u64cd\u4f5c\u96c6\u5408\u7684\u57fa\u672c\u539f\u7406\u4e86\u3002\u6b64\u7bc7\u6211\u4eec\u60f3\u8981\u5316\u89e3\u7684\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Arrays<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Collection<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.stream.Collectors<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">TestJava8Collection<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Collection<\/span><span class=\"w\"> <\/span><span class=\"n\">collection<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;abc&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;cde&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;efg&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">List<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">collection<\/span><span class=\"p\">.<\/span><span class=\"na\">stream<\/span><span class=\"p\">().<\/span><span class=\"na\">filter<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;c&#34;<\/span><span class=\"p\">)).<\/span><span class=\"na\">collect<\/span><span class=\"p\">(<\/span><span class=\"n\">Collectors<\/span><span class=\"p\">.<\/span><span class=\"na\">toList<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5982\u679c\u5bf9\u5176\u4ed6\u652f\u6301\u95ed\u5305\u7684\u8bed\u8a00\uff0c\u5982 JavaScript, Groovy, Ruby, Scala \u7b49\u6709\u6240\u4e86\u89e3\u7684\u8bdd\uff0c\u5f88\u5bb9\u6613\u770b\u51fa\u524d\u9762\u7684\u4ee3\u7801\u8f93\u51fa\u4e3a<br\/>\n<blockquote>\nabc<br \/>\ncde"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u9ed8\u8ba4\u548c\u9759\u6001\u63a5\u53e3\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","pubDate":"Tue, 25 Mar 2014 01:41:50 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","description":"\n<p>\u8fdb\u5165 Java8 \u4e4b\u540e\u6211\u4eec\u4f1a\u53d1\u73b0\u63a5\u53e3\u53ef\u4ee5\u6709\u65b9\u6cd5\u5b9e\u73b0\u4e86\uff0c\u8fd9\u4e0e\u6211\u4eec\u4e00\u76f4\u770b\u5f85 Java \u63a5\u53e3\u7684\u89c2\u5ff5\u4ea7\u751f\u4e86\u51b2\u7a81\uff0c\u4e0d\u8fc7\u4e5f\u522b\u6025\uff0c\u63a5\u53e3\u4e2d\u7684\u65b9\u6cd5\u5b9e\u73b0\u5fc5\u987b\u662f\u4e00\u4e2a\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u5373\u50cf<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">interface<\/span> <span class=\"nc\">Shape<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">default<\/span><span class=\"w\"> <\/span><span class=\"kt\">boolean<\/span><span class=\"w\"> <\/span><span class=\"nf\">isShape<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u672c\u6587\u65e8\u5728\u63a2\u8ba8 Java8 \u7684\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u5b58\u5728\u7684\u5408\u7406\u6027\uff0cJava8 \u5728\u8fd9\u70b9\u4e0a\u5982\u4f55\u4fdd\u6301\u4e0e\u524d\u9762\u7248\u672c\u7684\u517c\u5bb9\u6027\u3002<br\/><br\/>\nLambda \u548c\u65b9\u6cd5\u5f15\u7528\u4f7f\u5f97 Java \u8bed\u8a00\u66f4\u5177\u8868\u73b0\u529b\u3002\u8bf4\u5230 Lambda \u548c\u65b9\u6cd5\u5f15\u7528\u7684\u5173\u7cfb\uff0cLambda \u8868\u8fbe\u5f0f\u7684\u76ee\u7684\u5c31\u662f\u8ba9\u4f60\u66f4\u4e3a\u4fbf\u6377\u7684\u53bb\u7ed5\u8fc7\u5bf9\u8c61\u76f4\u63a5\u5f15\u7528\u65b9\u6cd5\u3002<br\/><br\/>\n\u63a5\u53e3\u5e94\u8be5\u662f\u76f8\u5bf9\u7a33\u56fa\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u6709\u8fd9\u6837\u7684\u7ecf\u9a8c\uff0c\u7c7b\u4e2d\u4f7f\u7528\u4e86\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\uff0c\u5982\u679c\u5728\u63a5\u53e3\u4e2d\u6539\u53d8\u4e86\u8be5\u5e38\u91cf\u503c\uff0c\u5355\u7eaf\u7684\u66ff\u6362\u63a5\u53e3\u5bf9\u5e94\u7684 class \u6587\u4ef6\u662f\u4e0d\u594f\u6548\u7684\uff0c\u56e0\u4e3a\u7f16\u8bd1\u7c7b\u65f6\u5176\u5b9e\u662f\u628a\u63a5\u53e3\u4e2d\u7684\u5e38\u91cf\u76f4\u63a5\u56fa\u5316\u5728\u7c7b\u4e2d\u4e86\u3002\u5982\u679c\u7c7b\u4e2d\u8981\u4f53\u73b0\u51fa\u6700\u65b0\u5e38\u91cf\u503c\uff0c\u90a3\u4e48\u4f7f\u7528\u63a5\u53e3\u7684\u7c7b\u4e5f\u8981\u91cd\u65b0\u7f16\u8bd1\u3002\u5373\u4f7f\u5728\u63a5\u53e3\u4e2d\u6dfb\u52a0\u6216\u6539\u53d8\u4e86\u65b9\u6cd5\u5b9a\u4e49\uff0c\u4e5f\u4e0d\u80fd\u5f3a\u5236\u4f7f\u7528\u5230\u5b83\u7684\u7c7b\u91cd\u65b0\u7f16\u8bd1\uff0c\u65e9\u5148\u7684\u7c7b\u5b8c\u5168\u53ef\u4ee5\u81ea\u7531\u7684\u8fd0\u884c\uff0c\u56e0\u4e3a\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u548c\u65b9\u6cd5\u7684\u6240\u6709\u5185\u5bb9\u90fd\u5728\u81ea\u8eab\uff0c\u7c7b\u4e00\u65e6\u7f16\u8bd1\u540e\u4fbf\u53ef\u8131\u79bb\u6240\u5b9e\u73b0\u7684\u63a5\u53e3\u800c\u8fd0\u8f6c\u3002"},{"title":"Java \u63a7\u5236\u53f0\u8f93\u51fa\u767e\u5206\u6bd4\u8fdb\u5ea6\u6307\u5668","link":"https:\/\/yanbin.blog\/java-console-perent-progress\/","pubDate":"Thu, 20 Feb 2014 00:46:13 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-console-perent-progress\/","description":"\n\u7528 Java \u5728\u63a7\u5236\u53f0\u4e0b\u8f93\u51fa\u7528\u00a0<code>System.out.print()<\/code> \u8fd9\u6837\u7684\u65b9\u6cd5\uff0c\u90a3\u4e48\u8981\u5728\u540c\u4e00\u884c\u8f93\u51fa\u8c61 FTP \u4f20\u6587\u4ef6\u90a3\u6837\u7684\u8fdb\u5ea6\u6307\u793a\u600e\u4e48\u505a\u5462\uff0c\u5b83\u9700\u8981\u5728\u540c\u4e00\u884c\u76f8\u540c\u7684\u4f4d\u7f6e\u4e0a\u64e6\u9664\u5e76\u8f93\u51fa\u65b0\u767e\u5206\u6570\u3002\u6bd4\u5982\u524d\u4e00\u884c\u6253\u5370\u4e86 1%\uff0c \u4e0b\u4e00\u6b21\u5c31\u628a 1% \u64e6\u9664\u6389\uff0c\u540c\u4e00\u4f4d\u7f6e\u4e0a\u6253\u5370 2%\uff0c\u5c31\u5f62\u6210\u4e86\u8d70\u8fdb\u5ea6\u7684\u6548\u679c\u3002\u5982\u4e0b\uff1a<\/p>\n<br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2014\/java-console-perent-progress\/console_percent.gif\"\nwidth=\"340px\"\n\/>\n\u6211\u4eec\u8981\u7528\u5230\u7684\u529e\u6cd5\u662f<code> System.out.print(\"\\b\")<\/code> \u5c31\u4f1a\u5728\u63a7\u5236\u53f0\u4e0b\u5f80\u56de\u5220\u6389\u4e00\u4e2a\u5b57\u7b26\uff0c\u5982\u679c\u4f60\u60f3\u56de\u5220\u591a\u4e2a\u5b57\u7b26\u5c31\u6253\u5370\u591a\u4e2a \"\\b\" \u5427\uff0c\u53ea\u56de\u5220\u9664\u5230\u5f53\u524d\u884c\u9996\uff0c\u4e5f\u5c31\u662f\u4e0d\u56de\u5f71\u54cd\u5230\u4e0a\u4e00\u884c\u7684\u8f93\u51fa\u3002\u600e\u4e48\u5220\u9664\u5f53\u524d\u884c\u5168\u90e8\u8f93\u51fa\u6216\u6307\u5b9a\u7684\u5b57\u7b26\u6570\u5462\uff0c\u4e24\u4e2a\u529e\u6cd5\uff1a<br\/><br\/>\n\u8f93\u51fa\u8db3\u591f\u591a\u7684 \"\\b\"\uff0c\u4f1a\u5220\u9664\u5230\u884c\u9996\u4e3a\u6b62\uff0c\u8fd9\u6837\u505a\u5176\u5b9e\u4e5f\u4e0d\u4fdd\u9669\uff0c\u8c01\u77e5\u9053\u4e0a\u4e00\u884c\u4f1a\u591a\u5c11\u5b57\u7b26\u5462<br \/>\n\u7cbe\u786e\u63a7\u5236\u56de\u5220\u591a\u5c11\u4e2a\u5b57\u7b26\uff0c\u6709\u65f6\u5019\u4e5f\u9700\u8981\u4fdd\u7559\u524d\u9762\u4e00\u4e9b\u5185\u5bb9"},{"title":"Maven \u5de5\u7a0b\u751f\u6210\u53ef\u6267\u884c\u7684 JAR \u5305","link":"https:\/\/yanbin.blog\/maven-generate-executable-jar\/","pubDate":"Sun, 16 Feb 2014 23:52:30 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maven-generate-executable-jar\/","description":"\n\u8fdc\u79bb Maven \u5de5\u7a0b\u6709\u4e9b\u65f6\u65e5\u4e86\uff0c\u4e5f\u4e0d\u77e5\u9053\u5f53\u524d\u8fd8\u662f\u5426\u5728\u6d41\u884c Maven \u7ba1\u7406\u5de5\u7a0b\u4e0e\u4f9d\u8d56\uff0c\u5f53\u524d\u7c7b\u4f3c\u5de5\u5177\u6709 <a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\">Ant<\/a>+<a href=\"https:\/\/ant.apache.org\/ivy\/\" target=\"_blank\" rel=\"noopener\">Ivy<\/a>, <a href=\"http:\/\/gruntjs.com\" target=\"_blank\" rel=\"noopener\">Grunt<\/a>, <a href=\"http:\/\/www.scala-sbt.org\" target=\"_blank\" rel=\"noopener\">sbt<\/a> \u548c <a href=\"http:\/\/www.gradle.org\" target=\"_blank\" rel=\"noopener\">Gradle<\/a>\u3002Web \u5de5\u7a0b\u7684\u8f93\u51fa\u53d1\u5e03\u5305\u6ca1\u4ec0\u4e48\u597d\u8bf4\u7684\uff0c\u56e0\u4e3a\u00a0&lt;packaging&gt;<code>war<\/code>&lt;\/packaging&gt;\uff0c\u6240\u4ee5 <code>mvn package<\/code>\u00a0\u51fa\u6765\u7684 WAR \u5305\u91cc\u5c31\u6709\u7ad9\u70b9\u8fd0\u884c\u7684\u6240\u6709\u5185\u5bb9\u4e86\uff0c\u7528\u5230\u7684\u4f9d\u8d56\u4f1a\u5728 WEB-INF\/lib \u76ee\u5f55\u4e0b\u5217\u7740\u3002<\/p>\n<br\/>\n\u800c\u5bf9\u4e8e\u90a3\u4e9b\u00a0&lt;packaging&gt;<code>jar<\/code>&lt;\/packaging&gt; \u7684\u5de5\u7a0b\uff0c\u7528 <code>mvn package<\/code>\u00a0\u53ea\u4f1a\u751f\u6210\u4e00\u4e2a JAR \u5305\uff0c\u5b83\u6240\u4f9d\u8d56\u7684\u5404\u4e2a\u7c7b\u5e93\u4ecd\u7136\u5206\u6563\u5728\u672c\u5730\u4ed3\u5e93\u4e2d\uff0c\u800c\u6211\u4eec\u7684\u53d1\u5e03\u5305\u5e94\u8be5\u5305\u542b\u8fd9\u4e9b\u7b2c\u4e09\u65b9\u4f9d\u8d56\u7684\u3002<br\/><br\/>\n\u5047\u5b9a\uff0c\u6709\u4e00\u4e2a GoSSH \u00a0Maven \u5de5\u7a0b\uff0c\u8bbe\u5b9a\u7684\u7248\u672c\u662f 0.0.1\uff0c\u5b83\u4f9d\u8d56\u4e86 jsch-0.1.50, commons-cli-1.3-SNAPSHOT\uff0c\u60f3\u8981\u53d1\u5e03\u7684\u5305\u6709\u5982\u4e0b\u5e03\u5c40<br\/>\n<blockquote>\nGoSSH-0.0.1.jar<br \/>\nlib<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0jsch-0.1.50.jar<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0commons-cli-1.3-20140216.032825-101.jar \u00a0 \u00a0 #\u8fd9\u91cc\u7684 revision \u53f7\u662f\u968f SNAPSHOT \u52a8\u6001\u800c\u5b9a\u7684\n<\/blockquote>\n\u5e76\u4e14\u5728 GoSSH-0.0.1.jar \u4e2d\u7684 META-INF\/MANIFEST.MF \u6587\u4ef6\u4e2d\u6307\u5b9a\u4e86"},{"title":"JMockit \u4e00\u4e2a Expectations \u4e2d Mock \u591a\u4e2a\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/jmockit-expectations-mock-multi-methods\/","pubDate":"Mon, 03 Feb 2014 01:49:51 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-expectations-mock-multi-methods\/","description":"\n\u4ece JMockit \u7cfb\u5217\u7684\u5f00\u7bc7 <a title=\"JMockit \u4e4b Expectations\" href=\"https:\/\/yanbin.blog\/jmockit-with-expectations\" target=\"_blank\" rel=\"noopener\">JMockit \u4e4b Expectations<\/a> \u4e2d\u4e86\u89e3\u5230\u4e86\u4e00\u4e2a\u6700\u57fa\u672c\u7684 Mock \u7684\u5199\u6cd5\uff0c\u8fd9\u91cc\u8bb0\u5f55\u4e0b\u5728\u4e00\u4e2a Expectations \u4e2d\u5982\u4f55\u540c\u65f6 Mock \u591a\u4e2a\u65b9\u6cd5\u3002\u57fa\u672c\u6846\u67b6\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Expectations<\/span><span class=\"p\">(<\/span><span class=\"n\">MyService<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">ExternalService<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">MyService<\/span><span class=\"p\">.<\/span><span class=\"na\">prefix<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Welcome to website: &#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">ExternalService<\/span><span class=\"p\">.<\/span><span class=\"na\">suffix<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;http:\/\/unmi.cc&#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">9<\/span><span class=\"cl\"><span class=\"p\">};<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\nJava \u8bed\u6cd5\u544a\u8bc9\u6211\u4eec new Expectations(){{......}} \u7701\u7565\u53f7\u5904\u7684\u4ee3\u7801\u4f1a\u5728 Expectations \u533f\u540d\u7c7b\u5b9e\u4f8b\u521d\u59cb\u5316\u65f6\u88ab\u8c03\u7528\uff0c\u90a3\u4e48\u5176\u4e2d\u5bf9 result \u7684\u8d4b\u503c\u4fbf\u662f\u65b0\u521b\u5efa\u7684 Expectations \u533f\u540d\u7c7b\u5b9e\u4f8b\u7684 result \u7684\u5c5e\u6027\u503c\uff0c\u90a3\u4e24\u6b21\u7684 result \u8d4b\u503c\u96be\u9053\u4e0d\u662f\u4ee5\u6700\u540e\u4e00\u4e2a\u4e3a\u51c6\u5417\uff0c\u6709\u70b9\u6587\u7ae0\u4e86\u3002\u5148\u6765\u8dd1\u4e2a\u4f8b\u5b50\uff0c\u89c1\u8bc6\u4e00\u4e0b\u73b0\u8c61\uff0c\u7531\u4e09\u4e2a\u7c7b\u7ec4\u6210\uff0c\u5206\u522b\u662f\uff1a"},{"title":"JMockit Mock \u79c1\u6709\u65b9\u6cd5\u548c\u79c1\u6709\u5c5e\u6027","link":"https:\/\/yanbin.blog\/jmockit-mock-private-methods-fields\/","pubDate":"Mon, 03 Feb 2014 01:02:39 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-mock-private-methods-fields\/","description":"\n\u524d\u9762\u8bf4\u8fc7 JMockit \u56e0\u8eab\u5904\u524d\u7ebf\uff0c\u6240\u4ee5\u7b80\u76f4\u65e0\u4e0d\u53ef\uff0c\u672c\u8282\u4f8b\u5b50\u6f14\u793a JMockit \u600e\u4e48 Mock \u79c1\u6709\u65b9\u6cd5\u548c\u79c1\u6709\u5c5e\u6027\uff0c\u793a\u4f8b\u867d\u7136\u662f\u9759\u6001\u65b9\u6cd5\u548c\u5c5e\u6027\uff0c\u4f46\u56e0\u91c7\u7528\u7684\u662f\u53cd\u5c04\u624b\u6cd5\uff0c\u6240\u4ee5\u8fd9\u79cd\u00a0Deencapsulation \u7684 Mock \u624b\u6bb5\u540c\u6837\u9002\u7528\u4e8e\u516c\u6709\u7684\u65b9\u6cd5\u6216\u5c5e\u6027\uff0c\u65e0\u8bba\u662f\u5426\u9759\u6001\u3002<br\/>\n<br\/>\n\u672c\u6587\u6240\u7528 JMockit \u7248\u672c\u4e3a 1.6, \u53ef\u80fd\u7f51\u4e0a\u6240\u641c\u7d22\u7684\u65b9\u6cd5\u4e0e\u6b64\u6709\u6240\u4e0d\u540c\uff0c\u8bf7\u6ce8\u610f JMockit \u7248\u672c\u5dee\u5f02\u3002\u4ecd\u9700\u91cd\u590d\u4e00\u4e0b\uff0c\u8fd0\u884c JMockit \u7684\u4f8b\u5b50 classpath \u4e0a\u5fc5\u987b\u8ba9 jmockit.jar \u5728 junit.jar \u4e4b\u524d\uff0c\u6216\u7528 javaagent \u53c2\u6570\u6765\u52a0\u8f7d jmockit.jar\uff0c\u5e76\u4e14 junit \u8981 4.8 \u53ca\u4ee5\u4e0a\u7248\u672c.<br\/>\n<br\/>\n<span style=\"color: #0000ff;\"><strong>1. Mock \u79c1\u6709\u65b9\u6cd5(\u975e\u9759\u6001\u7c7b\u4f3c)<\/strong><\/span>"},{"title":"JMockit \u4e4b Expectations","link":"https:\/\/yanbin.blog\/jmockit-with-expectations\/","pubDate":"Thu, 30 Jan 2014 02:39:31 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jmockit-with-expectations\/","description":"\nTDD \u63a8\u6c42\u6d4b\u8bd5\u5148\u884c\uff0c\u4e0d\u5149\u5728\u81ea\u5df1\u4ee3\u7801\u672a\u5b9e\u73b0\u65f6\u53ef\u4ee5\u5148\u505a\u597d\u6d4b\u8bd5\uff0c\u5373\u4f7f\u5e73\u53f0\u4f9d\u8d56\u6216\u7b2c\u4e09\u65b9\u63a5\u53e3\u672a\u51c6\u5907\u597d\u6211\u4eec\u4e5f\u80fd\u5148\u884c\u4e00\u6b65\u7684\uff0c\u8fd9\u5c31\u8981\u5bf9\u63a5\u53e3\u4f9d\u8d56\u8fdb\u884c Mock\u3002\u540c\u65f6 Mock \u4e5f\u4f7f\u5f97\u6211\u4eec\u7684\u6d4b\u8bd5\u4ee3\u7801\u5728\u8fd0\u884c\u5f53\u4e2d\u4e0d\u81f3\u4e8e\u968f\u7740\u7b2c\u4e09\u65b9\u63a5\u53e3\u7684\u6ca6\u9677\u800c\u5760\u5165\u6df1\u6e0a\u3002<\/p>\n<br\/>\nJava \u4e2d Mock \u5de5\u5177\u4e5f\u4e0d\u5c11\uff0c\u50cf\u901a\u7528 <a href=\"http:\/\/easymock.org\/\" target=\"_blank\" rel=\"noopener\">EasyMock<\/a>, <a href=\"http:\/\/jmock.org\/\" target=\"_blank\" rel=\"noopener\">jMock<\/a>, <a href=\"http:\/\/code.google.com\/p\/mockito\" target=\"_blank\" rel=\"noopener\">Mockito<\/a>, <a href=\"http:\/\/www.unitils.org\/summary.html\" target=\"_blank\" rel=\"noopener\">Unitils Mock<\/a>, <a href=\"http:\/\/code.google.com\/p\/powermock\" target=\"_blank\" rel=\"noopener\">PowerMock<\/a>, \u518d\u6bd4\u5982\u504f\u4e13\u4e1a\u7684 HttpMock, StrutsMock \u7b49\u3002\u4f46 <a href=\"http:\/\/code.google.com\/p\/jmockit\" target=\"_blank\" rel=\"noopener\">JMock<\/a> \u4e0e\u524d\u9762\u5404\u4f4d\u76f8\u6bd4\u7b80\u76f4\u662f\u5168\u80fd\u9009\u624b\uff0c\u5bf9 final\/static\/native\/private \u65b9\u6cd5\u90fd\u80fd Mock\uff0c\u529f\u80fd\u4e0a\u8fd8\u8fdc\u4e0d\u6b62\u8fd9\u4e9b\u4e86\uff0c\u53ef\u4ee5\u770b\u770b\u4e00\u4e2a\u5bf9\u6bd4\u56fe <a href=\"https:\/\/code.google.com\/p\/jmockit\/wiki\/MockingToolkitComparisonMatrix\" target=\"_blank\" rel=\"noopener\">https:\/\/code.google.com\/p\/jmockit\/wiki\/MockingToolkitComparisonMatrix<\/a>\u3002<br\/><br\/>\nJMockit \u662f\u57fa\u4e8e Java5 \u7684 java.lang.instrument \u5305\u5f00\u53d1\u7684\uff0c\u6240\u4ee5\u5b83\u624d\u80fd\u593a\u5f97\u5148\u673a\uff0c\u4e5f\u53ef\u9677\u5f97\u66f4\u6df1\u3002\u81ea\u7136\u5b83\u8981\u6c42 JDK5 \u53ca\u4ee5\u4e0a\uff0cJUnit 4.8 \u53ca\u4ee5\u4e0a\u7248\u672c\u3002\u547d\u4ee4\u884c\u4e0b\u539f\u6765\u7528 -javaagent:\/...\/lib\/jmockit.jar \u52a0\u8f7d JMockit\uff0c\u73b0\u5728\u53d1\u73b0\u628a jmockit.jar \u653e\u5728 classpath \u4e0b\u5c31 OK \u7684\uff0c\u4f46\u662f\u5fc5\u987b\u653e\u5728 junit.jar \u5305\u4e4b\u524d\uff0c\u5426\u5219\u4f60\u4f1a\u770b\u5230\u8fd9\u4e2a <span style=\"color: #800000;\">java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath<\/span>\u3002 JMockit \u6709\u4e24\u79cd Mock \u65b9\u5f0f\uff1a<br\/><br\/>\n1. Behavior-oriented(Expectations &amp; Verifications)\u00a0 --- \u57fa\u4e8e\u4ee3\u7801\u6267\u884c\u884c\u4e3a\u7684\u6a21\u4eff\uff0c\u8c61\u9ed1\u76d2\u6d4b\u8bd5<br \/>\n2. State-oriented(MockUp&lt;GenericType&gt;)\u00a0\u00a0 --- \u4fb5\u5165\u7c7b\u5185\u90e8\uff0c\u968f\u610f\u6a21\u4eff\uff0c\u4f3c\u767d\u76d2\uff0c\u53ef\u4ee5\u8bf4\u662f\u80fd\u4e3a\u6240\u6b32\u4e3a<br\/><br\/>\n\u6b64\u7bc7\u4f53\u9a8c\u4e0b\u7b2c\u4e00\u79cd Mock \u65b9\u5f0f\uff0c\u5728\u6d4b\u8bd5\u4ee3\u7801\u4e2d\u6700\u76f4\u89c2\u5c31\u662f\u90a3\u4e2a <code>new Expectations(...){{result = some;}}<\/code>\uff0c\u4e0b\u9762\u6765\u770b\u4e2a\u5b9e\u9645\u7684\u4f8b\u5b50\u3002\u5e94\u7528\u573a\u666f\u662f"},{"title":"Ant \u63d0\u793a\u8f93\u5165\u5e76\u6839\u636e\u7528\u6237\u8f93\u5165\u6267\u884c\u4e0d\u540c\u7684\u4efb\u52a1","link":"https:\/\/yanbin.blog\/ant-prompt-input-call-different-task\/","pubDate":"Wed, 29 Jan 2014 02:18:27 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ant-prompt-input-call-different-task\/","description":"\n\u4f7f\u7528 Ant \u8fdb\u884c\u81ea\u52a8\u5316\u5904\u7406\u65f6\uff0c\u4e0d\u60f3\u8bb0\u4f4f\u6bcf\u4e00\u4e2a target\u00a0 \u7684\u540d\u79f0\uff0c\u800c\u662f\u8ba9\u9ed8\u8ba4\u7684 target \u5217\u51fa\u9700\u8981\u7684 target \u51fa\u6765\uff0c\u8ba9\u7528\u6237\u8f93\u5165\u540d\u79f0\u6216\u6570\u5b57\u9009\u62e9\u6267\u884c\u54ea\u4e2a target\u3002\u8fd9\u6837\u505a\u81ea\u7136\u662f\u591a\u4e86\u4e00\u6b65\uff0c\u6709\u65f6\u5019\u786e\u4e5f\u65b9\u4fbf\u4e0d\u5c11\uff0c\u4f46 Ant \u8fd8\u662f\u6709\u4e2a\u7f3a\u70b9\uff0c\u5b83\u4e0d\u80fd\u6301\u4e45\u6027\u7684\u4fdd\u6301\u5728 Ant \u63a7\u5236\u53f0\u4e0b\uff0c\u6301\u7eed\u7684\u8fdb\u884c\u7528\u6237\u4ea4\u4e92\u3002<\/p>\n<br\/>\n\u5bf9\u4e8e\u5b9e\u73b0 Ant \u7684\u7b80\u5355\u7528\u6237\u4ea4\u4e92\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e8e\u4e24\u4e2a Task\uff0c<a href=\"http:\/\/ant.apache.org\/manual\/Tasks\/input.html\" target=\"_blank\" rel=\"noopener\">input<\/a> \u548c <a href=\"http:\/\/ant.apache.org\/manual\/Tasks\/antcall.html\" target=\"_blank\" rel=\"noopener\">antcall<\/a>, input \u7528\u6765\u63d0\u793a\u7528\u6237\u8f93\u5165\u503c\uff0c\u518d\u6839\u636e input \u8bbe\u5b9a\u7684\u5c5e\u6027\u6765\u786e\u5b9a antcall \u8c03\u7528\u54ea\u4e2a target\u3002\u6267\u884c\u5b8c\u9000\u51fa\u5230\u7cfb\u7edf Shell \u4e0b\uff0c\u60f3\u8981\u518d\u6765\uff0c\u5c31\u518d\u6267\u884c\u4e00\u4e0b ant \u5427\uff0c\u6211\u4e5f\u53ea\u80fd\u505a\u5230\u8fd9\u4e00\u6b65\u4e86\u3002<br\/><br\/>\n\u770b\u4e0b\u9762\u7684\u4f8b\u5b50 build.xml \u5185\u5bb9"},{"title":"RESTful, \u8bf4\u8bf4 http \u7684 patch method","link":"https:\/\/yanbin.blog\/restful-http-patch-method\/","pubDate":"Thu, 12 Dec 2013 10:40:24 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/restful-http-patch-method\/","description":"\n\u6700\u65e9\u7684\u65f6\u5019\uff0c\u6211\u4eec\u53ea\u9700\u8981 GET \u548c POST \u65b9\u6cd5\uff0cPOST \u65b9\u6cd5\u7684\u5f15\u5165\u4e5f\u53ea\u662f\u4e3a\u4e86\u6d88\u9664 URL \u8fc7\u957f\uff0c\u53c2\u6570\u9690\u85cf\uff0c\u4e0a\u4f20\u6587\u4ef6\u7684\u95ee\u9898\uff0c\u5b8c\u5168\u548c\u8bed\u4e49\u65e0\u5173\u3002\u63a5\u89e6\u5230 RESTful \u4e4b\u540e\uff0c\u6211\u4eec\u5f00\u59cb\u601d\u8003 GET \u548c POST \u7684\u4e0d\u540c\u8bed\u4e49\uff0c\u5e76\u4e14\u5341\u5206\u5fc5\u8981\u7684\u53bb\u53d1\u6398\u51fa\u6240\u6709\u7684 HTTP method\uff0cHTTP\/1.1 \u6240\u5b9e\u73b0\u7684 method\uff0c\u89c1 <a href=\"http:\/\/www.ietf.org\/rfc\/rfc2616\" target=\"_blank\" rel=\"noopener\">RFC 2616<\/a>, \u6709\u8fd9\u4e9b\uff1a<\/p>\n<br\/>\nOPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT<br\/><br\/>\n\u89c4\u8303\u662f\u8fd9\u4e48\u5b9a\u4e49\u7684\uff0c\u8fd9\u8fd8\u8981\u770b\u5bb9\u5668\u5b9e\u73b0\u4e86\u591a\u5c11\uff0c\u6bd4\u5982 Tomcat 7 \u4e2d\u7684 <a href=\"https:\/\/tomcat.apache.org\/tomcat-7.0-doc\/servletapi\/javax\/servlet\/http\/HttpServlet.html\" target=\"_blank\" rel=\"noopener\">servlet api<\/a> \u5b9e\u73b0\u4e86<br\/><br\/>\ndoOptions, doGet, doHead, doPost, doPut, doDelete, doTrace \u5c31\u5dee\u4e2a doConnect \u4e86\u3002<br\/><br\/>\n\u800c\u6211\u4eec\u8fd9\u91cc\u8981\u8bf4\u7684 PATCH method \u662f\u5728 Servlet 3.0 \u548c\u5f53\u524d Tomcat 7 \u4e2d\u90fd\u63d0\u5230\u7684\uff0c\u4e5f\u5c31\u662f\u5c1a\u672a\u5b9e\u73b0\u5b83\u3002<br\/><br\/>\n\u8fd9\u4e5f\u96be\u602a\uff0cPATCH \u5728 2010 \u5e74\u4e09\u6708\u4efd\u624d\u6210\u4e3a\u6b63\u5f0f\u7684\u65b9\u6cd5\uff0c\u89c1 <a href=\"http:\/\/tools.ietf.org\/html\/rfc5789\" target=\"_blank\" rel=\"noopener\">RFC 5789<\/a>\u3002\u6ca1\u6709 PATCH \u7684\u65f6\u5019\u6211\u4eec\u8fdb\u884c\u66f4\u65b0\u7684\u64cd\u4f5c\u91c7\u7528\u7684\u662f PUT \u65b9\u6cd5\u3002\u90a3\u4e48 PATCH \u548c PUT \u6709\u4ec0\u4e48\u533a\u522b\u5462\uff1f<br\/><br\/>\n\u540c\u6837\u53ef\u4ee5\u4ece\u8bed\u4e49\u4e0a\u53bb\u7406\u89e3\uff0c\u6709\u4e24\u65b9\u9762\u7684\u5bf9\u6bd4\uff1a"},{"title":"CountDownLatch \u534f\u8c03\u7ebf\u7a0b","link":"https:\/\/yanbin.blog\/countdownlatch-threads\/","pubDate":"Sat, 19 Oct 2013 08:41:37 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/countdownlatch-threads\/","description":"\nJDK8 \u90fd\u5feb\u8981\u51fa\u6765\u4e86\uff0c\u5728 JDK 5 \u4e2d\u4ecd\u6709\u8bb8\u591a\u597d\u5b9d\u8d1d\u503c\u5f97\u53bb\u6316\u6398\u3002\u63d0\u5230 JDK5 \u6211\u4eec\u6216\u8bb8\u53ea\u77e5\u9053\u5b83\u7ed9\u4e86\u6211\u4eec\u6cdb\u578b\uff0c\u5176\u5b9e\u8fd8\u6709\u90a3\u4e2a\u5e76\u53d1\u5305 java.util.concurrent \u5374\u4e0d\u90a3\u4e48\u5f15\u4eba\u6ce8\u76ee\uff0c\u5176\u5b9e\u5c31\u662f NIO\u3002<br\/>\n<br\/>\n\u82e5\u662f\u5e76\u53d1\u5305\u662f\u5728\u67d0\u4e2a JDK \u7248\u672c\u4e2d\u5355\u72ec\u5949\u4e0a\uff0c\u53cd\u54cd\u5c31\u4e0d\u540c\u4e86\uff0c\u60f3\u60f3 JDK 6 \u4f3c\u4e4e\u672a\u5e26\u6765\u591a\u5c11\u6539\u53d8--\u81f3\u5c11\u5bf9\u4e8e\u7f16\u7a0b\u8005\u6765\u8bf4\u6ca1\u6709\u660e\u663e\u611f\u53d7\u3002java.util.concurrent \u5305\u4e2d\u7684\u4e1c\u897f\u5bf9\u4e8e\u6211\u4eec\u5904\u7406\u7ebf\u7a0b\u5e26\u6765\u4e86\u5f88\u5927\u7684\u4fbf\u5229\uff0c\u4f8b\u5982\u7ebf\u7a0b\u6c60\uff0c\u7ebf\u7a0b\u540c\u6b65\uff0cFuture, Callable \u7b49\u3002<br\/>\n<br\/>\n\u8fd9\u91cc\u6211\u8bb0\u5f55\u4e00\u4e0b CountDownLatch \u7684\u4f7f\u7528\uff0c\u5728\u6b64\u4e4b\u524d\u5728\u5904\u7406<br\/>\n<br\/>\n\u7ebf\u7a0b A \u7b49\u5f85\u7ebf\u7a0b B\uff0cC\uff0cD \u5168\u90e8\u6267\u884c\u5b8c\u540e\u624d\u7ee7\u7eed\u6267\u884c \uff08\u6bd4\u5982\u8981\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u8bbf\u95ee\u4e00\u4e2a Web \u670d\u52a1\uff0c\u7b49\u6240\u6709\u7684\u8bf7\u6c42\u54cd\u5e94\u6210\u529f\u540e\u8fdb\u884c\u7ed3\u679c\u5904\u7406\uff09<br\/>\n<br\/>\n\u8fd9\u6837\u573a\u666f\u7684\u65f6\u5019\uff0c\u6211\u4e00\u822c\u80fd\u60f3\u5230\u7684\u529e\u6cd5\u662f\uff0c\u521d\u59cb\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u7ebf\u7a0b B\uff0cC\uff0cD \u5404\u81ea\u521d\u59cb\u5316\u7684\u65f6\u5019\uff0c\u8ba1\u6570\u5668\u52a0\u4e00\uff0c\u7136\u540e A \u7ebf\u7a0b\u7b49\u5f85\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u6267\u884c\u5b8c\u540e\u8ba1\u6570\u5668\u51cf\u4e00\uff0c\u5f53\u8ba1\u6570\u5668\u4e3a 0 \u65f6\u8868\u660e\u6240\u6709\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\uff0c\u5c31\u901a\u77e5 A \u53ef\u4ee5\u5f00\u59cb\u8fd0\u4f5c\u8d77\u6765\u3002\u4f46\u8fd9\u6837\u7684\u65b9\u6848\u8fd8\u662f\u5f97\u5c0f\u5fc3\u7684\u5904\u7406\u597d\u540c\u6b65\u7684\u95ee\u9898\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u65b9\u6cd5\u5f15\u7528","link":"https:\/\/yanbin.blog\/jdk8-lambda-method-references\/","pubDate":"Thu, 17 Oct 2013 08:15:52 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-method-references\/","description":"\nLambda \u5141\u8bb8\u6211\u4eec\u5b9a\u4e49\u533f\u540d\u65b9\u6cd5(\u5373\u90a3\u4e2a Lambda \u8868\u8fbe\u5f0f\uff0c\u6216\u53eb\u95ed\u5305)\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u5982\u679c\u4f60\u4e0d\u60f3\u628a\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\u5199\u5f97\u8fc7\u5927\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u628a\u8868\u8fbe\u5f0f\u7684\u5185\u5bb9\u5206\u79bb\u51fa\u6765\u5199\u5728\u4e00\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u7136\u540e\u5728\u653e\u7f6e Lambda \u8868\u8fbe\u5f0f\u7684\u4f4d\u7f6e\u4e0a\u586b\u4e0a\u5bf9\u90a3\u4e2a\u65b9\u6cd5\u7684\u5f15\u7528\u3002<\/p>\n<br\/>\n\u65b9\u6cd5\u5f15\u7528\u4e5f\u5e94\u770b\u4f5c\u662f\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\uff0c\u6240\u4ee5\u5b83\u4e5f\u9700\u8981\u4e00\u4e2a\u660e\u786e\u7684\u76ee\u6807\u7c7b\u578b\u5145\u5f53\u529f\u80fd\u6027\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u7b80\u5355\u8bf4\u5c31\u662f\u88ab\u5f15\u7528\u7684\u65b9\u6cd5\u8981\u4e0e\u529f\u80fd\u63a5\u53e3\u7684 SAM(Single Abstract Method) \u53c2\u6570\u3001\u8fd4\u56de\u7c7b\u578b\u76f8\u5339\u914d\u3002\u65b9\u6cd5\u5f15\u7528\u7684\u5f15\u5165\u907f\u514d\u4e86 Lambda \u5199\u590d\u6742\u4e86\u53ef\u8bfb\u6027\u7684\u95ee\u9898\uff0c\u4e5f\u4f7f\u5f97\u903b\u8f91\u66f4\u6e05\u6670\u3002<br\/><br\/>\n\u4e3a\u4e86\u5e94\u5bf9\u65b9\u6cd5\u5f15\u7528\u8fd9\u4e00\u6982\u5ff5\uff0c JDK8 \u53c8\u91cd\u65b0\u501f\u7528\u4e86 C++ \u7684\u90a3\u4e2a \u201c::\u201d \u57df\u64cd\u4f5c\u7b26\uff0c\u5168\u79f0\u4e3a\u4f5c\u7528\u57df\u89e3\u6790\u64cd\u4f5c\u7b26\u3002<br\/><br\/>\n\u4e0a\u9762\u7684\u8868\u8ff0\u4e5f\u8bb8\u4e0d\u597d\u660e\u767d\uff0c\u6211\u770b\u5b98\u65b9\u7684\u90a3\u4efd State of the Lambda \u4e5f\u89c9\u5f97\u4e0d\u600e\u4e48\u5bb9\u6613\u7406\u89e3\uff0c\u7279\u522b\u662f\u5b83\u4e3e\u4e86\u90a3\u4e2a\u4f8b\u5b50\u5f88\u96be\u8ba9\u4eba\u671b\u6587\u751f\u610f\u3002\u6211\u7528\u4e2a\u81ea\u5df1\u5199\u7684\u4f8b\u5b50\u6765\u8bf4\u660e\u4e00\u4e0b\u5427\u3002<br\/><br\/>\n\u76ee\u524d\u7684 Eclipse-JDK8 \u7248\u8fd8\u4e0d\u80fd\u652f\u6301\u65b9\u6cd5\u5f15\u7528\u7684\u7279\u6027\uff0c\u5e78\u597d\u5c31\u662f\u5728\u6628\u5929\u6b63\u5f0f\u7248\u7684 NetBeans IDE 7.4 \u5bf9 JDK8 \u6709\u4e86\u8f83\u597d\u7684\u652f\u6301\uff0c\u6240\u4ee5\u5728 NetBeans 7.4 \u4e2d\u5199\u6d4b\u8bd5\u4ee3\u7801\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u8bcd\u6cd5\u8303\u56f4\u548c\u53d8\u91cf\u6355\u83b7","link":"https:\/\/yanbin.blog\/jdk8-lambda-lexical-scoping-variable-capture\/","pubDate":"Wed, 16 Oct 2013 08:35:23 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-lexical-scoping-variable-capture\/","description":"\nLambda \u8868\u8fbe\u5f0f\u7684\u8bcd\u6cd5\u8303\u56f4\uff0c\u4e00\u8a00\u4ee5\u853d\u4e4b\u5c31\u662f\u6ca1\u6709\u5f15\u5165\u65b0\u7684\u8bcd\u6cd5\u8303\u56f4\u3002\u8fd9\u91cc\u7684\u8bcd\u6cd5\u8303\u56f4\u8981\u7814\u7a76\u7684\u8bfe\u9898\u662f this \u7684\u6307\u5411\u6709\u6ca1\u6709\u5728\u53d8\u3002\u6211\u4eec\u77e5\u9053\u5728\u533f\u540d\u7c7b\u5185\u90e8 this \u6307\u5411\u7684\u533f\u540d\u7c7b\u7684\u5b9e\u4f8b\uff0c\u8fd9\u79cd\u5173\u7cfb\u662f\u5728\u7f16\u8bd1\u671f\u5c31\u786e\u5b9a\u7684\u3002\u800c\u5728 Lambda \u8868\u8fbe\u5f0f\u4e2d\u7684 this \u4e0e\u5916\u90e8\u7684 this \u6ca1\u6709\u5dee\u522b\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u53ef\u4ee5\u628a Lambda \u8868\u8fbe\u5f0f\u5f53\u6210\u4e00\u822c\u7684\u8bed\u53e5\u6765\u770b\u5f85\uff0c\u591a\u7b80\u5355\u554a\uff0c\u4e0d\u50cf JavaScript \u4e2d\u7684 this \u88ab\u641e\u7684\u90a3\u4e48\u9b54\u5e7b\u3002<\/p>\n<br\/>\n\u53ef\u4ee5\u8fd9\u4e48\u6d4b\u8bd5\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">(){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">).<\/span><span class=\"na\">forEach<\/span><span class=\"p\">((<\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8f93\u51fa\u7684\u662f\u540c\u4e00\u4e2a\u5730\u5740\u91cc\u7684\u4e1c\u897f\uff1a<br\/><br\/>\n<span style=\"color: #800000;\">cc.unmi.testjdk8.TestLambda@28a418fc<\/span><br \/>\n<span style=\"color: #800000;\">cc.unmi.testjdk8.TestLambda@28a418fc<\/span><br\/><br\/>\n\u63a5\u4e0b\u6765\u77a7\u77a7 Lambda \u8868\u8fbe\u5f0f\u5bf9\u5916\u5c42\u53d8\u91cf\u7684\u6355\u83b7\u3002Lambda \u8868\u8fbe\u5f0f\u7684\u6709\u4e2a\u597d\u5904\u5c31\u662f\u5b83\u662f\u8f7b\u91cf\u7ea7\uff0c\u53ef\u91cd\u7528\u5355\u5143\uff0c\u5e76\u4e14\u53ef\u6355\u83b7\u5916\u5c42\u53d8\u91cf\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u7c7b\u578b\u63a8\u65ad","link":"https:\/\/yanbin.blog\/jdk8-lambda-4-type-inference\/","pubDate":"Tue, 15 Oct 2013 09:00:43 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-4-type-inference\/","description":"\n\u73b0\u5728\u6211\u4eec\u6765\u770b\u770b JDK8 \u662f\u600e\u4e48\u5bf9 Lambda \u8868\u8fbe\u5f0f\u8fdb\u884c\u7c7b\u578b\u63a8\u65ad\u7684\uff0cLambda \u7684\u5b9e\u9645\u7c7b\u578b\u53eb\u505a\u5b83\u7684\u76ee\u6807\u7c7b\u578b(target type)\uff0c\u56e0\u4e3a JDK8 \u6cbf\u627f\u4e86\u5df2\u6709\u7684\u7c7b\u578b\u7cfb\u7edf\uff0c\u6240\u4ee5\u8c61\u8fd9\u6837\u7684\u5199\u6cd5\uff1a<br\/>\n<br\/>\n<span style=\"color: #800000;\">button.addActionListener(<span style=\"color: #0000ff;\">(ActionEvent e) -&gt; foo()<\/span>);<\/span><br\/>\n<br\/>\naddActionListener() \u65b9\u6cd5\u63a5\u6536\u7684\u662f\u4e00\u4e2a ActionListener \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u6240\u4ee5\u8fd9\u91cc\u7684 Lambda \u8868\u8fbe\u5f0f<span style=\"color: #800000;\"> (ActionEvent e) -&gt; foo()<\/span> \u4ee3\u8868\u7684\u5c31\u662f\u4e00\u4e2a ActionListener \u5b9e\u4f8b\uff0c\u7f16\u8bd1\u5668\u662f\u600e\u4e48\u77e5\u9053\u8fd9\u4e00\u70b9\u7684\uff0c\u800c\u4e14\u76f8\u540c\u7684 Lambda \u662f\u53ef\u4ee5\u8868\u793a\u4e0d\u540c\u7684\u7c7b\u578b\u7684\uff0c\u89c1\uff1a<br\/>\n<br\/>\n<span style=\"color: #800000;\">Callable&lt;String&gt; c = <span style=\"color: #0000ff;\">() -&gt; \"done\"<\/span>;<\/span>&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #800000;\">\/\/\u8fd9\u4e2a () -&gt; \"done\" \u662f Callable&lt;String&gt; \u7c7b\u578b<\/span><br\/>\n<span style=\"color: #800000;\">PrivilegedAction&lt;String&gt; a = <span style=\"color: #0000ff;\">() -&gt; \"done\"<\/span>;&nbsp; \/\/\u540c\u6837\u7684 () -&gt; \"done\" \u5374\u662f PrivilegedAction&lt;String&gt; \u7c7b\u578b<\/span><br\/>\n<br\/>\n\u7b54\u66f0\uff0c\u6839\u636e Lambda \u8868\u8fbe\u5f0f\u6240\u5904\u7684\u4e0a\u4e0b\u6587\u53bb\u611f\u77e5\u3002\u4e0a\u4e0b\u6587\u51b3\u5b9a\u4e86 Lambda \u6240\u671f\u76fc\u7684\u7c7b\u578b\uff0c\u6bd4\u5982\u8bf4\u53d8\u91cf\u58f0\u660e\u7c7b\u578b\uff0c\u65b9\u6cd5\u8981\u6c42\u7684\u8f93\u5165\u53c2\u6570\u7c7b\u578b\uff0c\u6240\u4ee5\u5b83\u5fc5\u987b\u662f\u660e\u786e\uff0c\u4e0d\u80fd\u6a21\u68f1\u4e24\u53ef\u3002\u6240\u4ee5\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\u80fd\u5426\u653e\u5728\u67d0\u5904\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u51e0\u4e2a\u6761\u4ef6\uff1a<br\/>\n<ol>\n<li><span style=\"color: #ff0000;\"><strong>\u671f\u76fc\u7684\u7c7b\u578b\u5fc5\u987b\u662f\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\uff0c\u8fd9\u6837\u5c31\u80fd\u552f\u4e00\u5b9a\u4f4d\u5230\u90a3\u4e2a\u62bd\u8c61\u65b9\u6cd5\u4e0a\u53bb\uff0c\u786e\u5b9a\u65b9\u6cd5\u7b7e\u540d<\/strong><\/span>\uff0c\u63a5\u4e0b\u6765\u5c31\u662f"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5b9e\u73b0\u539f\u7406\u521d\u63a2","link":"https:\/\/yanbin.blog\/jdk8-lambda-3-inside\/","pubDate":"Sun, 13 Oct 2013 08:28:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-3-inside\/","description":"\nJDK8 \u4f7f\u7528\u4e00\u884c Lambda \u8868\u8fbe\u5f0f\u53ef\u4ee5\u4ee3\u66ff\u5148\u524d\u7528\u533f\u540d\u7c7b\u4e94\u516d\u884c\u4ee3\u7801\u6240\u505a\u7684\u4e8b\u60c5\uff0c\u90a3\u4e48\u5b83\u662f\u600e\u4e48\u5b9e\u73b0\u7684\u5462\uff1f\u4ece\u6240\u5468\u77e5\uff0c\u533f\u540d\u7c7b\u4f1a\u5728\u7f16\u8bd1\u7684\u65f6\u5019\u751f\u6210\u4e0e\u5bbf\u4e3b\u7c7b\u5e26\u4e0a $1, $2 \u7684\u7c7b\u6587\u4ef6\uff0c\u5982\u5199\u5728 TestLambda \u4e2d\u7684\u533f\u540d\u7c7b\u4ea7\u751f\u6210\u7c7b\u6587\u4ef6\u662f TestLambda$1.class, TestLambda$2.class \u7b49\u3002<\/p>\n<br\/>\n\u6211\u8bd5\u9a8c\u4e86\u4e00\u4e0b\uff0c\u5982\u679c\u4f7f\u7528\u7684\u662f Lambda \u8868\u8fbe\u5f0f\u5e76\u4e0d\u4f1a\u751f\u6210\u989d\u5916\u7684\u7c7b\u6587\u4ef6\uff0c\u90a3\u4e48\u5b57\u8282\u7801\u91cc\u662f\u4ec0\u4e48\u6837\u5b50\u7684\uff1f\u6765\u770b\u4e0b\u7528\u00a0 javap -c \u53cd\u7f16\u8bd1\u51fa\u4e0b\u9762\u6587\u4ef6\u4ea7\u751f\u7684 TestLambda.class\uff0c\u4e24\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u662f\u00a0 byAnonymousClass() \u4f7f\u7528\u533f\u540d\u7c7b\uff0c\u53e6\u4e00\u4e2a\u662f byLambda \u4f7f\u7528 Lambda \u7684\u65b9\u5f0f\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi.testjdk8<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.awt.event.ActionEvent<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.awt.event.ActionListener<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">javax.swing.JButton<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">TestLambda<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">JButton<\/span><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">JButton<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">byLambda<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"p\">.<\/span><span class=\"na\">addActionListener<\/span><span class=\"p\">((<\/span><span class=\"n\">ActionEvent<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&amp;<\/span><span class=\"n\">gt<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Lambda&#34;<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">byAnonymousClass<\/span><span class=\"p\">(){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"p\">.<\/span><span class=\"na\">addActionListener<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ActionListener<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Override<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">actionPerformed<\/span><span class=\"p\">(<\/span><span class=\"n\">ActionEvent<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Anonymous class&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"JDK 8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5199\u6cd5","link":"https:\/\/yanbin.blog\/jdk-8-lambda-2-expression\/","pubDate":"Sat, 12 Oct 2013 11:00:53 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-8-lambda-2-expression\/","description":"\n\u8fc7\u53bb\uff0c\u6211\u4eec\u4f7f\u7528\u533f\u540d\u7c7b\u7684\u5b9e\u73b0\u50cf\u00a0 ActionListener \u8fd9\u6837\u7684\u63a5\u53e3\uff0c\u5373\u4f7f\u6700\u7b80\u5355\u7684\u60c5\u666f\u90fd\u9700\u8981\u5199\u4e0a\u4e94\u516d\u884c\u4ee3\u7801\uff0c\u8fd9\u5c31\u663e\u5f97\u6709\u4e9b\u7d2f\u8d58\u4e86\u3002\u56e0\u4e3a\u5176\u5b9e\u6211\u4eec\u5728 new ActionListener {} \u65f6\u5c31\u662f\u5728\u521b\u5efa\u4e00\u4e2a ActionListener \u5b50\u7c7b\u578b\uff0c\u91cd\u8f7d\u4e86\u65b9\u6cd5\uff0c\u5e76\u521d\u59cb\u5316\u4e00\u4e2a\u5b9e\u4f8b\u51fa\u6765\u3002\u73b0\u5728\u6211\u4eec\u624b\u4e0a\u6709\u4e86 Lambda \u8868\u8fbe\u5f0f\u8fd9\u4e00\u6b66\u5668\u7684\u8bdd\uff0c\u5c31\u53d8\u5f97\u7b80\u5355\u660e\u4e86\u4e86\uff0c\u6240\u4ee5\u8bf4\u00a0 Lambda \u662f\u4e00\u79cd\u8f7b\u91cf\u7ea7\u7684\u5b9e\u73b0\u673a\u5236\u3002<\/p>\n<br\/>\n\u8fd9\u91cc\u662f\u51e0\u4e2a Lambda \u8868\u8fbe\u5f0f\u7684\u6837\u5b50\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">y<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">y<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u4e24\u6574\u5f62\u53c2\u6570\uff0c\u8fd4\u56de\u5b83\u4eec\u7684\u548c<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">42<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u65e0\u53c2\u6570\uff0c\u76f4\u63a5\u8fd4\u56de 42<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">100<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u53ef\u63a8\u65ad\u51fa\u53c2\u6570 x \u7684\u7c7b\u578b<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u4f20\u5165\u4e00\u4e2a\u5b57\u7b26<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">\u53ea\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">\u65e0\u8fd4\u56de\u503c<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\nLambda \u7684\u683c\u5f0f\u5c31\u662f\u4e09\u90e8\u5206\uff1a\u53c2\u6570\u5217\u8868\uff0c-&gt; \u5206\u9694\u7b26\uff0c\u6267\u884c\u4f53\u3002\u5176\u4ed6\u8bed\u65b9\u7684 Lambda \u683c\u5f0f\u90fd\u8fd9\u6837\u7684\uff0c\u53ef\u80fd\u5c31\u662f\u5206\u9694\u7b26\u4e0d\u4e00\u6837\uff0c\u5982 Ruby \u7684 |\uff0cScala \u7684 =&gt; \u7b49\u3002<br\/><br\/>\n\u6267\u884c\u4f53\u91cc\u7684 return \u53ea\u662f\u6807\u660e\u8fd4\u56de\u5230\u533f\u540d\u65b9\u6cd5\u7684\u8c03\u7528\u8005\uff0c\u4e0d\u662f\u8fd4\u56de\u503c\u7684\u610f\u601d\uff1b \u6700\u4e0a\u5c42\u662f\u4e0d\u80fd\u7528 break \u548c continue \u5173\u952e\u5b57\u7684\uff0c\u53ef\u7528\u5728\u5faa\u73af\u4e2d\uff1b \u5982\u679c Lambda \u8868\u8fbe\u5f0f\u6709\u8fd4\u56de\u503c\uff0c\u90a3\u4e48\u5728\u6bcf\u4e00\u6761\u8def\u5f84\u4e0a\u90fd\u8981\u6709\u8fd4\u56de\u503c\u6216\u662f\u629b\u51fa\u5f02\u5e38\u3002\u8def\u5f84\u4e0a\u6700\u540e\u4e00\u6761\u8bed\u53e5\u7684\u8fd4\u56de\u503c\u5373\u4e3a Lambda \u8868\u8fbe\u7684\u8fd4\u56de\u503c\u3002"},{"title":"JDK 8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5e94\u7528\u80cc\u666f","link":"https:\/\/yanbin.blog\/jdk-8-lambda-1-background\/","pubDate":"Fri, 11 Oct 2013 11:00:15 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-8-lambda-1-background\/","description":"\n\u5373\u5c06\u5230\u6765\u7684 JDK8 \u6700\u4e3a\u5f15\u4eba\u5165\u80dc\u4e4b\u5904\u975e Lambda \u8868\u8fbe\u5f0f\u83ab\u6570\u4e86\uff0c\u8fd9\u5728\u5176\u4ed6\u52a8\u6001\u8bed\u65b9\uff0c\u5982 Ruby, Groovy, Scala \u7b49\u8bed\u8a00\u4e2d\u65e9\u5df2\u5927\u884c\u5176\u9053\u3002\u4e00\u65e6 JDK \u642d\u4e0a\u4e86 Lambda \u8fd9\u8d9f\u8f66\uff0c\u4ece\u6b64\u64cd\u4f5c\u4e8b\u4ef6\uff0c\u7ebf\u7a0b\uff0c\u5904\u7406\u96c6\u5408\u65f6\u53c8\u5927\u4e3a\u65b9\u4fbf\u4e86\u3002\u5173\u4e8e\u73b0\u9636\u6bb5\u5982\u4f55\u4f53\u9a8c JDK8 \u7684\u7279\u6027\u53ef\u4ee5\u53c2\u8003\n<a title=\"\u62a2\u9c9c\u8bbe\u7f6e JDK8 \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u5370\u8c61\" href=\"https:\/\/yanbin.blog\/setting-jdk8-programming-environment\" target=\"_blank\">\u62a2\u9c9c\u8bbe\u7f6e JDK8 \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u5370\u8c61<\/a>\u3002<br\/>\n<br\/>\n\u672c\u6587\u4e3b\u8981\u53c2\u8003\u4e8e\u5b98\u65b9\u7684 <a href=\"http:\/\/cr.openjdk.java.net\/~briangoetz\/lambda\/lambda-state-final.html\" target=\"_blank\">State of the Lambda<\/a>\uff0c\u5e76\u5bf9\u6e90\u7801\u6216\u53cd\u7f16\u8bd1\u51fa\u5b57\u8282\u7801\uff0c\u4f5c\u4e00\u5b9a\u7684\u6df1\u5165\u4ee5\u52a9\u4e8e\u5404\u4f4d\u7406\u89e3\uff0c\u5728 JVM \u4e2d\u662f\u5982\u4f55\u5b9e\u73b0 Lambda \u7684\u3002<br\/>\n<br\/>\nLambda \u8868\u8fbe\u5f0f\uff0c\u53c8\u79f0\u95ed\u5305(Closure)\uff0c\u6216\u79f0\u533f\u540d\u65b9\u6cd5(anonymous method)\u3002\u8fd9\u5728\u5176\u4ed6\u8bed\u8a00\u4e2d\uff0c\u5982 Ruby, Groovy, Scala, JavaScript \u7b49\uff0c\u751a\u81f3\u662f\u5728 C# \u4e2d\u8fd0\u7528\u5f97\u5982\u706b\u7eaf\u6e05\u7684\u7279\u6027\uff0cJDK8 \u8fd9\u624d\u95ee\u5019\u4ed6\uff0c\u771f\u6709\u4e9b\u665a\u4e86\u3002\u6ca1\u6709&nbsp;Lambda \u65f6\uff0cJava \u4e0d\u5f97\u4e0d\u6c42\u52a9\u4e8e\u533f\u540d\u7c7b\u7684\u56de\u8c03\u65b9\u6cd5\u6765\u8fbe\u5230\u76f8\u4f3c\u7684\u76ee\u7684\uff0c\u4e3a\u4e86\u6355\u83b7\u5916\u90e8\u53d8\u91cf\uff0c\u53d8\u91cf\u5fc5\u987b\u58f0\u660e\u4e3a final\u3002<br\/>\n<br\/>\n\u4e00\u89c1\u5230&nbsp;Lambda\uff0c\u7b2c\u4e00\u4e2a\u53cd\u5e94\u5c31\u662f&nbsp;Lambda \u8868\u8fbe\u5f0f(\u5c40\u90e8\u800c\u5df2)\uff0c\u5176\u5b9e\u6211\u4eec\u8fd9\u91cc\u8981\u8bf4\u7684 JDK8 \u7684&nbsp;Lambda \u5305\u542b\u4ee5\u4e0b\u51e0\u5757\u5185\u5bb9\uff1a<br\/>\n<ol>\n<li>Lambda \u8868\u8fbe\u5f0f\uff0c\u4fd7\u79f0\u95ed\u5305\u6216\u533f\u540d\u65b9\u6cd5<\/li>\n<li>\u65b9\u6cd5\u548c\u6784\u9020\u5668\u5f15\u7528<\/li>\n<li>\u6269\u5145\u7684\u76ee\u6807\u7c7b\u578b\u548c\u66f4\u5f3a\u7684\u7c7b\u578b\u63a8\u65ad<\/li>\n<li>\u63a5\u53e3\u4e2d\u7684\u9ed8\u8ba4\u9759\u6001\u65b9\u6cd5<\/li>\n<\/ol>\nLambda \u8fd9\u4e00\u7279\u6027\u4f7f\u5f97 Java \u4e5f\u5f00\u59cb\u5411\u51fd\u6570\u5f0f\u7f16\u7a0b\u503e\u659c\uff0c\u5173\u952e\u662f\u80fd\u66f4\u6709\u6548\u7684\u5e94\u5bf9\u5e76\u53d1\u73af\u5883\u3002<br\/>\n<br\/>\n\u8bf4\u5230&nbsp;Lambda\uff0c\u6211\u4eec\u4e0d\u5f97\u4e0d\u4e86\u89e3\u4e00\u4e0b\u5f53\u524d\u80cc\u666f\uff0c\u4f8b\u5982\u4e0b\u9762\u4e00\u4e2a\u5178\u578b\u7684\u4e8b\u4ef6\u5904\u7406\u573a\u666f\uff1a"},{"title":"JDK 7 \u4ee3\u7801\u4e2d\u5bf9\u6355\u83b7\u518d\u629b\u51fa\u5f02\u5e38\u65f6\u7684\u5904\u7406--\u5373\u5f02\u5e38\u7c7b\u578b\u63a8\u65ad","link":"https:\/\/yanbin.blog\/jdk7-rethrow-exception\/","pubDate":"Fri, 04 Oct 2013 10:13:24 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk7-rethrow-exception\/","description":"\nJDK \u53d1\u5c55\u8fc7\u7a0b\u4e2d\uff0c\u7b2c\u4e00\u6b21\u53d8\u5316\u6700\u5927\u6570 JDK1.5\uff0c\u52a0\u5165\u4e86\u53d8\u957f\u53c2\u6570\uff0c\u6cdb\u578b\u3002\u6cdb\u578b\u7684\u6700\u5927\u7684\u53d7\u76ca\u8005\u662f\u96c6\u5408\u3002JDK7 \u867d\u8bf4\u5f15\u8fdb\u4e86\u540c\u65f6\u6355\u83b7\u591a\u4e2a\u5f02\u5e38(Multi-Catch)\uff0c\u66f4\u806a\u660e\u4e00\u70b9\u7c7b\u578b\u63a8\u65ad\uff0c\u8d44\u6e90\u7684\u91ca\u653e\u7b49\uff0c\u4f46\u6211\u89c9\u5f97\u53d8\u5316\u8fd8\u4e0d\u5927\u3002\u63a5\u4e0b\u6765\u4f17\u4eba\u671f\u671b\u7684 JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f\u624d\u662f\u6fc0\u52a8\u4eba\u5fc3\u7684\uff0c\u6050\u6015\u8fd9\u4e00\u7279\u6027\u7684\u5927\u8d62\u5bb6\u4ecd\u662f\u96c6\u5408\u3002<\/p>\n<br\/>\n\u8fd9\u6837 JDK \u624d\u4e0d\u81f3\u4e8e\u79bb C# \u592a\u8fdc\uff0c\u7eaf\u7cb9\u8bed\u8a00\u4e0a\u8bb2\uff0c\u6211\u66f4\u666f\u4ef0 C#\uff0c\u6bd4\u5982\u5b83\u7684\u533f\u540d\u7c7b\u578b\uff0c\u66f4\u4e0d\u8bba\u4eba\u5bb6\u7684 Lambda \u4e86\u3002<br\/><br\/>\n<span style=\"font-family: Menlo;\"> var person = new { Name = \"Unmi\", Website = \"http:\/\/unmi.cc\" };<br \/>\nConsole.WriteLine(person.Name);<\/span><br\/><br\/>\n\u8fd9\u8981\u5230 Scala \u4e2d\u624d\u80fd\u89c1\u5230\u8fd9\u79cd\u5f71\u5b50\u3002<br\/>\n<blockquote>\n\u6ce8: JDK \u4ece 1.5 \u8d77\u5c31\u52a0\u5165\u4e86\u8c61 Chrome, Firefox \u90a3\u6837\u7684\u7248\u672c\u515a\u4e86\uff0c\u6240\u4ee5\u8fd9\u4e2a\u7248\u672c\u4e5f\u53eb\u505a JDK5\uff0c\u4e0d\u7ba1\u662f\u540e\u6765\u7684 JDK6, JDK7 \u7b49\u7b49\uff0c\u5176\u5b9e\u5728\u547d\u4ee4\u884c\u4e0b java -version \u663e\u793a\u51fa\u6765\u7684\u4e5f\u8fd8\u662f 1.5.0, 1.7.0_40 \u8fd9\u79cd\u7406\u667a\u7684\u7248\u672c\u53f7\u7684\u3002\n<\/blockquote>\n\u56de\u8fc7\u795e\u6765\uff0c\u6211\u4eec\u8981\u8bf4\u7684\u662f JDK7 \u5bf9\u5f02\u5e38\u7684\u5904\u7406\uff0c\u4e0d\u8bb2\u540c\u65f6\u6355\u83b7\u591a\u4e2a\u5f02\u5e38\u548c try-with-resource \u7684\u5904\u7406\uff0c\u800c\u8981\u8bf4\u7684\u662f\u6355\u83b7\u5f02\u5e38\u518d\u6b21\u629b\u51fa\u65f6\u8fdb\u6b65\uff0c\u8fd9\u5728\u67d0\u65b9\u9762\u5f97\u76ca\u4e8e JDK7 \u7c7b\u578b\u63a8\u65ad\u3002JDK7 \u7c7b\u578b\u63a8\u65ad\u5bf9\u4e8e\u6cdb\u578b\u6765\u8bf4\uff0c\u5b83\u53ef\u4ee5\u4e0d\u7528\u8fd9\u4e48\u5199"},{"title":"\u62a2\u9c9c\u8bbe\u7f6e JDK8 \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u5370\u8c61","link":"https:\/\/yanbin.blog\/setting-jdk8-programming-environment\/","pubDate":"Wed, 18 Sep 2013 11:14:27 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/setting-jdk8-programming-environment\/","description":"\n\u548c JDK7 \u8fd8\u6ca1\u6709\u70ed\u548c\uff0c\u5374\u5f00\u59cb\u5173\u6ce8 JDK8 \u8d77\u6765\u4e86\uff0cJDK8 \u5df2\u8fdb\u884c\u5230\u4e86 M8 \u5f00\u53d1\u9884\u89c8\u7248\u4e86\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u4e00\u4e2a\u5343\u547c\u4e07\u5524\u7684\u529f\u80fd\uff0c\u5373 <a href=\"http:\/\/openjdk.java.net\/projects\/lambda\/\" target=\"_blank\" rel=\"noopener\">Lambda \u95ed\u5305<\/a>\u7684\u652f\u6301\u3002\u5728\u5f53\u524d\u6709\u5bf9\u95ed\u5305\u7279\u6027\u7684\u8bc9\u6c42\uff0c\u800c Java \u672c\u8eab\u4e0d\u63d0\u4f9b\u65f6\uff0c\u6211\u4eec\u4e0d\u5f97\u4e0d\u8f6c\u800c\u6c42\u52a9\u4e8e JVM \u4e0a\u7684\u5176\u4ed6\u7684\u8bed\u8a00, \u50cf Scala, Groovy, JRuby \u7b49\u3002<\/p>\n<br\/>\n\u4e0d\u5f97\u4e0d\u8bf4 Scala \u7ed9\u6211\u4eec\u5e26\u6765\u4e86\u4e0d\u5c11\u7684\u5feb\u611f\uff0c\u4ee5\u81f4\u4e8e\u60f3\u4ee5\u66f4\u591a\u7684\u7cbe\u529b\u6295\u5165\u5230 Scala \u7f16\u7a0b\u4e2d\u53bb\uff0c\u4e0d\u8fc7\u8fd8\u6b63\u5728\u6362\u53d6\u9879\u76ee\u5b9e\u8df5\u7684\u673a\u4f1a\u3002JDK8 \u5f15\u5165 Lambda \u540e\u540c\u6837\u4e5f\u662f\u80fd\u66f4\u597d\u7684\u89e3\u51b3\u591a\u6838\u8ba1\u7b97\u7684\u95ee\u9898\uff0c\u4ece\u7a0b\u5e8f\u5458\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u53ea\u8981\u89c9\u5f97 Lambda \u80fd\u7ed9\u6211\u4eec\u5e26\u6765\u65e0\u4e0e\u4f26\u6bd4\u7684\u7075\u6d3b\u4e0e\u4fbf\u5229\u6027\u5c31\u8db3\u591f\u4e86\uff0c\u6c34\u5f88\u6df1\u3002<br\/><br\/>\nJDK8 \u8fd8\u6709\u589e\u52a0\u7684\u529f\u80fd\u5c31\u662f <a href=\"http:\/\/openjdk.java.net\/jeps\/0\" target=\"_blank\" rel=\"noopener\">JEP<\/a>(JDK Enhancement-Proposal) \u4e2d\u7684\u4e86\u3002<br\/><br\/>\n\u6765\u8fd9\u91cc <a href=\"http:\/\/openjdk.java.net\/projects\/jdk8\/\" target=\"_blank\" rel=\"noopener\">http:\/\/openjdk.java.net\/projects\/jdk8\/<\/a> \u770b\u770b JDK8 \u7684\u91cc\u7a0b\u7891<br\/><br\/>\n<del>2012\/04\/26 \u00a0\u00a0 \u00a0M1 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2012\/06\/14 \u00a0\u00a0 \u00a0M2 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2012\/08\/02 \u00a0\u00a0 \u00a0M3 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2012\/09\/13 \u00a0\u00a0 \u00a0M4 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2012\/11\/29 \u00a0\u00a0 \u00a0M5 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2013\/01\/31 \u00a0\u00a0 \u00a0M6 \u00a0\u00a0 \u00a0<\/del><br \/>\n<del>2013\/06\/13 \u00a0\u00a0 \u00a0M7 \u00a0\u00a0 \u00a0Feature Complete<\/del><br \/>\n<del>2013\/09\/05 \u00a0\u00a0 \u00a0M8 \u00a0\u00a0 \u00a0Developer Preview<\/del>"},{"title":"XSLT \u8c03\u7528 Java \u7684\u7c7b\u65b9\u6cd5 -- Tomcat \u73af\u5883","link":"https:\/\/yanbin.blog\/xslt-call-java-functions-tomcat-env\/","pubDate":"Fri, 26 Jul 2013 01:47:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/xslt-call-java-functions-tomcat-env\/","description":"\n\u5f88\u65e9\u5f88\u4e45\u4ee5\u524d\u5199\u8fc7\u4e00\u7bc7 <a title=\"XSLT \u8c03\u7528 Java \u7684\u7c7b\u65b9\u6cd5\" href=\"https:\/\/yanbin.blog\/xslt-call-java-method\" target=\"_blank\" rel=\"noopener\">\n\u5728 xslt \u8c03\u7528 java \u65b9\u6cd5\u7684\u65e5\u5fd7 XSLT \u8c03\u7528 Java \u7684\u7c7b\u65b9\u6cd5<\/a>, \u5176\u4e2d\u4ecb\u7ecd\u662f\u4f7f\u7528 org.apache.xalan.processor.TransformerFactoryImpl\n\u5b9e\u73b0\u7684\u4f8b\u5b50\uff0cJDK \u672c\u8eab\u5c31\u662f\u7528\u8fd9\u4e2a\u7684\u3002\u4f46\u662f\u5728 Tomcat \u73af\u5883\u4e0b\uff0c\u5b83\u6709\u5b83\u81ea\u5df1\u7684 XSLT \u9ed8\u8ba4\u5b9e\u73b0\u662f net.sf.saxon.TransformerFactoryImpl\uff0c\n\u8fd9\u65f6\u5019 XSLT \u4e2d\u7684\u5185\u5bb9\u7565\u6709\u4e0d\u540c\uff0c\u800c\u4e14\u663e\u793a\u66f4\u7b80\u4fbf\u4e00\u4e9b\u3002<\/p>\n<br\/>\n\u8fd9\u4e48\u8bf4\u5427, xalan \u652f\u6301\u4ee5\u4e0b\u4e24\u79cd\u8c03\u7528 java \u65b9\u6cd5\u7684\u65b9\u5f0f\uff0c\u800c saxon \u53ea\u8ba4\u5f97\u7b2c\u4e8c\u79cd<br\/><br\/>\n<strong>1. \u58f0\u660e\u5230\u5305\uff0c\u8c03\u7528\u65f6\u5e26\u4e0a\u7c7b\u540d<\/strong><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"cp\">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"nt\">&lt;xsl:stylesheet<\/span> <span class=\"na\">version=<\/span><span class=\"s\">&#34;1.0&#34;<\/span> <span class=\"na\">xmlns:xsl=<\/span><span class=\"s\">&#34;http:\/\/www.w3.org\/1999\/XSL\/Transform&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"> <span class=\"na\">xmlns:java=<\/span><span class=\"s\">&#34;cc.unmi.commons&#34;<\/span> <span class=\"na\">exclude-result-prefixes=<\/span><span class=\"s\">&#34;java&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"> <span class=\"nt\">&lt;xsl:output<\/span> <span class=\"na\">method=<\/span><span class=\"s\">&#34;xml&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"> <span class=\"nt\">&lt;xsl:template<\/span> <span class=\"na\">match=<\/span><span class=\"s\">&#34;user\/name&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"> <span class=\"nt\">&lt;li&gt;&lt;xsl:value-of<\/span> <span class=\"na\">select=<\/span><span class=\"s\">&#39;java:XsltFunctions.replace(.)&#39;<\/span><span class=\"nt\">\/&gt;&lt;\/li&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/xsl:template&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/xsl:stylesheet&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u6269\u5c55 JUnit 4\uff0c\u4f7f\u7528\u5b9a\u5236\u7684 Runner","link":"https:\/\/yanbin.blog\/extend-junit-4-customized-runner\/","pubDate":"Wed, 17 Apr 2013 02:59:19 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/extend-junit-4-customized-runner\/","description":"\nJUnit\u00a0\u7684\u6d4b\u8bd5\u7528\u4f8b\u603b\u662f\u7531\u00a0Runner\u00a0\u53bb\u6267\u884c\uff0cJUnit\u00a0\u63d0\u4f9b\u4e86 @RunWith\u00a0\u8fd9\u4e2a\u6d4b\u8bd5\u7c7b\u7684 Annotation,\u00a0\u53ef\u6765\u6307\u5b9a\u81ea\u5b9a\u4e49\u7684 Runner\u3002\u5982\u679c\u672a\u6307\u5b9a\u7279\u522b\u7684\u00a0 Runner\uff0c\u90a3\u4e48\u4f1a\u91c7\u7528\u9ed8\u8ba4\u7684 Runner\uff0c\u53ef\u80fd\u4e0d\u540c\u7684\u73af\u5883\uff0c\u5982 Eclipse\uff0c\u63a7\u5236\u53f0\u4e0b\u4f1a\u6709\u4e0d\u540c\u7684\u9ed8\u8ba4 Runner\u3002<\/p>\n<br\/>\n\u5982\u679c\u4e0d\u6e05\u695a Runner\u00a0\u662f\u4ec0\u4e48\uff0c\u90a3\u4e48\u53ef\u80fd\u89c1\u8fc7 @RunWith(SpringJUnit4ClassRunner.class)\u00a0\u8fd9\u4e2a\u4e1c\u897f\uff0c\u5b83\u6709\u52a9\u4f60\u52a0\u8f7d Spring\u00a0\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u53ca\u4e0e Spring\u00a0\u76f8\u5173\u7684\u4e8b\u7269\u3002<br\/><br\/>\n\u90a3\u4e48\u81ea\u5b9a\u4e49\u7684 Runner\u00a0\u6709\u4ec0\u4e48\u7528\u5462\uff1f\u5b83\u53ef\u4ee5\u622a\u83b7\u5230 @BeforeClass, @AfterClass, @Before, @After\u00a0\u8fd9\u4e9b\u4e8b\u4ef6\uff0c\u4e5f\u5c31\u662f\u80fd\u5728\u6d4b\u8bd5\u7c7b\u5f00\u59cb\u548c\u7ed3\u675f\u6267\u884c\u524d\u540e\uff0c\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u7684\u6267\u884c\u524d\u540e\u5904\u7406\u70b9\u4e8b\u60c5\u3002<br\/><br\/>\n\u6bd4\u5982\u8bf4\u4ece\u5916\u90e8\u8bfb\u53d6\u5185\u5bb9\u8fdb\u884c\u521d\u59cb\u5316\u6d4b\u8bd5\u6570\u636e\uff0c\u800c\u4e14 JUnit\u00a0\u672c\u8eab\u5c31\u63d0\u4f9b\u4e86 @RunWith(Parameterized.class)\u00a0\u00a0\u8fd9\u4e2a\u53c2\u6570\u5316 Runner\uff0c\u7528\u4e86\u4e3a\u5e26\u53c2\u6570\u6d4b\u8bd5\u65b9\u6cd5\u5faa\u73af\u586b\u5145\u6570\u636e\u8fdb\u884c\u6d4b\u8bd5\u3002JUnit\u00a0\u7684\u53c2\u6570\u5316\u6d4b\u8bd5\u6bd4 C#\u00a0\u8fd8\u662f\u8981\u7b28\u62d9\u4e00\u4e9b\uff0cC#\u00a0\u76f4\u63a5\u7528\u65b9\u6cd5\u6ce8\u89e3\u4e00\u884c\u884c\u8bbe\u7f6e\u53c2\u6570\uff0c\u6211\u60f3 JUnit\u00a0\u7a0d\u52a0\u5b9a\u5236\u7684\u8bdd\u4e5f\u884c\u7684\u3002"},{"title":"\u4f7f\u7528 JDK 5 \u540e\u7684\u7ebf\u7a0b\u5e76\u53d1\uff0cCallable, Future, ExecutorServie ...","link":"https:\/\/yanbin.blog\/jdk-5-concurrent-callable-futuretask-etc\/","pubDate":"Wed, 10 Apr 2013 23:53:19 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-5-concurrent-callable-futuretask-etc\/","description":"\n\u88ab\u95ee\u53ca Java\u00a0\u591a\u7ebf\u7a0b\uff0c\u591a\u4f1a\u60f3\u5230 Thread, Runnable\uff0c\u66f4\u901a\u5e38\u662f\u7528 new Thread(){public void run(){...}}.start()\u00a0\u6765\u542f\u52a8\u4e00\u4e2a\u7ebf\u7a0b\u3002\u90a3\u90fd\u662f JDK 1.5\u00a0\u4e4b\u524d\u7684\u5e74\u4ee3\u4e86\uff0c\u73b0\u5728\u8fd8\u8fd9\u4e48\u56de\u7b54\u5c31 Out\u00a0\u4e86\u3002\u7528\u7528\u00a0\u00a0JDK 1.5\u00a0\u7ed9\u6211\u4eec\u5e26\u6765\u7684\u00a0 java.util.concurrent\u00a0\u5427\uff0c\u66f4\u9177\u4e86\u3002\u8fd9\u91cc\u4e0d\u6d89\u53ca\u5b83\u7684\u5e76\u53d1\u96c6\u5408\u7c7b\uff0c\u540c\u6b65\u4e92\u65a5\u673a\u5236\uff0c\u53ea\u8bf4\u7ebf\u7a0b\u53ca\u7ebf\u7a0b\u6c60\u7684\u5e94\u7528\u4e3e\u4f8b\u3002<\/p>\n<br\/>\n<span style=\"font-size: x-large; color: #ff0000;\">1. <\/span>\u65b0\u7684\u542f\u52a8\u7ebf\u7a0b\u7684\u65b9\u5f0f\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Callable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">callable<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Callable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">Integer<\/span><span class=\"w\"> <\/span><span class=\"nf\">call<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;callable executed.&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Random<\/span><span class=\"p\">().<\/span><span class=\"na\">nextInt<\/span><span class=\"p\">(<\/span><span class=\"n\">100<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">};<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">FutureTask<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">future<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">FutureTask<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">callable<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">future<\/span><span class=\"p\">).<\/span><span class=\"na\">start<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;do your things here&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">future<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"\u6b63\u5219\u8868\u8fbe\u5f0f\u4e4b\u73af\u89c6(Lookaround)[\u8f6c]","link":"https:\/\/yanbin.blog\/regexlookaround\/","pubDate":"Wed, 13 Mar 2013 03:18:26 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/regexlookaround\/","description":"\n<strong><span style=\"font-size: large;\">1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u73af\u89c6\u57fa\u7840<\/span><\/strong><\/p>\n<br\/>\n\u73af\u89c6\u53ea\u8fdb\u884c\u5b50\u8868\u8fbe\u5f0f\u7684\u5339\u914d\uff0c\u4e0d\u5360\u6709\u5b57\u7b26\uff0c\u5339\u914d\u5230\u7684\u5185\u5bb9\u4e0d\u4fdd\u5b58\u5230\u6700\u7ec8\u7684\u5339\u914d\u7ed3\u679c\uff0c\u662f\u96f6\u5bbd\u5ea6\u7684\u3002\u73af\u89c6\u5339\u914d\u7684\u6700\u7ec8\u7ed3\u679c\u5c31\u662f\u4e00\u4e2a\u4f4d\u7f6e\u3002<br\/><br\/>\n\u73af\u89c6\u7684\u4f5c\u7528\u76f8\u5f53\u4e8e\u5bf9\u6240\u5728\u4f4d\u7f6e\u52a0\u4e86\u4e00\u4e2a\u9644\u52a0\u6761\u4ef6\uff0c\u53ea\u6709\u6ee1\u8db3\u8fd9\u4e2a\u6761\u4ef6\uff0c\u73af\u89c6\u5b50\u8868\u8fbe\u5f0f\u624d\u80fd\u5339\u914d\u6210\u529f\u3002<br\/><br\/>\n\u73af\u89c6\u6309\u7167\u65b9\u5411\u5212\u5206\u6709\u987a\u5e8f\u548c\u9006\u5e8f\u4e24\u79cd\uff0c\u6309\u7167\u662f\u5426\u5339\u914d\u6709\u80af\u5b9a\u548c\u5426\u5b9a\u4e24\u79cd\uff0c\u7ec4\u5408\u8d77\u6765\u5c31\u6709\u56db\u79cd\u73af\u89c6\u3002\u987a\u5e8f\u73af\u89c6\u76f8\u5f53\u4e8e\u5728\u5f53\u524d\u4f4d\u7f6e\u53f3\u4fa7\u9644\u52a0\u4e00\u4e2a\u6761\u4ef6\uff0c\u800c\u9006\u5e8f\u73af\u89c6\u76f8\u5f53\u4e8e\u5728\u5f53\u524d\u4f4d\u7f6e\u5de6\u4fa7\u9644\u52a0\u4e00\u4e2a\u6761\u4ef6\u3002<br\/><br\/>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"130\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>\u8868\u8fbe\u5f0f<\/strong><\/span><\/p>\n<\/td>\n<td width=\"416\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>\u8bf4\u660e<\/strong><\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"130\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>(?&lt;=Expression)<\/strong><\/span><\/p>\n<\/td>\n<td width=\"416\">\n<p align=\"left\"><span style=\"color: #99cc00;\">\u9006\u5e8f\u80af\u5b9a\u73af\u89c6\uff0c\u8868\u793a\u6240\u5728\u4f4d\u7f6e\u5de6\u4fa7\u80fd\u591f\u5339\u914dExpression<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"130\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>(?&lt;!Expression)<\/strong><\/span><\/p>\n<\/td>\n<td width=\"416\">\n<p align=\"left\"><span style=\"color: #99cc00;\">\u9006\u5e8f\u5426\u5b9a\u73af\u89c6\uff0c\u8868\u793a\u6240\u5728\u4f4d\u7f6e\u5de6\u4fa7\u4e0d\u80fd\u5339\u914dExpression<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"130\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>(?=Expression)<\/strong><\/span><\/p>\n<\/td>\n<td width=\"416\">\n<p align=\"left\"><span style=\"color: #99cc00;\">\u987a\u5e8f\u80af\u5b9a\u73af\u89c6\uff0c\u8868\u793a\u6240\u5728\u4f4d\u7f6e\u53f3\u4fa7\u80fd\u591f\u5339\u914dExpression<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"130\">\n<p align=\"left\"><span style=\"color: #99cc00;\"><strong>(?!Expression)<\/strong><\/span><\/p>\n<\/td>\n<td width=\"416\">\n<p align=\"left\"><span style=\"color: #99cc00;\">\u987a\u5e8f\u5426\u5b9a\u73af\u89c6\uff0c\u8868\u793a\u6240\u5728\u4f4d\u7f6e\u53f3\u4fa7\u4e0d\u80fd\u5339\u914dExpression<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<br\/>"},{"title":"\u7b80\u5355\u5b9e\u73b0 Java \u7684 Tuple \u5143\u7ec4\u6570\u636e\u7c7b\u578b","link":"https:\/\/yanbin.blog\/simple-java-tuple-datatype\/","pubDate":"Mon, 04 Feb 2013 06:32:42 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/simple-java-tuple-datatype\/","description":"\n\u5143\u7ec4\u7c7b\u578b\uff0c\u5373 Tuple \u5e38\u5728\u811a\u672c\u8bed\u8a00\u4e2d\u51fa\u73b0\uff0c\u4f8b\u5982 Scala \u7684 (\"Unmi\", \"fantasia@sina.com\", \"blahbla\")\u3002\u5143\u7ec4\u53ef\u8ba4\u4e3a\u662f\u8c61\u6570\u7ec4\u4e00\u6837\u7684\u5bb9\u5668\uff0c\u5b83\u7684\u76ee\u7684\u662f\u8ba9\u4f60\u65b9\u4fbf\u6784\u9020\u548c\u5f15\u7528\uff0c\u4f8b\u5982 Pair \u53ef\u8ba4\u4e3a\u662f\u4e00\u4e2a\u53ea\u80fd\u5b58\u4e24\u4e2a\u5143\u7d20\u7684\u5143\u7ec4\uff0c\u50cf\u662f\u4e2a Map\uff1b \u771f\u6b63\u7684\u5143\u7ec4\u5e94\u8be5\u662f\u53ef\u4ee5\u4efb\u610f\u591a\u4e2a\u5143\u7d20\u7684\u5bb9\u5668\uff0c\u7ed5\u6765\u7ed5\u53bb\uff0c\u5b83\u8fd8\u662f\u6570\u7ec4\uff0c\u6216\u5217\u8868\uff0c\u6240\u4ee5\u6211\u4eec\u5b9e\u73b0\u4e0a\u8fd8\u662f\u8981\u501f\u52a9\u4e8e\u6570\u7ec4\u6216\u662f\u5217\u8868\u3002<\/p>\n<br\/>\n\u5148\u770b Scala \u4e2d\u4ec0\u4e48\u662f\u5143\u7ec4\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-scala\" data-lang=\"scala\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"k\">val<\/span> <span class=\"n\">tuple<\/span> <span class=\"k\">=<\/span> <span class=\"o\">(<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"o\">,<\/span> <span class=\"s\">&#34;fantasia@sina.com&#34;<\/span><span class=\"o\">,<\/span> <span class=\"s\">&#34;blahblah...&#34;<\/span><span class=\"o\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">tuple<\/span><span class=\"o\">.<\/span><span class=\"n\">_1<\/span><span class=\"o\">)<\/span> <span class=\"o\">\/\/<\/span><span class=\"n\">\u8f93\u51fa<\/span> <span class=\"nc\">Unmi<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\nScala \u4e2d\u8bbf\u95ee\u4ece 1 \u5f00\u59cb\uff0c\u7528 ._1 \u65b9\u5f0f\u6765\u8bbf\u95ee\u5176\u4e2d\u7684\u5143\u7d20\u3002<br\/><br\/>\n\u53c2\u7167\u4e8e\u6b64\uff0c\u5199\u51fa\u4e00\u4e2a Java \u7248\u672c\u7684 Tuple\uff0c\u4e3a\u589e\u957f\u4f60\u7684\u952e\u76d8\u7684\u4f7f\u7528\u5bff\u547d\uff0c\u6211\u4eec\u628a\u65b9\u6cd5\u540d\u4e5f\u7f29\u77ed\u4e86\uff0c\u4f8b\u5982 make \u7f29\u5199\u4e3a mk\uff0c\u5f15\u7528\u5143\u7d20\u7684\u65b9\u6cd5\u540d\u4e3a _\uff0c\u4ecd\u7136\u4fdd\u6301 Java \u7684\u4e60\u60ef\uff0c\u7d22\u5f15\u4ece 0 \u5f00\u59cb\uff1a"},{"title":"Java \u91cc\u628a InputStream \u8f6c\u6362\u6210 String \u7684\u51e0\u79cd\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/java-convert-inputstream-to-string\/","pubDate":"Fri, 01 Feb 2013 05:35:57 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-convert-inputstream-to-string\/","description":"\n\u6211\u4eec\u5728 Java \u4e2d\u7ecf\u5e38\u4f1a\u78b0\u5230\u5982\u4f55\u628a InputStream \u8f6c\u6362\u6210 String \u7684\u60c5\u5f62\uff0c\u6bd4\u5982\u4ece\u6587\u4ef6\u6216\u7f51\u7edc\u5f97\u5230\u4e00\u4e2a InputStream\uff0c\u9700\u8981\u8f6c\u6362\u6210\u5b57\u7b26\u4e32\u8f93\u51fa\u6216\u8d4b\u7ed9\u522b\u7684\u53d8\u91cf\u3002<\/p>\n<br\/>\n\u672a\u771f\u6b63\u5173\u6ce8\u8fd9\u4e2a\u95ee\u9898\u4e4b\u524d\u6211\u5e38\u7528\u7684\u529e\u6cd5\u5c31\u662f\u6309\u5b57\u8282\u4e00\u6b21\u6b21\u8bfb\u5230\u7f13\u51b2\u533a\uff0c\u6216\u662f\u5efa\u7acb BufferedReader \u9010\u884c\u8bfb\u53d6\u3002\u5176\u5b9e\u5927\u53ef\u4e0d\u5fc5\u8d39\u6b64\u5468\u6298\uff0c\u6211\u4eec\u53ef\u4ee5\u7528 Apache commons IOUtils\uff0c\u6216\u8005\u662f JDK 1.5 \u540e\u7684 Scanner\uff0c\u8fd8\u53ef\u7528 Google\u00a0 Guava \u5e93\u7684 CharStreams\u3002\u5230\u4e86 JDK7\uff0c\u82e5\u8981\u4ece\u6587\u4ef6\u4e2d\u76f4\u63a5\u5f97\u5230\u5b57\u7b26\u4e32\u8fd8\u80fd\u7528 java.nio.file.Files#readAllLines \u548c java.nio.file.Files#readAllBytes \u65b9\u6cd5\u3002<br\/><br\/>\n\u4e0b\u9762\u770b\u5404\u4e2a\u4f8b\u5b50\uff0c\u4e3a\u80fd\u591f\u5b9e\u9645\u7528\u8fd0\uff0c\u4f8b\u5b50\u5199\u5728 main \u65b9\u6cd5\u91cc\uff0c\u5e76\u4ece\u6587\u4ef6\u83b7\u5f97\u4e00\u4e2a InputStream\uff0c\u4ee3\u7801\u4e2d\u628a\u53ef\u80fd\u8981\u6355\u83b7\u7684\u5f02\u5e38\u629b\u51fa\u6765\u3002\u518d\u5c31\u662f\u6ce8\u610f\u5904\u7406\u8f93\u5165\u8f93\u51fa\u6d41\u65f6\u6709\u6d89\u53ca\u5230\u5b57\u7b26\u96c6\uff0c\u5b57\u7b26\u96c6\u4e71\u4e86\u5c31\u4e71\u7801\u4e86\uff0c\u9ed8\u8ba4\u5b57\u7b26\u96c6\u662f System.getProperty(\"file.encoding\")\uff0c\u901a\u5e38\u6211\u4eec\u90fd\u7528 UTF-8\uff0c\u5f02\u5e38 UnsupportedEncodingException \u7ee7\u627f\u81ea IOException\u3002<br\/><br\/>\n\u4e0b\u9762\u7684 6 \u4e2a\u65b9\u6cd5\u4e2d\u5e94\u8be5\u6709\u4e00\u4e2a\u4f60\u80fd\u770b\u5f97\u4e0a\u7684\u5427\uff0c\u7528 Groovy\uff0cScala \u7684\u9664\u5916\uff0c\u82e5\u672a\u627e\u5230\u4e00\u4e2a\u9042\u610f\u7684\uff0c\u544a\u8bc9\u6211\uff0c\u4f60\u6709\u597d\u529e\u6cd5\u66f4\u5e94\u8be5\u544a\u8bc9\u6211\u3002<br\/><br\/>\n<strong>1. \u4f7f\u7528 JDK 5 \u7684 Scanner<\/strong><br\/>"},{"title":"Scala 2.10.0 \u65b0\u7279\u6027\u4e4b\u5b57\u7b26\u4e32\u63d2\u503c","link":"https:\/\/yanbin.blog\/scala-2-10-0-feature-string-interpolation\/","pubDate":"Sun, 20 Jan 2013 16:11:53 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/scala-2-10-0-feature-string-interpolation\/","description":"\nScala\u00a0\u5728\u5904\u7406\u5b57\u7b26\u4e32\u65b9\u9762\u7ec8\u4e8e\u4e5f\u4e0e\u65f6\u4ff1\u8fdb\u4e86\uff0c\u5f15\u5165\u4e86\u5b57\u7b26\u4e32\u63d2\u4ef6\uff0c\u8fd9\u5728\u8bb8\u591a\u811a\u672c\u8bed\u8a00\u4e2d\u5c31\u65e9\u5df2\u8fd9\u4e48\u505a\u4e86\u3002\u6709\u4e86\u8fd9\u4e2a\u7279\u6027\uff0c\u5b57\u9762\u91cf\u5b57\u7b26\u4e32\u548c\u53d8\u91cf\u8fde\u63a5\u53ef\u4ee5\u4e0d\u9700\u8981\u603b\u662f\u7528\u52a0\u53f7\u8fdb\u884c\u4e11\u964b\u7684\u8fde\u63a5\u4e86\u3002\u6709\u4e9b\u811a\u672c\u8bed\u8a00\u4f1a\u662f\u53ea\u5bf9\u53cc\u5f15\u53f7\u5b57\u7b26\u4e32\u89e3\u6790\u5176\u4e2d\u7684\u53d8\u91cf\uff0c\u5355\u5f15\u53f7\u7684\u4e0d\u4f1a\uff0c\u5f53\u7136Scala\u00a0\u662f\u8981\u533a\u5206\u5b57\u7b26\u4e32\u548c\u5b57\u7b26\u7c7b\u578b\u3002<\/p>\n<br\/>\n\u76f4\u767d\u7684\u8bb2\u5b57\u7b26\u4e32\u63d2\u503c\u5c31\u662f\uff0c<span style=\"color: #800000;\">val name=\"Unmi\"; val greeting=s\"Hello $name\"; greeting\u00a0\u7684\u503c\u5c31\u662f \"Hello name\"<\/span>\u3002\u4ea7\u751f\u6548\u5e94\u7684\u5c31\u662f\u90a3\u4e2a s\u00a0\u65b9\u6cd5\u3002<br\/><br\/>\nScala 2.10.0\u00a0\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e09\u79cd\u5b57\u7b26\u4e32\u63d2\u503c\u7684\u65b9\u5f0f\uff0c\u5206\u522b\u662f s, f\u00a0\u548c\u00a0 raw\u3002\u5b83\u4eec\u90fd\u662f\u5b9a\u4e49\u5728 <a href=\"http:\/\/www.scala-lang.org\/archives\/downloads\/distrib\/files\/nightly\/docs\/library\/index.html#scala.StringContext\" target=\"_blank\" rel=\"noopener\">StringContext<\/a>\u00a0\u4e2d\u7684\u65b9\u6cd5\u3002<br\/><br\/>\n<strong>s\u00a0\u5b57\u7b26\u4e32\u63d2\u503c\u5668<\/strong><br\/><br\/>\n\u53ef\u4ee5\u89e3\u6790\u5b57\u7b26\u4e32\u4e2d\u7684\u53d8\u91cf\uff0c\u53ef\u4ee5\u8c03\u7528\u65b9\u6cd5\uff0c\u8fd8\u80fd\u8fdb\u884c\u8ba1\u7b97\u3002\u5b9e\u9645\u8c03\u7528\u7684\u662f\u00a0 StringContext\u00a0\u4e2d\u7684\u00a0 s\u00a0\u65b9\u6cd5\u3002"},{"title":"Scala 2.10.0 \u65b0\u7279\u6027\u4e4b\u52a8\u6001\u5c5e\u6027\u3001\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/scala-2-10-0-new-feature-dynamic\/","pubDate":"Sat, 19 Jan 2013 13:34:15 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/scala-2-10-0-new-feature-dynamic\/","description":"\n\u6700\u65e9\u7684\u4ecb\u7ecd\u00a0Scala\u00a0\u8bed\u8a00\u7684\u4e66\u90fd\u662f\u4ee5\u00a0Scala\u00a0\u7684\u9759\u6001\u7c7b\u578b\u7cfb\u7edf\u4e3a\u50b2\u3002Scala\u00a0\u4e5f\u7b97\u662f\u4e2a\u811a\u672c\u8bed\u8a00\uff0c\u5374\u4e0d\u50cf\u5176\u4ed6\u8bb8\u591a\u811a\u672c\u8bed\u8a00\u90a3\u6837\u7c7b\u578b\u662f\u52a8\u6001\u7684\uff0c\u53ea\u6709\u6267\u884c\u65f6\u624d\u786e\u5b9a\uff0c\u800c Scala\u00a0\u5728\u6267\u884c\u524d\u5c31\u786e\u5b9a\u4e86\u7c7b\u578b\uff0c\u6bd4\u5982\u4f9d\u8d56\u4e8e\u6bd4\u00a0Java\u00a0\u66f4\u5f3a\u5927\u7684\u7c7b\u578b\u63a8\u65ad\u884c\u4e3a\u3002<\/p>\n<br\/>\n\u9759\u6001\u7c7b\u578b\u4e0d\u5149\u662f\u53d8\u91cf\u7c7b\u578b\u662f\u786e\u5b9a\u7684\uff0c\u8fd8\u6709\u6bd4\u5982\u5728\u4f7f\u7528\u00a0 qual.sel\u00a0\u65f6\uff0csel\u00a0\u8fd9\u4e2a\u5c5e\u6027\u6216\u662f\u65b9\u6cd5(Scala\u00a0\u7684\u8bbf\u95ee\u4e00\u81f4\u6027\uff0c\u5c5e\u6027\u548c\u65b9\u6cd5\u6709\u65f6\u5019\u5e76\u6ca1\u6709\u90a3\u4e48\u5927\u7684\u533a\u522b)\u5fc5\u987b\u5728 qual\u00a0\u7684\u7c7b\u578b\u4e2d\u58f0\u660e\u4e86\u7684\u3002<br\/><br\/>\nScala\u00a0\u601d\u8003\u518d\u4e09\u8fd8\u662f\u52a0\u5165\u4e86 Dynamic Types\uff0c\u8fd9\u4e2a\u7279\u6027\u5728\u00a0Scala 2.9\u00a0\u4e2d\u662f\u8bd5\u9a8c\u6027\u7684\uff0c\u5fc5\u987b\u7528 <span style=\"color: #800000;\">-Xexperimental<\/span>\u00a0\u8fdb\u884c\u5f00\u542f\uff0c\u5230\u4e86 Scala 2.10.0\u00a0\u4e2d\uff0c\u53ea\u6709\u4ee3\u7801\u4e2d <span style=\"color: #800000;\">import scala.language.dynamics<\/span> \u5c31\u53ef\u7528\u4e86\uff0c\u6216\u662f\u7f16\u8bd1\u65f6\u52a0 <span style=\"color: #800000;\">-language:dynamics<\/span> \u9009\u9879\u3002<br\/><br\/>\n\u867d\u7136 Scala 2.10.0\u00a0\u52a0\u8fdb\u4e86 Dynamic Types\u00a0\u7279\u6027\uff0c\u4f46 Scala\u00a0\u4ecd\u7136\u662f\u9759\u6001\u7c7b\u578b\u7684\u8bed\u8a00\uff0c\u56e0\u4e3a\u5728\u7f16\u8bd1\u5668\u540c\u6837\u4f1a\u68c0\u67e5\u591a\u51fa\u6765\u7684\u7c7b\u578b\u3002<br\/><br\/>\n\u6709\u4e86 Dynamic Types\u00a0\u4e4b\u540e\uff0cScala\u00a0\u53c8\u53ef\u66f4\u00a0DSL\u00a0\u4e86\uff0c\u65b9\u6cd5\u540d\u7684\u52a8\u6001\u4e0a\u53ef\u4ee5\u8ba9\u5b83\u968f\u65f6\u5305\u62ec\u6df1\u523b\u7684\u4e1a\u52a1\u542b\u4e49\u3002\u76f8\u6bd4 Java\u00a0\u7684\u00a0DSL\u00a0\u7684\u80fd\u529b\u5c31\u592a\u900a\u4e86\uff0c\u6211\u4eec\u51e0\u4e4e\u65e0\u6cd5\u5728 Java\u00a0\u9762\u524d\u63d0 DSL\u00a0\u8fd9\u56de\u4e8b\u3002"},{"title":"\u4f7f\u7528 Jackson \u628a Java \u5bf9\u8c61\u8f6c\u6362\u6210 JSON \u5b57\u4e32","link":"https:\/\/yanbin.blog\/jackson-java-object-json-string\/","pubDate":"Sat, 19 Jan 2013 00:21:07 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jackson-java-object-json-string\/","description":"\n\u539f\u6765 Java \u9879\u76ee\u4e2d\u7528\u7684 JSON\u00a0\u7ec4\u4ef6\u5e93\u4e3b\u8981\u662f <a href=\"http:\/\/code.google.com\/p\/google-gson\/\" target=\"_blank\" rel=\"noopener\">Gson<\/a>\u00a0\u548c <a href=\"http:\/\/json-lib.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">json-lib<\/a>\uff0cGson \u7b97\u662f\u5f88\u9519\u7684\u5e93\uff0cjson-lib \u7565\u663e\u5bd2\u789c\u3002\u597d\u5566\uff0c\u6700\u8fd1 Play 2.x \u4e2d\u5f03\u7528\u4e86 Gson \u800c\u91c7\u7eb3\u4e86 <a href=\"http:\/\/jackson.codehaus.org\" target=\"_blank\" rel=\"noopener\">Jackson<\/a>\uff0c\u6240\u4ee5\u73b0\u5728\u5c31\u6765\u6253\u63a2\u4e00\u4e0b Jackson\uff0c\u8e29\u4e2a\u70b9\u5427\u3002<\/p>\n<br\/>\nJackson\u00a0\u53f7\u79f0\u975e\u5e38\u9ad8\u7684\u6027\u80fd\uff0c\u542c\u8bf4\u6bd4\u53e6\u4e24\u4f4d\u5144\u5f1f\u00a0Gson\u00a0\u548c\u00a0json-lib\u00a0\u9ad8\u51fa\u4e00\u5927\u622a\uff0c\u6211\u6ca1\u6709\u4eb2\u6d4b\uff0c\u53ef\u662f\u6709\u5fc3\u4eba\u505a\u4e86\uff0c\u770b\u8fd9\u4e2a\u94fe\u63a5\u00a0<a href=\"http:\/\/wangym.iteye.com\/blog\/738933\" target=\"_blank\" rel=\"noopener\">\u4e24\u6b3eJSON\u7c7b\u5e93Jackson\u4e0eJSON-lib\u7684\u6027\u80fd\u5bf9\u6bd4(\u65b0\u589e\u7b2c\u4e09\u6b3e\u6d4b\u8bd5)<\/a> \u4e2d\u7684\u6570\u636e\u30022010\u00a0\u5e74 8\u00a0\u6708\u4efd\u7684\u6d4b\u8bd5\u7ed3\u679c\uff0c\u4e0d\u77e5\u73b0\u5728\u968f\u7740\u7248\u672c\u7684\u53d8\u66f4\u662f\u5426\u4ecd\u7136\u4fdd\u6301\u7740\u8fd9\u79cd\u60ac\u6b8a\u3002<br\/><br\/>\n\u901a\u5e38\u6211\u4f1a\u5728\u628a\u6587\u7ae0\u5f00\u5934\u585e\u4e30\u6ee1\uff0c\u505a\u8db3\u524d\u620f\uff0c\u5e76\u4e0d\u662f\u56e0\u4e3a\u5728\u5929\u6daf\u6df7\u4e60\u60ef\u4e86\u7684\u7f18\u6545\uff0c\u51b5\u4e14\u6211\u5728\u5929\u6daf\u603b\u662f\u8bb7\u4e8e\u8a00\u7684;\u00a0\u5728\u8fd9\u91cc\uff0c\u81ea\u5df1\u7684\u5730\u76d8\u81ea\u5df1\u4f5c\u4e3b\uff0c\u4e0d\u4f1a\u6709\u8981\u6c42\u7801\u8db3\u591a\u5c11\u5b57\u624d\u80fd\u53d1\u8868\u7684\u81ea\u8650\u6027\u9700\u6c42\uff0c\u4ec5\u4ec5\u662f\u8ba9\u672c\u6587\u5728\u4e3b\u9875\u4e0a\u663e\u793a\u65f6\u7684\u7684\u6982\u8981\u4e0d\u7a7a\u6d1e\u800c\u5df2\uff0c\u53ef\u4ee5\u7b80\u5355\u7c97\u66b4\u7684\u79f0\u4e4b\u4e3a\u5e9f\u8bdd\u3002<br\/><br\/>\n\u4e86\u4e86\uff0c\u5148\u4e86\u89e3 Jacson \u6700\u8d34\u8fd1\u5b9e\u9645\u5e94\u7528\u573a\u666f\u7684\u5e94\u7528\uff0c\u5373 Jackson\u00a0\u600e\u4e48\u628a\u4e00\u4e2a Java\u00a0\u751f\u6210\u5bf9\u5e94\u7684\u00a0JSON\u00a0\u5b57\u7b26\u4e32\uff0c\u770b\u770b\u524d\u9762\u7684\u6587\u5b57\u6709\u8fd9\u4e48\u591a\u4e86\uff0c\u76f4\u63a5\u4e0a\u4e00\u6bb5\u4ee3\u7801\u5427\uff0c\u800c\u540e\u518d\u6162\u6162\u5047\u8bbe\u4e0e\u5206\u89e3\uff1a"},{"title":"JavaDoc \u7f16\u7a0b\uff0c\u4e66\u5199\u81ea\u5b9a\u4e49\u7684 Doclet, \u5b9a\u5236\u8f93\u51fa","link":"https:\/\/yanbin.blog\/javadoc-customize-doclet\/","pubDate":"Thu, 20 Dec 2012 06:12:07 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/javadoc-customize-doclet\/","description":"\n\u524d\u4e00\u7bc7\u4ecb\u7ecd\u4e86 <a title=\"JavaDoc \u7f16\u7a0b\uff0c\u4e66\u5199\u81ea\u5b9a\u4e49\u7684 Taglet \u652f\u6301 @unmi \u7b49\" href=\"https:\/\/yanbin.blog\/javadoc-programming-customize-taglet\" target=\"_blank\" rel=\"noopener\">JavaDoc \u7f16\u7a0b\uff0c\u4e66\u5199\u81ea\u5b9a\u4e49\u7684 Taglet \u652f\u6301 @unmi \u7b49<\/a>, \u90a3\u65f6\u63d0\u5230\u4e86 Doclet\uff0c\u4f46\u662f\u5dee\u70b9\u65e0\u89c6\u4e86 Doclet\uff0c\u73b0\u5728\u624d\u77e5\u9053 Doclet \u771f\u662f\u592a\u5f3a\u5927\u4e86\uff0c\u6709\u4e86\u5b83\u4f60\u4f1a\u89c9\u5f97 javadoc \u5df2\u7ecf\u4e0d\u662f\u539f\u672c\u7684\u90a3\u4e2a javadoc \u4e86\uff0c\u522b\u518d\u628a javadoc \u770b\u4f5c\u53ea\u4f1a\u751f\u6210\u4e00\u5927\u5806 HTML \u6587\u4ef6\u7684\u5de5\u5177\u4e86\u3002\u5c24\u5176\u662f\u642d\u914d\u4e0a\u81ea\u5b9a\u4e49\u7684 Taglet\uff0c\u90a3\u53ef\u662f\uff0c\u81ea\u5df2\u4f53\u9a8c\u5427\u3002<\/p>\n<br\/>\nDoclet \u662f JavaDoc \u7684\u4e00\u4e2a\u5f88\u9686\u91cd\u7684\u6269\u5c55\u70b9\uff0c\u53ef\u4ee5\u5728\u6267\u884c javadoc \u65f6\u7528 -doclet \u6765\u6307\u5b9a\u81ea\u5df1\u7684 Doclet\uff0c\u90a3\u4e48 doclet \u53ef\u4ee5\u4e3a\u6211\u4eec\u505a\u4e9b\u4ec0\u4e48\u5462\uff1f<br\/><br\/>\n\u53ef\u4ee5\u4e3a\u6211\u4eec\u751f\u6210 HTML \u7684 JavaDoc API \u6587\u6863\uff0c\u8fd9\u5c31\u662f\u9ed8\u8ba4\u7684 com.sun.tools.doclets.standard.Standard \u4e3a\u6211\u4eec\u505a\u7684\u4e8b\uff0c\u8fd8\u53ef\u4ee5\u50cf\u4ee5\u524d\u90a3\u6837\u4ece\u6e90\u6587\u4ef6\u4e2d\u62bd\u53d6\u4fe1\u606f\u751f\u6210\u5404\u79cd XML \u6587\u4ef6\uff0c\u6216\u662f PDF, Excel\uff0c UML \u56fe\u7b49\u7b49\u4efb\u4f55\u53ef\u80fd\u7684\u5185\u5bb9\uff0c\u6216\u505a\u4efb\u4f55\u6709\u4f5c\u4e3a\u7684\u4e8b\u60c5\u3002\u603b\u4e4b\u5728 doclet \u4e2d\u53ef\u4ee5\u611f\u77e5\u9053\u5bf9\u4efb\u4f55\u5305\uff0c\u7c7b\uff0c\u65b9\u6cd5\uff0c\u5b57\u6bb5\u7b49\u7684\u904d\u5386\u3002\u8fd9\u91cc <a href=\"http:\/\/doclet.com\/\" target=\"_blank\" rel=\"noopener\">Doclet.com<\/a> \u6709\u5927\u91cf\u7684\u7b2c\u4e09\u65b9\u7684 doclet \u4f9b\u4f60\u9009\u62e9\uff0c\u5982\uff1a<br\/><br\/>\nAntDoclet, API Guide Doclet, EJBGen, Java2Rose Doclet, JDiff, JUnitDoclet, LaTeXtaglet, PDFDoclet, PublishedApiDoclet, ServletDoclet, Spell Check Doclet, UMLGraph, VelocityDoclet, XDoclet, xml-doclet \u7b49\u6570\u5341\u79cd Doclet, \u8fd8\u53ef\u4ee5\u627e\u5230\u522b\u7684\uff0c\u6240\u4ee5\u4f60\u8981\u662f\u4e0d\u60f3\u81ea\u5b9a\u4e49 Doclet \u7684\u8bdd\uff0c\u6709\u7b2c\u4e09\u65b9\u53ef\u7528\u5c31\u76f4\u63a5\u7528\u4eba\u5bb6\u7684\u5c31\u884c\u3002<br\/><br\/>\n\u603b\u6709\u7279\u6b8a\u9700\u6c42\u7684\u65f6\u5019\uff0c\u603b\u6709\u8981\u81ea\u5b9a\u4e49 Doclet \u7684\u65f6\u5019\u3002\u8bf4\u90a3\u4e48\u591a\u603b\u8981\u6765\u770b\u770b Doclet \u53ef\u4ee5\u7528\u6765\u505a\u4ec0\u4e48\uff0c\u89c1\u5982\u4e0b DocumentDoclet:"},{"title":"JavaDoc \u7f16\u7a0b\uff0c\u4e66\u5199\u81ea\u5b9a\u4e49\u7684 Taglet \u652f\u6301 @unmi \u7b49","link":"https:\/\/yanbin.blog\/javadoc-programming-customize-taglet\/","pubDate":"Sun, 16 Dec 2012 00:47:02 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/javadoc-programming-customize-taglet\/","description":"\njavadoc \u53ef\u4e3a\u6211\u4eec\u7684 Java \u9879\u76ee\u751f\u6210 API \u6587\u6863\uff0c\u522b\u4eba\u7684\u5e94\u8be5\u662f\u770b\u5f97\u591a\u4e86\uff0c\u81ea\u5df1\u7684\u53ef\u80fd\u4e0d\u597d\u610f\u601d\u667e\u51fa\u6765\u770b\u3002\u90a3 Java \u6e90\u4ee3\u7801\u91cc\u7684 @author, @see, @param \u7b49\u5e94\u8be5\u662f\u53f8\u7a7a\u89c1\u60ef\u4e86\u5427\u3002\u9664\u6b64\u4e4b\u5916\u6211\u4eec\u8fd8\u53ef\u4ee5\u81ea\u5b9a\u4e49\u81ea\u5df1\u7684 tag\uff0c\u5e76\u8ba9\u5b83\u4eec\u7684\u5185\u5bb9\u6309\u7167\u6211\u4eec\u9700\u8981\u7684\u683c\u5f0f\u751f\u6210\u5230 javadoc \u6587\u6863\u4e2d\uff0c\u6216\u4f5c\u4ed6\u7528\u3002\u8fd8\u8bb0\u5f97\u6ca1\u6709 Maven \u7684\u65f6\u4ee3\u6211\u4eec\u662f\u600e\u6837\u7528 XDoclet \u751f\u6620\u5c04\u6587\u4ef6\u7684\u5417\uff1f\u73b0\u5728\u7684 Taglet \u5b9a\u5236\u60f3\u8981\u505a\u7684\u4e8b\u60c5\u5927\u62b5\u5982\u6b64\u3002<\/p>\n<br\/>\n\u6267\u884c\u4e00\u4e0b <a href=\"http:\/\/docs.oracle.com\/javase\/6\/docs\/technotes\/tools\/windows\/javadoc.html\" target=\"_blank\" rel=\"noopener\">javadoc<\/a> \u547d\u4ee4\u770b\u770b\uff0c\u4e00\u5806\u7684\u53c2\u6570\u53ef\u4ee5\u6307\u5b9a\uff0c\u53c8\u6709\u5b66\u95ee\u5728\u91cc\u5934\uff0c\u4e14\u770b\uff1a<br\/><br\/>\n-tag &lt;name&gt;:&lt;locations&gt;:&lt;header&gt;\u00a0 Specify single argument custom tags<br \/>\n-taglet\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 The fully qualified name of Taglet to register<br \/>\n-tagletpath\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 The path to Taglets<br\/><br\/>\n\u548c<br\/><br\/>\n-doclet &lt;class&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Generate output via alternate doclet<br \/>\n-docletpath &lt;path&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Specify where to find doclet class files<br\/><br\/>\n\u5173\u4e8e doclet \u90e8\u4efd\u8fd9\u513f\u6682\u4e14\u4e0d\u8bf4\uff0c\u5355\u8bb2 tag \u90e8\u5206\u7684\u4e1c\u897f\u3002<br\/><br\/>\n\u5bf9\u4e8e\u81ea\u5b9a\u4e49 tag\uff0c\u7b80\u5355\u7684\u65f6\u5019\uff0c\u7528\u53c2\u6570 -tag\u00a0 \u90fd\u53ef\u4ee5\u4e0d\u5199\u81ea\u5df1\u7684 taglet \u7c7b\uff0c\u4f8b\u5982\u6709\u8fd9\u6837\u4e00\u4e2a\u4ee3\u7801\uff1a"},{"title":"Java \u7684\u591a\u884c\u5b57\u7b26\u4e32 Here Document \u7684\u5b9e\u73b0","link":"https:\/\/yanbin.blog\/java-implement-here-document\/","pubDate":"Fri, 14 Dec 2012 23:21:36 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-implement-here-document\/","description":"\n\u5bfb\u6c42\u4e86\u5f88\u4e45\u5173\u4e8e\u5982\u4f55\u5728 Java \u4e2d\u5b9e\u73b0\u591a\u884c\u5b57\u7b26\u4e32\uff0c\u5373 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Here_document\" target=\"_blank\" rel=\"noopener\">Here Document<\/a>\u3002\u56e0\u4e3a\u5728\u6d4b\u8bd5\u4e2d\u51c6\u5907\u5927\u7684\u5b57\u7b26\u4e32\u6570\u636e\u662f\u4e0d\u5f97\u4e0d\u7528\u52a0\u53f7\u53bb\u62fc\u63a5\uff0c\u751a\u81f3\u662f\u9ebb\u70e6\u3002\u7a0d\u597d\u5c31\u662f\u7528 <a href=\"http:\/\/www.htmlescape.net\/javaescape_tool.html\" target=\"_blank\" rel=\"noopener\">http:\/\/www.htmlescape.net\/javaescape_tool.html<\/a> \u628a\u4f60\u8f93\u5165\u7684\u5927\u6bb5\u6587\u5b57\u751f\u6210 Java \u7684\u5b57\u7b26\u4e32\u3002<\/p>\n<br\/>\n\u627e\u8fc7\u4e00\u4e9b\u4ecb\u7ecd Java \u5b9e\u73b0 Here Document \u7684\u65b9\u6cd5\uff0c\u9996\u5148\u5927\u5bb6\u65e0\u4e00\u4e0d\u662f\u628a\u8fd9\u4e2a\u591a\u884c\u5b57\u7b26\u4e32\u585e\u5728\u6ce8\u91ca\u91cc\uff0c\u6709\u4e9b\u5b9e\u73b0\u5728\u8fd0\u884c\u8fd8\u5728\u4f9d\u8d56\u4e8e Java \u6e90\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\uff0c\u8fd9\u4e0d\u592a\u53ef\u53d6\u3002\u806a\u660e\u7684\u505a\u6cd5\u5e94\u8be5\u8981\u53bb\u6253\u7f16\u8bd1\u5668\u7684\u4e3b\u610f\uff0c\u8ba9\u7f16\u8bd1\u540e\u4f53\u73b0\u5728 Class \u6587\u4ef6\u4e2d\uff0c\u53d8\u91cf\u5c31\u88ab\u8d4b\u4e0a\u4e86\u591a\u884c\u5b57\u7b26\u4e32\u503c\uff0c\u8fd9\u5c31\u662f JDK1.5 \u5f15\u5165\u7684 APT(Annotation Processing Tool)\uff0c\u5230 JDK1.6 \u540e\u53ef\u64cd\u4f5c\u6027\u66f4\u5f3a\u4e86\uff0c\u53ef\u4ee5 javac \u7684\u65f6\u5019\u5e26\u4e0a -processor \u53c2\u6570\u3002<br\/><br\/>\n\u5355\u5355\u4ece\u8bed\u6cd5\u7279\u6027\u4e0a\u6765\u8bb2\uff0c\u6211\u89c9\u5f97 Java \u4e0e\u73b0\u4eca\u6d41\u884c\u7684\u8bed\u8a00\u8fd8\u662f\u6709\u5dee\u8ddd\uff0c\u4e0d\u8fc7\u5b83\u4e00\u76f4\u5728\u6210\u957f\uff0c\u50cf JDK 1.5 \u548c 1.7 \u8fd9\u4e24\u4e2a\u7248\u672c\u5c31\u5e26\u6765\u4e86\u4e0d\u5c11\u597d\u4e1c\u897f\u3002\u60f3\u8981\u89c1\u8bc6\u4e00\u4e0b\u5176\u4ed6\u4e9b\u4e2a\u8bed\u8a00\uff0c\u5982 Perl, PHP, Ruby, C++11 \u600e\u4e48\u5b9e\u73b0 Here Document \u8fd8\u662f\u8bf7\u770b <a href=\"http:\/\/en.wikipedia.org\/wiki\/Here_document\" target=\"_blank\" rel=\"noopener\">http:\/\/en.wikipedia.org\/wiki\/Here_document<\/a>\u3002<br\/><br\/>\n\u5c31\u8fde Java \u6700\u4eb2\u5bc6\u7684\u6218\u53cb C# \u90fd\u65e9\u5b9e\u73b0\u4e86 Here Document\uff0c\u7528 @ \u7b26\u53f7\uff1a"},{"title":"\u4fdd\u6301\u987a\u5e8f\u7684 Java Properties \u7c7b","link":"https:\/\/yanbin.blog\/ordered-java-properties-class\/","pubDate":"Thu, 06 Dec 2012 23:46:36 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ordered-java-properties-class\/","description":"\nJava \u7684 Properties \u52a0\u8f7d\u5c5e\u6027\u6587\u4ef6\u540e\u662f\u65e0\u6cd5\u4fdd\u8bc1\u8f93\u51fa\u7684\u987a\u5e8f\u4e0e\u6587\u4ef6\u4e2d\u4e00\u81f4\u7684\uff0c\u56e0\u4e3a Properties \u662f\u7ee7\u627f\u81ea Hashtable \u7684\uff0c key\/value \u90fd\u662f\u76f4\u63a5\u5b58\u5728 Hashtable \u4e2d\u7684\uff0c\u800c Hashtable \u662f\u4e0d\u4fdd\u8bc1\u8fdb\u51fa\u987a\u5e8f\u7684\u3002<\/p>\n<br\/>\n\u603b\u6709\u65f6\u5019\u4f1a\u6709\u5173\u5fc3\u987a\u5e8f\u4e00\u81f4\u7684\u9700\u6c42\uff0c\u6070\u5982\u6709 org.apache.commons.collections.OrderdMap\uff08\u5176\u5b9e\u7528 LinkedHashMap \u5c31\u662f\u4fdd\u8bc1\u987a\u5e8f\uff09 \u4e00\u6837\uff0c\u6211\u4eec\u4e5f\u60f3\u8981\u6709\u4e2a OrderdProperties\u3002\u7f51\u4e0a\u67e5\u4e86\u4e0b\u8fd8\u771f\u6709\uff1a<br\/><br\/>\n<a href=\"http:\/\/livedocs.adobe.com\/jrun\/4\/javadocs\/jrunx\/util\/OrderedProperties.html\" target=\"_blank\" rel=\"noopener\">http:\/\/livedocs.adobe.com\/jrun\/4\/javadocs\/jrunx\/util\/OrderedProperties.html<\/a><br\/><br\/>\n<a href=\"http:\/\/www.openrdf.org\/doc\/alibaba\/2.0-rc4\/apidocs\/org\/openrdf\/repository\/object\/composition\/helpers\/OrderedProperties.html\" target=\"_blank\" rel=\"noopener\">http:\/\/www.openrdf.org\/doc\/alibaba\/2.0-rc4\/apidocs\/org\/openrdf\/repository\/object\/composition\/helpers\/OrderedProperties.html<\/a><br\/><br\/>\n\u4e0d\u8fc7\u6ca1\u627e\u5230\u6e90\u7801\uff0c\u5176\u5b9e\u81ea\u5df1\u5199\u4e00\u4e2a OrderedProperties\u00a0 \u4e5f\u4e0d\u96be\uff0c\u5e76\u4e0d\u9700\u8981\u91cd\u5934\u5199\u8d77\uff0c\u53ea\u8981\u7ee7\u627f\u81ea Properties\uff0c\u8986\u76d6\u539f\u6765\u7684 put\/keys,keySet,stringPropertyNames \u5373\u53ef\uff0c\u5176\u4e2d\u7528\u4e00\u4e2a LinkedHashSet \u6765\u4fdd\u5b58\u5b83\u7684\u6240\u6709 key\u3002\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a"},{"title":"\u5207\u5206 Tomcat \u7684 catalina.out \u6587\u4ef6\uff0c\u89e3\u51b3\u65e5\u5fd7\u6587\u4ef6\u8fc7\u5927\u7684\u95ee\u9898","link":"https:\/\/yanbin.blog\/split-tomcat-catalina-out-file\/","pubDate":"Mon, 17 Sep 2012 03:06:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/split-tomcat-catalina-out-file\/","description":"\nTomcat \u4e0b\u65e5\u5fd7\u6587\u4ef6 catalina.out \u8fc7\u5927\uff0c\u51e0\u767e\u5146\u6216\u51e0\u4e2aG\uff0c\u8fdb\u800c\u9020\u6210\u518d\u4e5f\u65e0\u6cd5\u5199\u5165\u66f4\u591a\u7684\u65e5\u5fd7\u5185\u5bb9\uff0c\u81f3\u4f7f Tomcat \u65e0\u6cd5\u5904\u7406\u8bf7\u6c42\u3002\u9700\u7136\u4f60\u53ef\u4ee5\u5728 $TOMCAT_HOME\/logs \u76ee\u5f55\u4e0b\u770b\u5230\u6709 catalina.2012-09-16.log \u8fd9\u6837\u5206\u65e5\u671f\u7684\u5f52\u6863\uff0c\u4f46\u662f\u4e3b\u6587\u4ef6 catalina.out \u5374\u4e00\u76f4\u5728\u81a8\u80c0\u3002<\/p>\n<br\/>\n\u4f60\u53ef\u4ee5\u6bcf\u6b21\u624b\u5de5\u6216\u5b9a\u65f6(crontab\/\u8ba1\u5212\u4efb\u52a1)\u6e05\u7406 catalina.out \u6587\u4ef6\uff0c\u6216\u662f\u89c4\u5212\u597d\u65e5\u5fd7\u8f93\u51fa(\u7ec8\u7a76\u4e5f\u4f1a\u6709\u6ee1\u7684\u65f6\u5019)\u3002\u518d\u5c31\u662f\u6709\u4e24\u79cd\u8f83\u597d\u7684\u89e3\u51b3\u65b9\u6848\u53bb\u771f\u6b63\u7684\u5207\u5206 catalina.out \u6587\u4ef6\uff0c\u8ba9 catalina.out \u53ea\u5b58\u6709\u6700\u65b0\u7684\u65e5\u5fd7\u3002<br\/><br\/>\n\u4e00. \u6539\u7528 Log4J \u6765\u8f93\u51fa Tomcat \u65e5\u5fd7\uff0c\u501f\u52a9 Log4J \u7684\u5404\u79cd\u65e5\u5fd7\u5207\u5206\u7684\u529f\u80fd\u3002\u8be6\u60c5\u53ef\u53c2\u8003\uff1a <a href=\"http:\/\/baalwolf.iteye.com\/blog\/1464093\" target=\"_blank\" rel=\"noopener\">http:\/\/baalwolf.iteye.com\/blog\/1464093<\/a>\uff0c <a href=\"http:\/\/tomcat.apache.org\/tomcat-6.0-doc\/logging.html\" target=\"_blank\" rel=\"noopener\">http:\/\/tomcat.apache.org\/tomcat-6.0-doc\/logging.html<\/a>\u3002<br\/><br\/>\n\u4e8c. Linux \u4e0b\u4f7f\u7528 cronolog \u5de5\u5177\u6765\u5207\u5206 catalina.out<br\/><br\/>\n\u8fd9\u91cc\u91cd\u70b9\u4ecb\u7ecd\u8fd9\u79cd\u65b9\u6cd5\uff0c\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\uff1a"},{"title":"\u518d\u8bf4 Java \u4e2d\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u540e\u5411\u5f15\u7528($1,$2...)","link":"https:\/\/yanbin.blog\/re-java-regex-replace\/","pubDate":"Fri, 17 Aug 2012 10:31:18 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/re-java-regex-replace\/","description":"\n\u524d\u9762\u901a\u8fc7 <a title=\"\u5728 Java \u4e2d\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u540e\u5411\u5f15\u7528($1,$2...)\" href=\"https:\/\/yanbin.blog\/java-regex-replace-string\" target=\"_blank\" rel=\"noopener\">\u5728 Java \u4e2d\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u540e\u5411\u5f15\u7528($1,$2...)<\/a> \u8bb2\u4e86\u5728\u00a0Java\u00a0\u4e2d\u4f7f\u7528\u00a0JavaScript\u00a0\u548c\u00a0JRegex\u00a0\u6765\u5b9e\u73b0\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u540e\u5411\u5206\u7ec4\u5f15\u7528 $1, $2 \u66ff\u6362\u3002<br\/><br\/>\n\u81ea\u00a0JDK 1.4\u00a0\u51fa\u73b0\u6b63\u5219\u8868\u8fbe\u5f0f\u4ee5\u6765\u6211\u8fd8\u771f\u4e0d\u77e5\u9053\u00a0Java\u00a0\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u662f\u53ef\u4ee5\u5728\u66ff\u6362\u65f6\u7528 $1, $2\u00a0\u8fbe\u6210\u540e\u5411\u5206\u7ec4\u66ff\u6362\u7684\uff0c\u6240\u4ee5\u524d\u4e00\u7bc7\u8868\u8ff0\u6709\u4e9b\u51fa\u5165\u7684\u3002\u4e5f\u5c31\u662f\u8981\u5b9e\u73b0\u00a0JavaScript\u00a0\u4e2d\u7684<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-html\" data-lang=\"html\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"p\">&lt;<\/span><span class=\"nt\">script<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">src<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&#34;abc def&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">des<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">src<\/span><span class=\"p\">.<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/(\\w+)\\s+(\\w+)\/<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&#34;$2 $1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">des<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> <span class=\"c1\">\/\/\u8f93\u51fa\u4e3a\uff1a def abc\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">&lt;\/<\/span><span class=\"nt\">script<\/span><span class=\"p\">&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u7684\u529f\u80fd\uff0c\u5b8c\u5168\u53ef\u4ee5\u4e0d\u6c42\u52a9\u4e8e\u7b2c\u4e09\u65b9\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u7ec4\u4ef6\u5e93\u6216\u662f\u901a\u8fc7\u00a0ScriptEngine + JavaScript\u00a0\u6765\u5b9e\u73b0\uff0c\u5728 Java\u00a0\u5b57\u7b26\u4e32\u7684:<br\/><br\/>\n<span style=\"color: #800000;\">public String replaceFirst(String regex, String replacement)<\/span><br \/>\n<span style=\"color: #800000;\">public String replaceAll(String regex, String replacement)<\/span><br\/><br\/>\n\u4e24\u65b9\u6cd5\u7684\u7b2c\u4e09\u4e2a\u53c2\u6570\u4e2d\u662f\u53ef\u4ee5\u7528 $1, $2 ...\u00a0\u6765\u5f15\u7528\u7b2c\u4e00\u4e2a\u53c2\u6570\u7684\u62ec\u53f7\u5206\u7ec4\u7684\uff0c\u7b80\u5355 Java \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"s\">&#34;abc def&#34;<\/span><span class=\"p\">.<\/span><span class=\"na\">replaceFirst<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;(\\\\w+)\\\\s+(\\\\w+)&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;$2 $1&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u7ed3\u679c\u4e3a def abc<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"s\">&#34;abc def aaa bbb&#34;<\/span><span class=\"p\">.<\/span><span class=\"na\">replaceAll<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;(\\\\w+)\\\\s+(\\\\w+)&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;$2 $1&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u7ed3\u679c\u662f<\/span><span class=\"w\"> <\/span><span class=\"n\">def<\/span><span class=\"w\"> <\/span><span class=\"n\">abc<\/span><span class=\"w\"> <\/span><span class=\"n\">bbb<\/span><span class=\"w\"> <\/span><span class=\"n\">aaa<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\nJava\u00a0\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u539f\u672c\u8fd8\u662f\u5f88\u5f3a\u5927\u7684\uff0c\u53ea\u6015\u4e0d\u80fd\u88ab\u4eba\u53d1\u73b0\u3002<br\/><br\/>\n2015-07-14\uff1a \u8865\u5145\u4e00\u70b9\uff0c\u5728\u6b63\u5219\u8868\u8fbe\u5f0f\u5916\u662f\u7528\u00a0 $1, $2 ... \u6765\u8fdb\u884c\u540e\u5411\u5f15\u7528\uff0c\u5982\u679c\u662f\u5728\u6b63\u5219\u8868\u8fbe\u5f0f\u4e2d\u5c31\u9700\u8981\u7528\u00a0 \\1, \\2 ... \u7684\u5f62\u5f0f\u6765\u8fdb\u540e\u5411\u5f15\u7528\u3002\u4e0b\u9762\u4f8b\u5b50\uff0c\u66ff\u6362\u91cd\u590d\u51fa\u73b0\u7684\u4e24\u4f4d\u6570\u53ca\u4e4b\u95f4\u7684\u5185\u5bb9<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"s\">&#34;xx12abcd12345&#34;<\/span><span class=\"p\">.<\/span><span class=\"na\">replaceAll<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;(\\\\d{2}).+?\\\\1&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u7ed3\u679c\u4e3a<\/span><span class=\"w\"> <\/span><span class=\"n\">xx345<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Java \u4e0b\u9ad8\u6548\u7684\u53cd\u5c04\u5de5\u5177\u5305 ReflectASM \u4f7f\u7528\u4f8b\u89e3","link":"https:\/\/yanbin.blog\/java-reflectasm-bytecode-usage\/","pubDate":"Thu, 16 Aug 2012 13:57:51 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-reflectasm-bytecode-usage\/","description":"\n<a title=\"ReflectASM\" href=\"http:\/\/code.google.com\/p\/reflectasm\/\" target=\"_blank\" rel=\"noopener\">ReflectASM<\/a> \u4f7f\u7528\u5b57\u8282\u7801\u751f\u6210\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e86\u66f4\u4e3a\u9ad8\u6548\u7684\u53cd\u5c04\u673a\u5236\u3002\u6267\u884c\u65f6\u4f1a\u751f\u6210\u4e00\u4e2a\u5b58\u53d6\u7c7b\u6765 set\/get \u5b57\u6bb5\uff0c\u8bbf\u95ee\u65b9\u6cd5\u6216\u521b\u5efa\u5b9e\u4f8b\u3002\u4e00\u770b\u5230 ASM \u5c31\u80fd\u9886\u609f\u5230 ReflectASM \u4f1a\u7528\u5b57\u8282\u7801\u751f\u6210\u7684\u65b9\u5f0f\uff0c\u800c\u4e0d\u662f\u4f9d\u8d56\u4e8e Java \u672c\u8eab\u7684\u53cd\u5c04\u673a\u5236\u6765\u5b9e\u73b0\u7684\uff0c\u6240\u4ee5\u5b83\u66f4\u5feb\uff0c\u5e76\u4e14\u907f\u514d\u4e86\u8bbf\u95ee\u539f\u59cb\u7c7b\u578b\u56e0\u81ea\u52a8\u88c5\u7bb1\u800c\u4ea7\u751f\u7684\u95ee\u9898\u3002<\/p>\n<br\/>\n\u4e0b\u9762\u4e09\u4e2a\u56fe\u662f ReflectASM \u4e0e Java \u81ea\u8eab\u53cd\u5c04\u673a\u5236\u7684\u6027\u80fd\u5bf9\u6bd4\uff0c\u8868\u73b0\u5f88\u4e0d\u9519\u7684\u3002<br\/><br\/>\n<p style=\"text-align: center;\"><img class=\"aligncenter\" src=\"http:\/\/chart.apis.google.com\/chart?chma=100&amp;chtt=Field%20Set\/Get&amp;chs=700x62&amp;chd=t:1402081,11339107&amp;chds=0,11339107&amp;chxl=0:%7CJava%20Reflection%7CFieldAccess&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;chco=6600FF&amp;.png\" alt=\"\" width=\"700\" height=\"62\" \/><\/p>\n<br\/>\n<p style=\"text-align: center;\"><img class=\"aligncenter\" src=\"http:\/\/chart.apis.google.com\/chart?chma=100&amp;chtt=Method%20Call&amp;chs=700x62&amp;chd=t:97390,208750&amp;chds=0,208750&amp;chxl=0:%7CJava%20Reflection%7CMethodAccess&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;chco=6600AA&amp;.png\" alt=\"\" width=\"700\" height=\"62\" \/><\/p>\n<br\/>\n<p style=\"text-align: center;\"><img class=\"aligncenter\" src=\"http:\/\/chart.apis.google.com\/chart?chma=100&amp;chtt=Constructor&amp;chs=700x62&amp;chd=t:2853063,5828993&amp;chds=0,5828993&amp;chxl=0:%7CJava%20Reflection%7CConstructorAccess&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;chco=660066&amp;.png\" alt=\"\" width=\"700\" height=\"62\" \/><\/p>\n<br\/>\n\u6d4b\u8bd5\u4ee3\u7801\u5305\u542b\u5728\u9879\u76ee\u6587\u4ef6\u4e2d. \u4e0a\u9762\u56fe\u5f62\u662f\u5728 Oracle \u7684 Java 7u3, server VM \u4e0b\u6d4b\u8bd5\u51fa\u7684\u7ed3\u679c\u3002<br\/><br\/>\n\u4e0b\u9762\u6211\u4eec\u81ea\u5df1\u6765\u505a\u4e2a\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u73af\u5883\u662f Mac OS X 10.8, 2.4G Core 2 Duo, 4G RAM, 64 \u4f4d JDK 1.6."},{"title":"AspectJ \u57fa\u4e8e\u81ea\u5b9a\u4e49\u7684\u65b9\u6cd5\u6ce8\u89e3\u6765\u62e6\u622a\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/aspectj-baseon-annotation-method\/","pubDate":"Thu, 16 Aug 2012 08:57:29 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aspectj-baseon-annotation-method\/","description":"\n\u901a\u5e38\u5728\u4f7f\u7528 AspectJ \u65f6\u90fd\u662f\u57fa\u4e8e\u8bc6\u522b\u65b9\u6cd5\u7684\u89c4\u5219\u6765\u8fdb\u884c\u65b9\u6cd5\u62e6\u622a\uff0c\u4f8b\u5982\u5207\u7247\u91cc\u8fd9\u6837\u5199<\/p>\n<br\/>\n<code>@Pointcut<\/code><code>(<\/code><code>\"execution(* *..StockService.getBaseInfo(..))\")<\/code><br\/><br\/>\n<code><\/code>\u5b83\u62e6\u622a\u5230\u7684\u662f\u4ee5 StockService \u7ed3\u5c3e\u7684\uff0c\u65b9\u6cd5\u540d\u4e3a getBaseInfo\uff0c\u53c2\u6570\u4efb\u610f\uff0c\u8fd4\u56de\u503c\u4efb\u610f\u7684\u65b9\u6cd5\u3002\u800c\u6211\u8fd9\u91cc\u8981\u8bf4\u7684\u4e00\u79cd\u65b9\u5f0f\u662f\u57fa\u4e8e\u81ea\u5b9a\u4e49\u6ce8\u89e3\u6765\u62e6\u622a\u65b9\u6cd5\u7684\uff0c\u6b64\u5904\u7684\u6ce8\u89e3\u4e0d\u662f\u6307 @Aspect, @Pointcut, \u6216 @Before \u90a3\u4e00\u5806\u4e1c\u897f\uff0c\u800c\u662f\u6307\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\u4e00\u4e2a\u6ce8\u89e3\uff0c\u5982 @cc.unmi.testaspectj.MonitorMethod\uff0c\u88ab\u5b83\u6240\u6ce8\u89e3\u7684\u65b9\u6cd5\u5373\u88ab\u62e6\u622a\uff0c\u50cf\uff1a<br\/><br\/>\n@cc.unmi.testaspectj.MonitorMethod<br \/>\npublic void foo();<br\/><br\/>\n\u8fd9\u53ef\u4ee5\u7ed9\u6211\u4eec\u5f88\u5927\u7684\u81ea\u7531\u5ea6\u6765\u5feb\u6377\u63a7\u5236\u54ea\u4e9b\u65b9\u6cd5\u9700\u8981\u88ab\u62e6\u622a\uff0c\u52a0\u4e2a\u4e0a\u9762\u7684\u6ce8\u89e3 @MonitorMethod \u5373\u53ef\uff0c\u800c\u4e0d\u50cf\u4ece\u524d\u90a3\u822c\u8981\u60f3\u50cf\u7528\u4ec0\u4e48\u89c4\u5219\u53bb\u5339\u914d\u67d0\u4e2a\u65b9\u6cd5\uff0c\u7528 || \u8fde\u63a5\u8d77\u6765\uff0c\u540c\u65f6\u8fd8\u8981\u9632\u6b62\u5f71\u54cd\u5230\u522b\u7684\u4e0d\u671f\u671b\u88ab\u62e6\u622a\u7684\u65b9\u6cd5\u3002<br\/><br\/>\n\u9700\u8981\u7684\u4ee3\u7801\u5e76\u4e0d\u591a\uff0c\u56db\u6b65\uff0c\u521b\u5efa\u81ea\u5b9a\u4e49\u6ce8\u89e3\u7c7b MonitorMethod, \u9700\u88ab\u62e6\u622a\u7684\u65b9\u6cd5\u52a0\u4e0a @MonitorMethod\uff0c\u65b9\u9762\u7c7b\uff0c\u6d4b\u8bd5\u7c7b\u3002"},{"title":"Java \u4f7f\u7528 dom4j \u6765\u83b7\u5f97 XML \u6587\u6863\u7684 innerXML","link":"https:\/\/yanbin.blog\/java-dom4j-get-innerxml\/","pubDate":"Tue, 17 Jul 2012 07:27:01 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-dom4j-get-innerxml\/","description":"\n\u5728\u7f51\u9875\u7684 Document \u4e2d\u5982\u679c\u60f3\u8981\u83b7\u5f97\u67d0\u4e2a\u7ed3\u70b9\u7684 innerHTML \u5c31\u884c\uff0c\u800c\u5728 Java \u5904\u7406 XML \u6587\u6863\u65f6\u60f3\u8981\u83b7\u5f97\u67d0\u4e2a\u8282\u70b9\u7684\u7684 innerXML \u5c31\u6ca1\u90a3\u4e48\u7b80\u5355\u7684\uff0c\u6807\u51c6\u7684 org.w3c.Element \u548c\u00a0 org.w3c.Node \u5747\u672a\u63d0\u4f9b\u7c7b\u4f3c innerXML \u7684\u65b9\u6cd5\u3002<\/p>\n<br\/>\n\u5e78\u597d\uff0c\u6211\u4eec\u5e38\u7528\u7684 dom4j \u91cc\u7684 org.dom4j.Node \u6709\u4e00\u4e2a\u65b9\u6cd5\u662f String asXML()\uff0c\u4e0d\u8fc7\u5b83\u7684\u610f\u4e49\u76f8\u5f53\u4e8e\u662f outerXML\uff0c\u4e5f\u5c31\u662f\u8bf4\u5b83\u8fd4\u56de\u7684\u5185\u5bb9\u8fd8\u5305\u62ec\u8282\u70b9\u672c\u8eab\u3002<br\/><br\/>\n\u6bd4\u5982\u6709\u8fd9\u4e48\u5728\u4e2a XML \u6587\u6863\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nt\">&lt;BookList&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> description of book 1\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"nt\">&lt;Book<\/span> <span class=\"na\">id=<\/span><span class=\"s\">&#34;1&#34;<\/span><span class=\"nt\">&gt;<\/span>Unmi<span class=\"nt\">&lt;\/Book&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/BookList&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"JUnit 4 \u5982\u4f55\u6b63\u786e\u6d4b\u8bd5\u5f02\u5e38","link":"https:\/\/yanbin.blog\/junit-4-how-to-test-exceptions\/","pubDate":"Thu, 07 Jun 2012 13:07:04 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-4-how-to-test-exceptions\/","description":"\n<p>\u672c\u7bc7\u8bb2\u8ff0\u5982\u4f55\u5728\u00a0JUnit 4\u00a0\u4e0b\u6b63\u786e\u6d4b\u8bd5\u5f02\u5e38\uff0c\u6211\u4f1a\u4ece try..catch\u00a0\u7684\u65b9\u5f0f\u8c08\u8d77\uff0c\u7136\u540e\u8bf4\u5230 @Test(expected=Exception.class),\u00a0\u6700\u540e\u8bba\u53ca @Rules public ExpectedException\u00a0\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u6700\u7ec8\u57fa\u672c\u53ef\u786e\u5b9a\u7528 @Rules\u00a0\u662f\u6700\u65b9\u4fbf\u7684\u3002<\/p><p>\u6211\u4eec\u5728\u7528 JUnit\u00a0\u6d4b\u8bd5\u65b9\u6cd5\u5f02\u5e38\u7684\u65f6\u5019\uff0c\u6700\u5bb9\u6613\u60f3\u5230\u7684\u529e\u6cd5\u5c31\u662f\u7528 try...catch\u00a0\u53bb\u6355\u83b7\u5f02\u5e38\uff0c\u9700\u8981\u65ad\u8a00\u4ee5\u4e0b\u51e0\u4e2a\u6761\u4ef6\uff1a<\/p>\n<p>1.\u00a0\u786e\u5b9e\u629b\u51fa\u7684\u5f02\u5e38 <br \/>2.\u00a0\u629b\u51fa\u5f02\u5e38\u7684\u00a0Class \u7c7b\u578b <br \/>3.\u00a0\u629b\u51fa\u5f02\u5e38\u7684\u5177\u4f53\u7c7b\u578b\uff0c\u4e00\u822c\u68c0\u67e5\u5f02\u5e38\u7684 message\u00a0\u5c5e\u6027\u4e2d\u5305\u542b\u7684\u5b57\u7b26\u4e32\u7684\u65ad\u5b9a<\/p><p>\u6240\u4ee5\u5e38\u7528\u7684\u4ee3\u7801\u4f60\u53ef\u80fd\u4f1a\u8fd9\u4e48\u5199\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"nd\">@Test<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">passwordLengthLessThan6LettersThrowsException<\/span><span class=\"p\">(){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">try<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Password<\/span><span class=\"p\">.<\/span><span class=\"na\">validate<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;123&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">fail<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;No exception thrown.&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"k\">catch<\/span><span class=\"p\">(<\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"n\">ex<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">assertTrue<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"w\"> <\/span><span class=\"k\">instanceof<\/span><span class=\"w\"> <\/span><span class=\"n\">InvalidPasswordException<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">assertTrue<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"na\">getMessage<\/span><span class=\"p\">().<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;contains at least 6&#34;<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p>\u8fd9\u91cc\u88ab\u6d4b\u8bd5\u7684\u65b9\u6cd5\u662f Password.validate()\u00a0\u65b9\u6cd5\u662f\u5426\u629b\u51fa\u4e86\u76f8\u5e94\u7684\u5f02\u5e38\uff0c\u6ce8\u610f\u8fd9\u91cc\u522b\u6f0f try\u00a0\u4e2d\u7684<\/p><p><span style=\"color: #800000;\">fail(\"No Exception thrown.\")<\/span>"},{"title":"\u5728 Java \u4e2d\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u540e\u5411\u5f15\u7528($1,$2...)","link":"https:\/\/yanbin.blog\/java-regex-replace-string\/","pubDate":"Wed, 25 Apr 2012 06:02:32 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-regex-replace-string\/","description":"\n\u81ea JDK1.4 \u5f15\u5165\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u652f\u6301\u53ef\u79f0\u5f97\u4e0a\u662f\u6b21\u5927\u6539\u53d8\uff0c<del>\u53ef Java \u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u80fd\u529b\u8fd8\u662f\u5f88\u5f31\uff0c\u522b\u8bf4\u548c Perl \u6bd4\u4e86\uff0c\u5c31\u662f\u548c C# \u548c JavaScript \u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u6bd4\u8f83\u6765\u4e5f\u900a\u8272\u4e0d\u5c11<\/del>\uff0c\u4e0d\u8fc7\u73b0\u5728 JVM \u4e0a\u6709\u5176\u4ed6\u8bed\u8a00\u5bf9\u6b63\u5219\u8868\u8fbe\u5f0f\u6709\u6240\u589e\u5f3a\uff0c\u50cf Groovy, jRuby \u548c Scala\u3002<\/p>\n<br\/>\n<span style=\"color: #ff0000;\">[\u4fee\u6b63\u4e00\u4e0b]\u00a0\u7b2c\u4e00\u53e5\u8bdd\u7684\u8bf4\u6cd5\u662f\u6709\u8bef\u7684\uff0c\u5176\u5b9e\u00a0JDK\u00a0\u672c\u8eab\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5c31\u652f\u6301\u66ff\u6362\u65f6\u7528 $1, $2\u00a0\u90a3\u6837\u7684\u540e\u5411\u5206\u7ec4\u5f15\u7528\uff0c\u4f8b\u5982\uff1a<\/span><br \/>\n<span style=\"color: #ff0000;\"> String s = \"abc def\".replaceAll(\"(\\\\w+)\\\\s+(\\\\w+)\", \"$2 $1\");\u00a0 \/\/s\u00a0\u5c31\u662f\u00a0 \"def\u00a0abc\"\uff0creplaceFirst\u00a0\u4e5f\u53ef\u4ee5\u7528 $1, $2\u00a0\u7684\u66ff\u6362\u3002<\/span><br\/><br\/>\n<del>\u6bd4\u5982\u5728 Java \u4e2d\u8981\u5b9e\u73b0\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u5206\u7ec4\uff0c\u540e\u5411\u5f15\u7528\u7684\u65b9\u5f0f\u8fdb\u884c\u66ff\u6362\u633a\u590d\u6742\u7684<\/del>\uff0c\u50cf JavaScript \u5b8c\u6210\u4e24\u4e2a\u5206\u7ec4\u7684\u8c03\u6362\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-html\" data-lang=\"html\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"p\">&lt;<\/span><span class=\"nt\">script<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">src<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&#34;abc def&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">des<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">src<\/span><span class=\"p\">.<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/(\\w+)\\s+(\\w+)\/<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&#34;$2 $1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"> <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">des<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"> <span class=\"c1\">\/\/\u8f93\u51fa\u4e3a\uff1a def abc\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">&lt;\/<\/span><span class=\"nt\">script<\/span><span class=\"p\">&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5728 Java \u4e2d\u53ef\u5f97\u7528\u4e0a Pattern, Matcher\uff0c\u8fd8\u8981 find()\/group() \u7b49\u64cd\u4f5c\uff0c\u4e8e\u662f\u6211\u5c31\u4f1a\u8003\u8651\u5728 Java \u4e2d\u5b8c\u6210\u7c7b\u4f3c\u7684\u529f\u80fd\u6709\u6ca1\u6709\u66f2\u7ebf\u7684\u65b9\u6cd5\uff0c\u6709\u7684\u3002\u4f60\u53ef\u4ee5\u8c03\u7528 JVM \u4e0a\u5176\u4ed6\u8bed\u8a00\u7684\u529f\u80fd\uff0c\u6211\u8fd9\u91cc\u7528\u5217\u4e86\u4e24\u79cd\u5b9e\u73b0\u65b9\u5f0f<br\/><br\/>\nJDK1.6 \u8d77\u53ef\u501f\u52a9 ScriptEngineManager \u4f7f\u7528 JavaScript \u76f8\u5e94\u7684\u51fd\u6570\uff0c\u9664\u6b64\u4e4b\u5916\u8fd8\u53ef\u7528\u7b2c\u4e09\u65b9\u7684\u5e93 <a href=\"http:\/\/jregex.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">JRegex<\/a>\uff0c\u5177\u4f53\u5b9e\u73b0\uff0c\u8bf7\u53c2\u89c1\u5982\u4e0b\u4ee3\u7801\uff0c\u8fd8\u5e26\u4e86\u6d4b\u8bd5\u7528\u4f8b\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi.utils<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">javax.script.Invocable<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">javax.script.ScriptEngine<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">javax.script.ScriptEngineManager<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">jregex.Pattern<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">jregex.Replacer<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">StringUtils<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"nf\">replaceStringByJS<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">src<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">jsRegex<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">replacement<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">ScriptEngineManager<\/span><span class=\"w\"> <\/span><span class=\"n\">manager<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ScriptEngineManager<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">ScriptEngine<\/span><span class=\"w\"> <\/span><span class=\"n\">engine<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">manager<\/span><span class=\"p\">.<\/span><span class=\"na\">getEngineByName<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;JavaScript&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">script<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"s\">&#34;function rep(target, regex, replacement){\\n&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34; var patt = new RegExp(regex,&#39;g&#39;);\\n&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34; return target.replace(patt, replacement);\\n&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;}&#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">try<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">engine<\/span><span class=\"p\">.<\/span><span class=\"na\">eval<\/span><span class=\"p\">(<\/span><span class=\"n\">script<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Invocable<\/span><span class=\"w\"> <\/span><span class=\"n\">inv<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">Invocable<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"n\">engine<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"n\">inv<\/span><span class=\"p\">.<\/span><span class=\"na\">invokeFunction<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;rep&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">src<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">jsRegex<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">replacement<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">25<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">catch<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">26<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">throw<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">RuntimeException<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">27<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">28<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">29<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">30<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"nf\">replaceStringByJRegex<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">src<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">regex<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">replacement<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">31<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Pattern<\/span><span class=\"w\"> <\/span><span class=\"n\">pattern<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Pattern<\/span><span class=\"p\">(<\/span><span class=\"n\">regex<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">32<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Replacer<\/span><span class=\"w\"> <\/span><span class=\"n\">replacer<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">pattern<\/span><span class=\"p\">.<\/span><span class=\"na\">replacer<\/span><span class=\"p\">(<\/span><span class=\"n\">replacement<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">33<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">replacer<\/span><span class=\"p\">.<\/span><span class=\"na\">replace<\/span><span class=\"p\">(<\/span><span class=\"n\">src<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">34<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">result<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">35<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">36<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">37<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">38<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">link<\/span><span class=\"o\">=<\/span><span class=\"s\">&#34;&lt;link url=\\&#34;http:\/\/unmi.cc\\&#34; &gt;\\&#34;Home\\&#34;&lt;\/link&gt;&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">39<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"s\">&#34;&lt;link url=\\&#34;http:\/\/unmi.cc\/tag\/java\\&#34; &gt;\\&#34;Java\\&#34;&lt;\/link&gt;&#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">40<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">jsString<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">StringUtils<\/span><span class=\"p\">.<\/span><span class=\"na\">replaceStringByJS<\/span><span class=\"p\">(<\/span><span class=\"n\">link<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">41<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"s\">&#34;&lt;link\\\\s+url=\\\\\\&#34;(.+?)\\\\\\&#34;.[^\/]*?&gt;\\\\\\&#34;(.+?)\\\\\\&#34;&lt;\/link&gt;&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;&lt;a href=\\&#34;$1\\&#34;&gt;$2&lt;\/a&gt;&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">42<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">jsString<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">43<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">44<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">jregexString<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">StringUtils<\/span><span class=\"p\">.<\/span><span class=\"na\">replaceStringByJRegex<\/span><span class=\"p\">(<\/span><span class=\"n\">link<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">45<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"s\">&#34;&lt;link\\\\s+url=\\\\\\&#34;(.+?)\\\\\\&#34;.[^\/]*?&gt;\\\\\\&#34;(.+?)\\\\\\&#34;&lt;\/link&gt;&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;&lt;a href=\\&#34;$1\\&#34;&gt;$2&lt;\/a&gt;&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">46<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">jregexString<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">47<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">48<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">49<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"cm\">\/*\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">50<\/span><span class=\"cl\"><span class=\"cm\"> * \u7a0b\u5e8f\u8f93\u51fa\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">51<\/span><span class=\"cl\"><span class=\"cm\"> * &lt;a href=&#34;http:\/\/unmi.cc&#34;&gt;Home&lt;\/a&gt;&lt;a href=&#34;http:\/\/unmi.cc\/tag\/java&#34;&gt;Java&lt;\/a&gt;\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">52<\/span><span class=\"cl\"><span class=\"cm\"> * &lt;a href=&#34;http:\/\/unmi.cc&#34;&gt;Home&lt;\/a&gt;&lt;a href=&#34;http:\/\/unmi.cc\/tag\/java&#34;&gt;Java&lt;\/a&gt;\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">53<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">54<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8d77\u521d\u6211\u662f\u7528\u7684\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u540e\u6765\u627e\u5230\u4e86\u7b2c\u4e8c\u79cd\u65b9\u5f0f\uff0c\u611f\u89c9\u7528 JRegex \u66f4\u4f18\u96c5\u4e9b\u3002"},{"title":"\u6709\u4e00\u79cd\u65b9\u6cd5\u7ed9 XSLT \u4e2d\u53d8\u91cf\u8fdb\u884c\u8d4b\u503c\uff0c\u662f\u4fdd\u6301\u72b6\u6001\u7684\u90a3\u79cd","link":"https:\/\/yanbin.blog\/xslt-assign-variables\/","pubDate":"Tue, 03 May 2011 13:55:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/xslt-assign-variables\/","description":"\n\u5728 XSLT \u4e2d\u58f0\u660e\u53d8\u91cf\u53ef\u4ee5\u7528 &lt;xsl:variable&gt; \u548c &lt;xsl:param&gt;\uff0c\u5b83\u4eec\u7684\u533a\u522b\u662f\u53ef\u4ee5\u901a\u8fc7 &lt;xsl:param&gt; \u4ece\u5916\u90e8\u5411 XSLT \u6587\u4ef6\u4f20\u53c2\u6570\uff0c\u9664\u6b64\u4e4b\u5916\uff0c\u5728 xslt \u5185\u90e8\u4f7f\u7528\u65f6\u8fd9\u4e24\u8005\u7684\u7528\u6cd5\u57fa\u672c\u662f\u4e00\u6837\u7684\u3002\u4e0b\u9762\u53ea\u4ee5 &lt;xsl:variable&gt; \u4e3a\u4f8b\u5b50\uff0c\u4f8b\u5b50\u4e2d\u7684 xsl:variable \u66ff\u6362\u6210 xsl:param \u4e5f\u662f\u80fd run \u7684\u3002<\/p>\n<br\/>\n&lt;xsl:variable&gt; \u7684\u57fa\u672c\u7528\u6cd5\u662f\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nt\">&lt;xsl:variable<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;username&#34;<\/span> <span class=\"na\">select=<\/span><span class=\"s\">&#34;&#39;Initial&#39;&#34;<\/span><span class=\"nt\">\/&gt;<\/span> <span class=\"c\">&lt;!-- \u4e0d\u5199 select \u5219\u9ed8\u8ba4\u4e3a &#39;&#39; --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"nt\">&lt;xsl:variable<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;username&#34;<\/span> <span class=\"na\">select=<\/span><span class=\"s\">&#34;&#39;New Value&#39;&#34;<\/span><span class=\"nt\">\/&gt;<\/span> <span class=\"c\">&lt;!-- \u8d4b\u503c --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"nt\">&lt;xsl:value-of<\/span> <span class=\"na\">select=<\/span><span class=\"s\">&#34;$username&#34;<\/span><span class=\"nt\">\/&gt;<\/span> <span class=\"c\">&lt;!-- \u663e\u793a\u53d8\u91cf\u503c\uff0c\u53d8\u91cf\u540d\u524d\u52a0\u4e0a $ \u7b26\u53f7 --&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u5e94\u7528 Castor \u628a XML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean(\u4e8c)","link":"https:\/\/yanbin.blog\/castor-xml-to-javabean-2\/","pubDate":"Sat, 23 Apr 2011 04:38:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/castor-xml-to-javabean-2\/","description":"\n\u7d27\u63a5\u524d\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/castor-xml-to-javabean-1\" target=\"_blank\" rel=\"noopener\">\u5e94\u7528 Castor \u628a XML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean(\u4e00)\uff0c<\/a>\u672c\u4f8b\u7a0d\u663e\u590d\u6742\u4e00\u4e9b\uff0c\u4e5f\u5c31\u662f\u8981\u4f7f\u7528\u5230\u6620\u5c04\u6587\u4ef6\uff0c\u66f4\u590d\u6742\u7684 JavaBean\u3001XML \u6570\u636e\u7c7b\u578b\u548c\u7ed3\u6784\uff0c\u5f15\u5165\u81ea\u5b9a\u7684 FieldHandler\uff0c\u8fd8\u6709\u5b58\u5728 Namespace \u7684\u60c5\u5f62\u3002<\/p>\n<br\/>\n\u5173\u4e8e\u5982\u4f55\u4f7f\u7528 Castor \u6765\u628a XML \u6620\u5c04\u6210 JavaBean \u8bf7\u7740\u91cd\u9605\u8bfb\u8fd9\u4e2a\u94fe\u63a5 <a href=\"http:\/\/www.castor.org\/reference\/html\/XML%20data%20binding.html\">http:\/\/www.castor.org\/reference\/html\/XML%20data%20binding.html<\/a>\u00a0\u4e2d\u7684\u5185\u5bb9\uff0c\u91cc\u9762\u6709\u8bf4\u660e\u652f\u6301\u7684\u7c7b\u578b\uff0c\u5982\u4f55\u5b9a\u4e49\u81ea\u5df1\u7684\u7c7b\u578b Handler \u53ca\u914d\u7f6e Handler \u7684\u5c5e\u6027\uff0cmapping.xml \u6587\u4ef6\u600e\u4e48\u5199\u53ca\u5404\u90e8\u4efd\u7684\u610f\u4e49\uff1b\u8fd8\u6709 castor.properties \u7684\u914d\u7f6e\uff0c\u6bd4\u5176\u4e2d\u7684 suppressNamespaces \u4e3a true \u65f6\u53ef\u4ee5\u5ffd\u7565\u6389 Namespace\uff0c\u9ed8\u8ba4\u4e3a false.<br\/><br\/>\n\u76f4\u63a5\u770b\u4f8b\u5b50\u5427\uff1a<br\/><br\/>\n1. persons.xml\uff0c\u8fd9\u91cc\u653e\u4e86\u4e00\u4e2a Namespace\uff0c\u5e76\u5b9a\u4e49\u4e86\u4e00\u4e2a Address \u7c7b\u578b\uff0c\u8fd8\u4f7f\u5f97\u8282\u70b9\u540d\u4e0e Bean \u7684\u5c5e\u6027\u540d\u4e0d\u4e00\u81f4\uff1a"},{"title":"\u5e94\u7528 Castor \u628a XML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean(\u4e00)","link":"https:\/\/yanbin.blog\/castor-xml-to-javabean-1\/","pubDate":"Sat, 23 Apr 2011 03:06:30 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/castor-xml-to-javabean-1\/","description":"\n\u4e4b\u524d\u6709\u4e00\u7bc7\u7528\u4f8b\u5b50\u6f14\u793a\u4e86 <a href=\"http:\/\/unmi.cc\/jaxb-xml-javabean-start\" target=\"_blank\" rel=\"noopener\">\u5e94\u7528 JAXB \u628a XML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean<\/a>\uff0c\u73b0\u5728\u6765\u770b\u53e6\u4e00\u6b3e XML Data Binding \u5de5\u5177 <a href=\"http:\/\/www.castor.org\/\" target=\"_blank\" rel=\"noopener\">Castor<\/a>\u00a0\u600e\u4e48\u628a XML \u6620\u5c04\u6210 JavaBean\u00a0 \u7684\uff0c\u76f8\u5bf9\u4e8e JAXB \u89c4\u8303\u6027\u7684\u4e1c\u897f\uff0cCastor \u7684\u5b98\u65b9\u7f51\u7ad9\u4e0a\u5173\u4e8e Castor \u7684\u4f7f\u7528\u6587\u6863\u6211\u89c9\u5f97\u8981\u591a\u4e9b\u3002\u4f5c\u4e3a\u4e00\u4e2a XML Data Binding\u00a0 \u5de5\u5177\uff0cCastor \u540c\u6837\u63d0\u4f9b\u4e86 Marshaller \u548c Unmarshaller \u7684\u529f\u80fd\uff0c\u5b83\u4e0d\u4f9d\u8d56\u4e8e\u6ce8\u89e3\uff0c\u8fd8\u662f\u91c7\u7528\u6620\u5c04\u6587\u4ef6\u7684\u65b9\u5f0f\uff0c\u50cf Hibernate \u90a3\u6837\u7684\u6620\u5c04\u6587\u4ef6\u3002<\/p>\n<br\/>\n\u4ece Castor \u7684\u5b98\u65b9\u7f51\u7ad9 <a href=\"http:\/\/www.castor.org\/\">http:\/\/www.castor.org\/<\/a>\u00a0\u770b\u5230\u5b83\u7684\u5916\u56f4\u751f\u6001\u7cfb\u7edf\u8fd8\u662f\u4e0d\u9519\u7684\uff0c\u6709 JDO\u3001Maven\u3001Spring\u3001Eclipse Plugin \u7684\u652f\u6301\uff0c\u4e5f\u6709\u4f17\u591a\u7ec4\u4ef6\u7528\u5230\u4e86\u5b83\u3002\u548c\u5176\u4ed6\u7c7b\u4f3c\u5de5\u5177\u4e00\u6837\uff0cCastor \u4e5f\u63d0\u4f9b\u4e86 XML\u3001Schema \u751f\u6210 Class \u7c7b\u7684\u529f\u80fd\uff0c\u4f46\u7167\u4f8b\u8fd9\u91cc\u8fd8\u662f\u770b\u770b\u5148\u6709\u7c7b\u7684\u60c5\u51b5\uff0c\u600e\u4e48\u4ece XML \u4e2d\u83b7\u53d6\u76f8\u5e94\u503c\u3002<br\/><br\/>\n\u901a\u5e38\u4f7f\u7528 Castor \u4ece XML \u5f97\u5230 JavaBean \u9700\u8981\u4e00\u4e2a\u6620\u5c04\u6587\u4ef6\uff0c\u8981\u662f JavaBean \u7684\u5c5e\u6027\u548c XML \u4e2d\u7684\u8282\u70b9\u540d\u8db3\u591f\u9f50\u6574\u89c4\u8303\u5c31\u53ef\u4ee5\u7701\u53bb\u6620\u5c04\u6587\u4ef6\uff0c\u5148\u770b\u4e0d\u7528\u6620\u5c04\u6587\u4ef6\u7684\u4f8b\u5b50\uff1a"},{"title":"\u5e94\u7528 JAXB \u628a XML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean","link":"https:\/\/yanbin.blog\/jaxb-xml-javabean-start\/","pubDate":"Thu, 21 Apr 2011 07:23:15 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jaxb-xml-javabean-start\/","description":"\n\u8de8\u7cfb\u7edf\u7684\u8c03\u7528\u76ee\u524d\u65e0\u7591\u662f WebService \u7684\u5929\u4e0b\uff0c\u6307\u7684\u662f\u901a\u8fc7 HTTP \u8bf7\u6c42\u65b9\u5f0f\u83b7\u5f97 XML \u6216 JSON \u6570\u636e\u7684\u65b9\u5f0f\uff0cRESTFul \u4e5f\u5f97\u5230\u4e86\u5f88\u597d\u7684\u5e94\u7528\u3002\u89c4\u8303\u610f\u4e49\u4e0a\u7684 Soap \u8c03\u7528\u4e0d\u77e5\u9053\u8fd8\u4e0d\u591a\u4e0d\u591a\uff0c\u53cd\u6b63\u5f53\u5e74\u7528\u8fc7\u7684 Corba \u9c9c\u6709\u8033\u95fb\u4e86\uff0c\u5c31\u50cf\u5f88\u591a\u4eba\u5bf9 EJB2 \u4e0d\u4f1a\u6709\u6982\u5ff5\u4e00\u6837\u3002<\/p>\n<br\/>\nJava \u5728\u8c03\u7528 WebService \u83b7\u5f97\u4e86 XML \u4e4b\u540e\uff0c\u63a5\u4e0b\u6765\u4e00\u79cd\u5e38\u89c1\u7684\u5904\u7406\u65b9\u5f0f\u5c31\u662f\u628a\u5b83\u8f6c\u6362\u6210\u76f8\u5e94\u7684 JavaBean\uff0c\u518d\u4e22\u7ed9\u5176\u4ed6\u7ec4\u4ef6\u50cf Jsp \u6807\u7b7e\uff0cFreeMarker \u7b49\u53bb\u5c31\u5f88\u6d41\u7545\u4e86\u3002\u5173\u4e8e XML \u4e0e JavaBean \u4e92\u76f8\u8f6c\u6362\u6709\u4e24\u4e2a\u64cd\u4f5c\u53eb\u505a\uff1aMarshaller \u548c Unmarshaller\uff0c\u8fd8\u6ca1\u89c1\u4e00\u4e2a\u6743\u5a01\u7684\u7ffb\u8bd1\uff0c\u5927\u6982\u5c31\u662f\u7f16\u7ec4\u4e0e\u53cd\u7f16\u7ec4\uff0c\u610f\u4e49\u5982\u540c\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u3002\u4e5f\u5c31\u662f\u7531 JavaBean \u5230 XML \u53eb\u505a Marshal\uff0c\u7531 XML \u5230 Java \u53eb\u505a Unmarshal\u3002<br\/><br\/>\n\u901a\u5e38\u4ece XML \u5230 JavaBean \u7684\u8f6c\u6362\u673a\u4f1a\u5927\u7684\u591a\uff0c\u6240\u4ee5\u6211\u4e3b\u8981\u4e5f\u662f\u7814\u7a76\u4e86\u4e0b\u5982\u4f55\u628a XML \u6620\u5c04\u6210 JavaBean\uff0c\u867d\u7136\u73b0\u5728\u7684\u5de5\u5177\u4e00\u6837\u4e5f\u90fd\u652f\u6301\u8fd9\u4e24\u4e2a\u65b9\u5411\u7684\u8f6c\u6362\u3002\u6709\u8bb8\u591a\u7ec4\u4ef6\u53ef\u4ee5\u505a\u5230\uff0c\u50cf <a href=\"http:\/\/www.oracle.com\/technetwork\/articles\/javase\/index-140168.html\" target=\"_blank\" rel=\"noopener\">JAXB<\/a>(Java Architecture for XML Binding)\u3001"},{"title":"Lucene \u7d22\u5f15\u3001\u67e5\u8be2\u65e5\u671f\u7c7b\u578b\u5b57\u6bb5","link":"https:\/\/yanbin.blog\/lucene-index-date-field\/","pubDate":"Tue, 15 Mar 2011 05:59:38 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/lucene-index-date-field\/","description":"\nLucene \u7684 Field \u5728\u6784\u9020\u65f6\u5185\u5bb9\u53c2\u6570\u53ef\u63a5\u53d7\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u8005\u5b57\u8282\u6570\u7ec4\uff0c\u6d41\u7b49\uff0c\u4e0d\u652f\u6301 Date \u7b49\u7c7b\u578b\u3002\u5982\u679c\u628a Date.toString() \u8f6c\u6362\u6210\u5b57\u7b26\u4e32\u6765\u7d22\u5f15\u7684\u8bdd\u90a3\u4e48\u5b58\u50a8\u5728\u7d22\u5f15\u4e2d\u7684\u6837\u5b50\u5c31\u4e0d\u786e\u5b9a(new Date().toString() \u4e3a \u201cTue Mar 15 13:25:41 GMT+08:00 2011\u201d)\uff0c\u4e5f\u7ed9\u4e0b\u6b21\u8fd8\u539f\u6765\u4e3a Date \u7c7b\u578b\u5e26\u6765\u4e0d\u4fbf\u3002\u5728\u4ee5\u524d\u7684\u7248\u672c Lucene \u4e13\u95e8\u63d0\u4f9b\u4e86 <a href=\"http:\/\/lucene.apache.org\/java\/3_0_3\/api\/all\/org\/apache\/lucene\/document\/DateField.html\" target=\"_blank\">DateField<\/a> \u6765\u7d22\u5f15 Date \u7c7b\u578b\uff0c\u4f46<br\/>\n<br\/>\n\u73b0\u5728\u4e0d\u63a8\u8350\u4f7f\u7528\u4e86\uff0c\u800c\u4e14\u4e5f\u65e0\u6cd5\u7528\uff0c\u56e0\u4e3a Lucene \u7684 Document \u5728 add(Fieldable field) \u65f6\u63a5\u53d7\u7684\u662f\u4e00\u4e2a Fieldable \u7c7b\uff0c\u7136\u800c DateField \u5e76\u672a\u5b9e\u73b0 Fieldable \u63a5\u53e3\uff0c\u4fdd\u7559\u5b83\u662f\u7528\u6765\u8bfb\u53d6\u8001\u7684\u7d22\u5f15\u6587\u4ef6\u3002<br\/>\n<br\/>\n\u90a3 Lucene \u8981\u600e\u4e48\u7d22\u5f15\u65e5\u671f\u7c7b\u578b\u5462\uff1f\u8bf4\u5230\u5e95\uff0c\u8fd8\u662f\u628a\u5b83\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\uff0c\u641c\u7d22\u7684\u65f6\u5019\u4ece\u5b58\u50a8\u7684\u5b57\u7b26\u4e32\u8fd8\u539f\u51fa\u6765\uff0c\u8f85\u52a9\u5de5\u5177\u7c7b\u662f <a href=\"http:\/\/lucene.apache.org\/java\/3_0_3\/api\/all\/org\/apache\/lucene\/document\/DateTools.html\" target=\"_blank\">DateTools<\/a>, \u5b83\u6240\u63d0\u4f9b\u7684\u65b9\u6cd5\uff1a"},{"title":"JDK 7 \u4e2d\u7684\u8bed\u6cd5\u589e\u5f3a -- (4) \u521b\u5efa\u6cdb\u578b\u5b9e\u4f8b\u65f6\u7684\u7c7b\u578b\u63a8\u65ad","link":"https:\/\/yanbin.blog\/jdk-7-enhance-type-inference\/","pubDate":"Mon, 14 Mar 2011 11:20:46 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-7-enhance-type-inference\/","description":"\nJava \u7684\u6cdb\u578b\u5b9e\u4f8b\u5728\u58f0\u660e\u65f6\u6709\u70b9\u50bb\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\u7684\u8bed\u53e5 List&lt;String&gt; list = new ArrayList&lt;String&gt;(); \u524d\u660e\u7684 List&lt;String&gt; \u5df2\u7ecf\u63d0\u4f9b\u4e86\u8db3\u591f\u7684\u4fe1\u606f\u8ba9\u7f16\u8bd1\u5668\u77e5\u9053 ArrayList \u7684\u53c2\u6570\u7c7b\u578b\uff0c\u5f53\u7136\u8fd9\u662f\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u5982\u679c\u590d\u6742\u4e9b\uff0c\u6765\u70b9\u5d4c\u5957\u7684\u8bdd\uff1a<\/p>\n<br\/>\nMap&lt;String, List&lt;Map&lt;String, String&gt;&gt;&gt; myMap = new HashMap&lt;String, List&lt;Map&lt;String,String&gt;&gt;&gt;();<br\/><br\/>\n\u90a3\u5c31\u591f\u545b\u7684\uff0c\u6240\u4ee5 Java \u7684\u8fd9\u4e00\u8bed\u6cd5\u8981\u6c42\u4e5f\u8ba9 Scala \u8fd9\u6837\u7684\u8bed\u8a00\u6240\u8bdf\u75c5\uff0c\u5f53\u7136\u4eba\u5bb6 Scala \u662f\u4e2a\u8d8b\u8fd1\u4e8e\u52a8\u6001\u6027\u7684\u8bed\u8a00\uff0c\u5b83\u8ba4\u4e3a\u4e0a\u9762\u7684\u8bed\u53e5\u5e94\u8be5\u8fd9\u4e48\u5199\uff1a<br\/><br\/>\nval x = new HashMap[String, List[String, List[Map[String, String]]]() \u6216\u8005\u662f<br \/>\nval x: Map[String, List[String, List[Map[String, String]]] = new HashMap()<br\/><br\/>\n\u603b\u4e4b\uff0c\u53ea\u8981\u4e00\u7aef\u7684\u8868\u6001\u5c31\u884c\uff0c\u5176\u4ed6\u4e8b\u60c5\u4ea4\u7ed9\u7f16\u8bd1\u5668\u6765\u63a8\u65ad\u3002\u73b0\u5728 JDK \u4e5f\u53cd\u7701\u5230\u4e86\u8fd9\u4e00\u70b9\uff0c\u56e0\u4e3a\u5f15\u5165\u4e00\u4e2a\u53eb\u505a\u83f1\u5f62\u64cd\u4f5c\u7b26(Diamond operator) \u7684\u4e1c\u897f\uff0c\u5373\u4e24\u4e2a\u5c16\u62ec\u53f7 &lt;&gt;\u3002\u8ba9\u4f7f\u5f97\u4f60\u50cf Scala \u4e00\u6837\u53ea\u8981\u5728\u5de6\u8fb9\u58f0\u660e\u53c2\u6570\u7c7b\u578b\u5c31\u884c\u5566\u3002\u8fd9\u4e2a\u64cd\u4f5c\u7b26\u4e0d\u514d\u8ba9\u6211\u60f3\u8d77\u4e86\u5728 perl \u91cc\u6709\u4e2a &lt;=&gt;\u00a0 \u8fd9\u6837\u7684\u64cd\u4f5c\u7b26\uff0c\u597d\u50cf\u53eb\u505a\u98de\u673a\uff0c\u4e0d\u662f\u6597\u5730\u4e3b\u7684\u98de\u673a\uff0c\u5b83\u76f8\u5f53\u4e8e Java \u91cc\u7684 compareTo() \u7684\u529f\u80fd\u3002<br\/><br\/>\n\u4e8e\u662f\u6cdb\u578b\u5b9e\u4f8b\u7684\u58f0\u660e\u5c31\u7b80\u5355\u5316\u6210\u4e86 Map&lt;String, List&lt;Map&lt;String, String&gt;&gt;&gt; myMap = new HashMap&lt;&gt;(); \u7ee7\u7eed\u5f80\u4e0b\u770b\uff1a"},{"title":"JDK 7 \u4e2d\u7684\u8bed\u6cd5\u589e\u5f3a -- (3) swith \u91cc\u7528 String \u7c7b\u578b","link":"https:\/\/yanbin.blog\/jdk-7-enhance-strings-witch\/","pubDate":"Sun, 13 Mar 2011 11:05:07 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-7-enhance-strings-witch\/","description":"\njava \u5728 switch \u8bed\u53e5\u8fd9\u4e00\u9879\u4e0a\u66f4\u591a\u7684\u662f\u627f\u88ad\u4e86 c++\uff0c\u5176\u5b9e\u6574\u4e2a\u8bed\u6cd5\u5c31\u662f c \u98ce\u683c\u7684\u3002java \u7684 switch \u91cc\u53ea\u80fd\u7528 byte\u3001char\u3001short\u3001int \u548c enum \u7c7b\u578b\uff0c\u8fde long \u578b\u90fd\u4e0d\u80fd\u7528(\u56e0\u4e3a switch \u91cc\u7684\u8981\u88ab\u8f6c\u6362\u4e3a int\u00a0\u00a0\u578b\uff0c\u800c long \u592a\u957f\u4e86)\u3002\u8981\u8bf4\u4e0d\u652f\u6301 float \u548c double \u90a3\u6837\u7684\u6d6e\u70b9\u90a3\u597d\u7406\u89e3\uff0c\u56e0\u4e3a\u5b83\u4eec\u672c\u8eab\u662f\u4e0d\u7cbe\u786e\u7684\uff0c1 \u53ef\u80fd\u662f 0.9999999999\u3002boolean \u5c31\u4e24\u503c\uff0c\u653e switch \u91cc\u65e0\u610f\u4e49\uff0c\u56e0\u4e3a c++ \u7684 switch \u91cc\u53ef\u7528bool \u578b\uff0c\u4f46\u5728 java \u4e2d\u906d\u6448\u5f03\u3002<br\/>\n<br\/>\n\u73b0\u5728\u5728 jdk7 \u91cc switch \u53ef\u4ee5\u7528\u5b57\u7b26\u4e32\u4e86\uff0c\u5b66\u4e86 c#\uff0c\u5b57\u7b26\u4e32\u7684\u597d\u5904\u5c31\u662f\u5b83\u662f\u8868\u610f\u7684\uff0c\u50cf switch(action) case \"create\" : ...; case \"delete\" : .....\uff0c\u591a\u5199\u610f\u554a\uff0c\u518d\u4e5f\u4e0d\u7528\u5148\u5b9a\u4e49\u4e00\u5806\u5e38\u91cf\uff0c\u7136\u540e\u518d switch(action) case Constants.ACTION_CREATE : ......; case Constants.ACTION_DELETE : ......\uff0c\u5f53\u7136\u5199\u8fc7\u4e0d\u5c11\u7a0b\u5e8f\u7684\u5c3d\u91cf\u4f1a\u907f\u514d\u5199\u6210 case 1... case 2 \u8fd9\u6837\u7684\u5199\u6cd5\u4e86\uff0c\u4f1a\u8ba9\u4eba\u4e0d\u77e5\u6240\u4ee5\u7684\u3002\u5e38\u91cf\u653e\u5728 case \u4e2d\u5c31\u8981\u6c42\u6211\u4eec\u7ecf\u5e38\u8981\u53bb\u67e5\u5b83\u5b9a\u4e49\u7684\u503c\u662f\u4ec0\u4e48\u3002"},{"title":"HttpClient \u6a21\u62df\u767b\u9646\uff0c\u4fdd\u6301\u4f1a\u8bdd\u5e76\u8fdb\u884c\u540e\u7eed\u64cd\u4f5c","link":"https:\/\/yanbin.blog\/httpclient-login-session\/","pubDate":"Wed, 09 Mar 2011 20:02:53 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/httpclient-login-session\/","description":"\n<a href=\"http:\/\/hc.apache.org\/\" target=\"_blank\">Apache HttpClient<\/a> \u662f\u5f88\u65b9\u4fbf\u7684 Java \u5f00\u6e90\u7684\u8bbf\u95ee HTTP \u8d44\u6e90\u7684\u7ec4\u4ef6\u3002\u7f51\u7ad9\u4e0a\u7684\u8d44\u6e90\u4e0d\u603b\u662f\u80fd\u533f\u540d\u8bbf\u95ee\u7684\uff0c\u5f88\u591a\u90fd\u9700\u8981\u767b\u9646\u540e\u624d\u80fd\u64cd\u4f5c\uff0c\u4e14\u4e0d\u8bf4\u8bba\u575b\u91cc\u767b\u9646\u540e\u624d\u80fd\u53d1\u8a00\uff0c\u5c31\u662f\u67d0\u4e9b\u7a0d\u663e\u654f\u611f\u7684 XML \u7b49\u4fe1\u606f\u4e5f\u662f\u767b\u9646\u540e\u624d\u80fd\u83b7\u53d6\u5230\u7684\u3002<br\/>\n<br\/>\n\u6ca1\u95ee\u9898\uff0cHttpClient \u80fd\u8ba9\u4f60\u505a\u5230\uff0c\u5b83\u63d0\u4f9b\u4e86 Basic \u548c Form-Based \u4e24\u79cd\u9a8c\u8bc1\u65b9\u5f0f\u3002\u767b\u9646\u540e\u83b7\u5f97\u670d\u52a1\u5668\u7aef\u53d1\u6765\u7684 Cookie \u4f5c\u4e3a\u4e0b\u4e00\u6b21\u8bbf\u95ee\u7684\u51ed\u8bc1, \u8ba9\u670d\u52a1\u7aef\u8ba4\u4e3a\u4f60\u8fd8\u662f\u4e2a\u5408\u6cd5\u7528\u6237\u3002\u670d\u52a1\u7aef\u4e0d\u662f\u7528 Session \u6765\u7ef4\u62a4\u4f1a\u8bdd\u7684\u5417\uff1f\u662f\u7684\uff0cSession \u4e5f\u8981\u6709\u4e2a\u8f7d\u4f53\uff0cCookie \u4e86\u3002\u6216\u6709\u65f6 Java Web \u4f1a\u7528 jsessionid \u53c2\u6570\u5728\u670d\u52a1\u7aef\u4e0e\u5ba2\u6237\u7aef\u6765\u56de\u5173\u8054 Session \u4fe1\u606f\uff0c\u4e5f\u6ca1\u95ee\u9898\uff0cHttpClient \u540c\u6837\u80fd\u80dc\u4efb\u3002<br\/>\n<br\/>\n\u4e0b\u9762\u4e3b\u8981\u8bf4\u660e Form-Based \u7684\u9a8c\u8bc1\u65b9\u5f0f\uff0cBasic \u7684\u9a8c\u8bc1\u7b80\u5355\u5217\u4e86\u51e0\u884c\u4ee3\u7801\uff0c\u8fd8\u672a\u5b9e\u8df5\uff0c\u5177\u4f53\u53ef\u53c2\u8003\u6587\u540e\u7684\u94fe\u63a5\u3002"},{"title":"JDK 7 \u4e2d\u7684\u8bed\u6cd5\u589e\u5f3a -- (2) \u6570\u503c\u5e38\u91cf\u4e2d\u7684\u4e0b\u5212\u7ebf","link":"https:\/\/yanbin.blog\/jdk-7-enhance-underscores-literals\/","pubDate":"Tue, 08 Mar 2011 10:47:55 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-7-enhance-underscores-literals\/","description":"\n\u518d\u6b21\u8fdb\u5165\u5230 JDK7 \u8bed\u6cd5\u589e\u5f3a\u7684\u7b2c\u4e8c\u9053\u9053\u4e0a\u6765\uff0c\u4e5f\u5c31\u662f\u6570\u503c\u5e38\u91cf\u4e66\u5199\u65f6\u53ef\u4ee5\u4e2d\u95f4\u63d2\u5165\u4e0b\u5212\u7ebf\u4f5c\u4e3a\u5206\u9694\u7ebf\uff0c\u4e5f\u5c31\u662f int i = 22_33 \u76f8\u5f53\u4e8e int i = 2233\uff0c\u4ec5\u4ec5\u662f\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u7684\u6709\u52a9\u4e8e\u9605\u8bfb\u4ee3\u7801\uff0c\u9664\u6b64\u4e4b\u5916\uff0c\u522b\u65e0\u5b83\u5904\u3002\u7f16\u8bd1\u540e\u6216\u6267\u884c\u65f6\u8fd9\u4e9b\u4e0b\u5212\u7ebf\u4fbf\u900f\u660e\u6389\u4e86\uff0c\u7f16\u8bd1\u540e\u7684\u5b57\u8282\u7801\u91cc\u4e5f\u6ca1\u6709\u4e86\u9644\u52a0\u7684\u4e0b\u5212\u7ebf\uff0c\u5f53\u7136\u6267\u884c\u65f6\u4e5f\u4e0d\u53ef\u80fd\u5411\u4f60\u8f93\u51fa\u4e0b\u6574\u6570 i \u4e3a 22_33 \u7684\u3002<br\/>\n<br\/>\n\u4e5f\u4e0d\u77e5\u9053\u662f\u8c01\u53ea\u662f\u4f17\u76ee\u671f\u76fc\u4e2d\u7684\u7248\u672c\u51c0\u627e\u4e9b\u8fd9\u7c7b\u6765\u589e\u5f3a\uff0c\u611f\u89c9\u610f\u4e49\u4e0d\u662f\u5f88\u5927\uff0c\u5927\u7ea6\u7c7b\u540c\u4e8e\u4e8c\u8fdb\u5236\u65b9\u5f0f\u6765\u8868\u793a\u6574\u6570\u3002\u8fd9\u91cc\u7684\u6570\u503c\u5305\u62ec\u6574\u6570\u548c\u5c0f\u6570\u7684\uff0c\u52a0\u4e0a 16 \u8fdb\u5236\u90a3\u4e48\u53ef\u7528\u6765\u8868\u793a\u6570\u5b57\u7684\u5b57\u7b26\u5c31\u6709 0-9 \u548c a-f(A-F) \u4e86\uff0c\u6ce8\u610f<strong>\u4e0b\u5212\u7ebf\u53ea\u80fd\u52a0\u5728\u524d\u9762\u6240\u5217\u7684\u67d0\u4e24\u4e2a\u5b57\u7b26\u4e4b\u95f4\uff0c\u800c\u4e14\u53ef\u8fde\u7eed\u591a\u4e2a\u4e0b\u5212\u7ebf<\/strong>\u3002\u770b\u4f8b\u5b50\u5427\uff1a"},{"title":"JDK 7 \u4e2d\u7684\u8bed\u6cd5\u589e\u5f3a -- (1) \u4e8c\u8fdb\u5236\u5b57\u9762\u5e38\u91cf","link":"https:\/\/yanbin.blog\/jdk-7-enhance-binary-literals\/","pubDate":"Mon, 07 Mar 2011 09:47:43 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-7-enhance-binary-literals\/","description":"\nJDK 7 \u9884\u89c8\u7248\u5df2\u51fa\uff0c\u5f53\u7136\u5230\u5b9e\u9645\u7684\u4f7f\u7528\u8fd8\u6709\u6bb5\u65f6\u95f4\uff0c\u5305\u62ec IDE \u7684\u548c\u5404\u5927\u4e3b\u8981\u7684\u5e94\u7528\u670d\u52a1\u5668\u7684\u5347\u7ea7\uff0c\u53ca JDK 7 \u672c\u8eab\u7684\u7a33\u5b9a\u5c1a\u987b\u65f6\u65e5\uff0c\u4f46\u6211\u4eec\u8fd8\u662f\u6709\u5fc5\u987b\u77a7\u77a7\u65b0\u7248 JDK \u5e26\u6765\u4e86\u54ea\u4e9b\u8bed\u6cd5\u589e\u52a0\u3002<\/p>\n<br\/>\n\u6211\u4eec\u6ca1\u6709\u76fc\u5230\u95ed\u5305\uff0c\u76f8\u5bf9\u4e8e JDK 5 \u7684\u8bed\u6cd5\u589e\u5f3a\uff0cJDK 7 \u7684\u52a8\u4f5c\u8fd8\u8f83\u5c0f\uff0c\u5927\u7ea6 8 \u4e2a\uff0c\u8fd9\u91cc\u4ecb\u7ecd\u7b2c\u4e00\u4e2a \u4e8c\u8fdb\u5236\u5b57\u9762\u5e38\u91cf\u3002<br\/><br\/>\n1\uff09\u4e8c\u8fdb\u5236\u5b57\u9762\u5e38\u91cf -- \u4efb\u4f55\u6574\u6570\u7c7b\u578b(byte, short, int \u548c long) \u58f0\u660e\u65f6\u53ef\u7528\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\uff0c\u5373 01 \u4e32\uff0c\u53ea\u8981\u6570\u5b57\u524d\u52a0\u4e0a 0b \u6216 0B \u5373\u884c\u3002"},{"title":"iText5.0.6 \u7528 HTMLWorker \u8f6c\u6362 HTML \u4e3a PDF \u5df2\u652f\u6301\u5355\u5143\u683c\u5bbd\u5ea6\u8bbe\u7f6e","link":"https:\/\/yanbin.blog\/itext5-0-6-htmlworker-html-pdf-support-cell-width\/","pubDate":"Fri, 04 Mar 2011 03:05:57 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/itext5-0-6-htmlworker-html-pdf-support-cell-width\/","description":"\n\u524d\u6709\u4e00\u6587 iText \u7528 HTMLWorker \u8f6c\u6362 HTML \u4e3a PDF \u65f6\u53ef\u8bbe\u7f6e\u8868\u683c\u5217\u5bbd\u5ea6 \u4ecb\u7ecd\u4e86\u5728 iText5.0.4 \u7684\u57fa\u7840\u4e0a\u8f6c\u6362 html \u4e3a pdf \u65f6\uff0c\u5982\u4f55\u8ba9 table \u4e2d\u7684\u5355\u5143\u683c\u80fd\u652f\u6301\u5bbd\u5ea6\u8bbe\u5b9a\uff0c\u5e76\u4e14\u8fd8\u4fee\u6539\u4e86\u4e09\u4efd\u6e90\u4ee3\u7801: HTMLWorker.java\u3001IncCell.java \u548c IncTable\u3002\u4e5f\u53ea\u662f\u5b9e\u73b0\u4e86\u4ee5\u767e\u5206\u6bd4\u5f62\u5f0f\u6765\u8bbe\u5b9a\u6bcf\u5217\u7684\u76f8\u5bf9\u5bbd\u5ea6\uff0c\u73b0\u5728\u597d\u4e86\uff0ciText \u987a\u7406\u7684\u53d1\u73b0\u4e86\u7528\u6237\u7684\u8fd9\u4e00\u9700\u6c42\uff0c\u5728\u8fdb\u5316\u540e\u7684 iText5.0.6 \u4e2d\u53ef\u4ee5\u8ba9\u4f60\u8bbe\u5b9a &lt;td&gt; \u7684\u5bbd\u5ea6\uff0c\u53ef\u76f4\u63a5\u7528\u767e\u5206\u6bd4\u6570\u503c(20%)\u76f8\u5bf9\u5bbd\u5ea6\uff0c\u6216\u7528\u53c2\u7167\u6570\u503c\u6765\u8bbe\u7f6e\uff0c\u4e4b\u540e\u5462\uff0cHTMLWorker \u4f1a\u5e2e\u4f60\u8f6c\u6362\u4e3a\u76f8\u5bf9\u7684\u5bbd\u5ea6--\u6bd4\u5982\u6709\u4e09\u5217\uff0c\u5206\u522b\u8bbe\u7f6e\u4e3a 20\uff0c10\uff0c50\uff0c\u88ab\u8f6c\u6362\u4e3a\u76f8\u5bf9\u5bbd\u5ea6\u5c31\u662f 25%\uff0c12.5% \u548c 62.5%\u3002<br\/>\n<br\/>\n\u770biText5.0.6 \u7b80\u77ed\u7684 release \u8bf4\u660e\uff0ciText5.0.6 has been released(<a href=\"http:\/\/lowagie.com\/node\/73\">http:\/\/lowagie.com\/node\/73<\/a>):"},{"title":"Slfj + Logback \u65f6\uff0c\u57fa\u672c\u7684 logback.xml \u914d\u7f6e","link":"https:\/\/yanbin.blog\/slfj-logback-xml-base-config\/","pubDate":"Fri, 18 Feb 2011 07:33:12 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/slfj-logback-xml-base-config\/","description":"\n\u73b0\u5728\u8d8a\u6765\u8d8a\u591a\u7684\u9879\u76ee\u7528 Slfj\uff0c\u800c\u4e0e\u5b83\u7ed3\u5408\u6700\u597d\u7684 Log4j \u66ff\u4ee3\u54c1\u5c31\u662f Logback\uff0c\u4e0b\u9762\u662f Logback \u7684\u4e00\u4e2a\u53ef\u4f9b\u53c2\u8003\u7684\u57fa\u672c\u7684\u914d\u7f6e\u6587\u4ef6 logback.xml\uff0c\u53ef\u4ee5\u63a7\u5236\u53f0\u548c\u6587\u4ef6\u540c\u65f6\u8f93\u51fa\uff0c\u6587\u4ef6\u53ef\u8fdb\u884c\u4e24\u79cd\u7c7b\u578b\u7684\u5f52\u6863\uff0c\u5206\u5929\u5b58\u50a8\u65e5\u5fd7\uff0c\u6216\u6309\u6587\u4ef6\u5927\u5c0f\u538b\u7f29\u65e5\u5fd7\u5f52\u6863\u3002<\/p>\n<br\/>\nLogback \u548c Log4J \u540c\u51fa\u4e00\u4eba\u4e4b\u624b\uff0c\u800c\u4f5c\u8005\u7684\u4e13\u6ce8\u70b9\u4e5f\u5728 Logback\uff0cLogback \u6709\u66f4\u597d\u7684\u6027\u80fd\uff0c\u7279\u522b\u662f\u5728\u73b0\u4ee3 Java \u7a0b\u5e8f\u4e2d\u3002<br\/><br\/>\n\u4e00\u822c\u662f rollingPolicy \u548c triggeringPolicy \u642d\u914d\u4f7f\u7528\uff0crollingPolicy \u8d1f\u8d23\u505a\u4ec0\u4e48\uff0ctriggeringPolicy \u7ba1\u7406\u4ec0\u4e48\u65f6\u5019\u505a\uff0c\u800c FixedWindowRollingPolicy \u672c\u8eab\u5c31\u5b9e\u73b0\u4e86 TriggeringPolicy \u63a5\u53e3\uff0c\u6240\u4ee5\u5b83\u80fd\u591f\u81ea\u6211\u7ba1\u7406\uff0c\u4e0d\u9700\u8981\u522b\u4eba\u6765\u63a8\u52a8\u5c31\u4f1a\u505a\u7684\u3002"},{"title":"\u7528 jreloader \u52a8\u6001\u91cd\u65b0\u52a0\u8f7d\u6539\u53d8\u7684\u7c7b\u800c\u4e0d\u7528\u91cd\u542f JVM","link":"https:\/\/yanbin.blog\/jreloader-reload-class\/","pubDate":"Fri, 28 Jan 2011 06:02:27 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jreloader-reload-class\/","description":"\n\u5728 Tomcat \u4e2d\u53ef\u4ee5\u914d\u7f6e reloadable=\"true\" \u505a\u5230\u7c7b\u6539\u53d8\u540e\uff0cTomcat \u91cd\u65b0\u52a0\u8f7d\u3002\u5176\u5b9e\u8fd9\u4e2a\u8fc7\u7a0b\u5927\u7ea6\u4e5f\u662f\u5f53 Tomcat \u53d1\u73b0\u6709\u6539\u53d8\u7684\u7c7b\u4f1a\u91cd\u65b0\u542f\u52a8\u4e00\u4e2a\u65b0\u7684\u5e94\u7528\u7a0b\u5e8f\u91cd\u65b0\u52a0\u8f7d\u6240\u6709\u7684\u7c7b\u6765\u670d\u52a1\u4e8e\u65b0\u7684\u8bf7\u6c42\uff0c\u53ea\u662f\u4e0d\u9700\u8981\u4f60\u624b\u52a8\u7684\u53bb\u6267\u884c shutdown.sh(.bat)\uff0c\u518d startup.sh(.bat)\u3002\u8fd9\u79cd\u65b9\u5f0f\u5bf9\u4e8e\u53e4\u8001\u7684 jsp \u7a0b\u5e8f\u5b8c\u5168\u80fd\u4ece\u5bb9\u4ee5\u5bf9\uff0c\u56e0\u4e3a web.xml \u91cc\u51e0\u4e4e\u6ca1\u4ec0\u4e48\u968f\u5e94\u7528\u4e00\u8d77\u542f\u52a8\u4e14\u8017\u65f6\u957f\u4ee3\u7801\uff1b\u4f46\u5f53\u4e0b\u662f\u6846\u67b6\u6a2a\u884c\uff0cweb.xml \u4e2d\u968f\u5e94\u7528\u4e00\u8d77\u542f\u52a8\u7684\u7a0b\u5ea6\u53ef\u8c13\u662f\u4e89\u5148\u6050\u540e\u7684\uff0c\u6240\u4ee5\u4ec5\u4ec5\u4f9d\u8d56 reloadable=\"true\" \u662f\u6ee1\u8db3\u4e0d\u4e86\u9700\u6c42\u7684\u3002\u6bcf\u6539\u4e00\u4e2a\u7c7b(\u65e0\u8bba\u662f\u6539\u52a8\u4e86\u65b9\u6cd5\u4f53\u4e2d\u7684\u4ee3\u7801\u8fd8\u662f\u53d8\u52a8\u4e86\u7c7b\u7684\u7ed3\u6784\uff0c\u51c6\u786e\u7684\u8bf4\u662f\u52a8\u4e86 WEB-INF\/classes \u76ee\u5f55\u4e2d\u7684\u4efb\u4f55\u6587\u4ef6) \u4f60\u90fd\u53ef\u80fd\u5c31\u4f1a\u5728<br\/>\n<br\/>\n<span style=\"color: #800000;\">Jan 28, 2011 7:19:42 PM org.apache.catalina.core.ApplicationContext log<br\/>\nINFO: Initializing Spring root WebApplicationContext"},{"title":"Tomcat 7\u7684\u4e03\u5927\u7279\u6027\uff1a\u65b0\u7279\u6027\u4e0e\u589e\u5f3a\u529f\u80fd","link":"https:\/\/yanbin.blog\/top7-features-in-tomcat7\/","pubDate":"Mon, 17 Jan 2011 07:57:28 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/top7-features-in-tomcat7\/","description":"\nTomcat 7 \u5728\u52a0\u5f3a\u539f\u6709\u529f\u80fd\u7684\u540c\u65f6\u4e5f\u589e\u52a0\u4e86\u4e00\u4e9b\u65b0\u7279\u6027\u3002\u6709\u4e9b\u6587\u7ae0\u5217\u4e3e\u4e86Tomcat 7\u7684\u65b0\u7279\u6027\uff0c\u4f46\u5927\u591a\u6570\u90fd\u6ca1\u6709\u5bf9\u5b83\u4eec\u8fdb\u884c\u8be6\u7ec6\u5730\u89e3\u91ca\u3001\u8bc4\u4ef7\u5e76\u7ed9\u51fa\u53ef\u6267\u884c\u7684\u793a\u4f8b\u3002\u9664\u4e86\u5217\u4e3e\u51fa\u65b0\u7279\u6027\uff0c\u8fd9\u7bc7\u6587\u7ae0\u8fd8\u5bf9Tomcat 7\u7684\u4e03\u4e2a\u6700\u503c\u5f97\u6ce8\u610f\u7684\u7279\u6027\u4e0e\u589e\u5f3a\u90e8\u5206\u8fdb\u884c\u5206\u7c7b\u3001\u8bc4\u5b9a\u4ee5\u53ca\u6f14\u793a\u53ef\u6267\u884c\u4ee3\u7801\u4ee5\u4f7f\u4f60\u80fd\u591f\u5bf9\u6bcf\u4e2a\u7279\u6027\/\u52a0\u5f3a\u6709\u4e2a\u66f4\u597d\u7684\u7406\u89e3\u3002<\/p>\n<br\/>\n\u6211\u5c06\u4e0b\u9762\u5217\u4e3e\u7684\u8fd9\u4e9b\u5206\u7c7b\u4e3a\u201cTomcat 7 \u65b0\u7279\u8272\uff1a\u521b\u65b0\u6027\u6539\u53d8\u201d\u548c\u201cTomcat 7 \u52a0\u5f3a\uff1a\u8fdb\u5316\u6027\u6539\u53d8\u201d\uff1a<br\/><br\/>\n<strong>Tomcat 7 \u65b0\u7279\u6027\uff1a\u521b\u65b0\u6027\u6539\u53d8<\/strong><br\/><br\/>\n<ol>\n<li>\u4f7f\u7528<em>\u968f\u673a\u6570\u4ee4\u724c(nonce)<\/em>\u9632\u6b62\u8de8\u7ad9\u8bf7\u6c42\u4f2a\u9020\uff08cross-site request forgery\u2014CSRF\uff09\u653b\u51fb<\/li>\n<li>\u9a8c\u8bc1\u65f6\u6539\u53d8 <em>jsessionid<\/em> \u4ee5\u9632\u6b62\u56fa\u5b9a\u4f1a\u8bdd\u653b\u51fb<\/li>\n<li>\u5185\u5b58\u6cc4\u9732\u68c0\u6d4b\u53ca\u9884\u9632<\/li>\n<li>\u4f7f\u7528\u522b\u540d\u5728<em>war<\/em>\u6587\u4ef6\u5916\u5b58\u50a8\u9759\u6001\u5185\u5bb9"},{"title":"Java \u4f55\u65e5\u80fd\u968f\u610f\u5b9e\u73b0\u81ea\u5b9a\u4e49\u7684\u5bf9\u8c61\u88c5\u7bb1","link":"https:\/\/yanbin.blog\/java-how-to-implements-custom-autobox\/","pubDate":"Tue, 11 Jan 2011 06:31:47 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-how-to-implements-custom-autobox\/","description":"\nJava \u6b65\u5165\u5230 Tiger \u540e\u589e\u52a0\u4e86\u81ea\u52a8\u62c6\u88c5\u7bb1\u7279\u6027\uff0c\u6784\u9020 Integer \u4e0d\u7528 Integer i = new Integer(1); \u6216\u8005 Integer i = Integer.valueOf(1); \u53ea\u8981\u5199\u6210 Integer i=1 \u5c31\u884c\u4e86\u3002Java \u7684\u81ea\u52a8\u62c6\u88c5\u7bb1\u53ea\u662f\u9488\u5bf9\u57fa\u672c\u7c7b\u578b\u4e0e\u5176\u5c01\u88c5\u7c7b\u578b\u4e4b\u95f4\u7684\u8f6c\u6362\uff0c\u65e0\u6cd5\u81ea\u5b9a\u4e49\u7c7b\u4f3c\u7684\u884c\u4e3a\uff0c\u6bd4\u5982\u60f3\u5b9e\u73b0\u67d0\u4e2a\u81ea\u5b9a\u4e49\u7c7b Item\uff0c\u80fd\u591f\u901a\u8fc7 Item i = 1; \u5c31\u5b8c\u6210\u4ece\u6574\u5f62 1 \u5230\u81ea\u5b9a\u4e49\u7c7b\u7684\u81ea\u52a8\u88c5\u7bb1\u529f\u80fd\u3002<\/p>\n<br\/>\nJava \u5728\u76ee\u524d\u8fd8\u662f\u6ca1\u529e\u6cd5\u505a\u5230\u7684\uff0c\u5f53\u7136\u4e5f\u662f\u6211\u81ea\u5df1\u7684\u4e00\u4e2a\u731c\u60f3\u3002Java \u7684\u81ea\u52a8\u62c6\u88c5\u7bb1\u4e0e C# \u76f8\u6bd4\u4e5f\u662f\u8981\u5f31\u4e9b\uff0cC# \u4e2d int\u00a0\u4ec5\u4ec5\u662f Int32 \u8fd9\u6837\u7684\u7c7b\u578b\u7684\u522b\u540d\uff0c\u6240\u4ee5\u5b83\u4eec\u4e5f\u662f\u7b49\u6548\u7684\uff0c\u58f0\u660e int i=0; \u4f60\u5c31\u53ef\u4ee5\u547c\u53eb i.ToString() \u65b9\u6cd5\u4e86\u3002\u53ef\u4ee5\u8bf4 C# \u6bd4 Java \u66f4\u5bf9\u8c61\u5316\u4e86\u3002<br\/><br\/>\n\u73b0\u5728\u6765\u770b\u4e0b C++ \u662f\u600e\u4e48\u5b9e\u73b0\u81ea\u5b9a\u4e49\u7c7b\u7684 Item i = 10; \u8fd9\u6837\u7684\u58f0\u660e\u7684\uff0c\u89c1\u4ee3\u7801\uff1a"},{"title":"XSLT \u8c03\u7528 Java \u7684\u7c7b\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/xslt-call-java-method\/","pubDate":"Mon, 10 Jan 2011 05:30:04 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/xslt-call-java-method\/","description":"\n\u66fe\u7ecf\u6709\u4e24\u7bc7\u4ecb\u7ecd\u4e86\u5728 XSLT \u91cc\u5982\u4f55\u8c03\u7528 C# \u6216 Js \u5199\u7684\u51fd\u6570\uff0c\u5176\u4e2d\u7528\u5230\u4e86\u4e0e\u5fae\u8f6f\u76f8\u5173\u7684\uff0c\u50cf\uff1axmlns:msxsl=\"urn:schemas-microsoft-com:xslt\",\u00a0 &lt;msxsl:script implements-prefix=\"unmifn\" language=\"C#\"&gt;\u3002\u56de\u5230\u4e86 Java \u73af\u5883\u540c\u6837\u5f97\u8003\u8651\u5728 XSLT \u4e2d\u5982\u4f55\u8c03\u7528 Java \u7684\u65b9\u6cd5\uff0c\u6bd5\u7adf\u5728 XSLT \u5916\u5904\u7406\u5185\u5bb9\u8981\u65b9\u4fbf\u8bb8\u591a\u3002<\/p>\n<br\/>\n\u53c2\u8003\u4e86\u4e00\u4e9b\u7f51\u4e0a\u7684\u6587\u7ae0\uff0c\u5927\u591a\u8bb2\u7684\u4e0d\u600e\u4e48\u597d\u7406\u89e3\u4e0e\u5e94\u7528\uff0c\u672a\u5c1d\u8bd5\u4e4b\u524d\u4e0d\u514d\u8ba9\u4eba\u60f3\u7f29\u624b\u3002\u5176\u5b9e\u505a\u8d77\u6765\u53ef\u4ee5\u66f4\u7b80\u5355\u4e9b\uff0c\u4e24\u6b65\u800c\u5df2\uff1a<br\/><br\/>\n1\uff09 \u58f0\u660e\u65f6\u6307\u5b9a\u5305\u540d\u548c\u51fd\u6570\u524d\u7f00<br \/>\n2\uff09 \u8c03\u7528\u65f6\u52a0\u4e0a\u524d\u7f00\u548c\u7c7b\u540d\u53ca\u9759\u6001\u65b9\u6cd5\uff0c\u4f20\u5165\u53c2\u6570<br\/><br\/>\n\u8981\u60f3\u518d\u6df1\u5165\u4e9b\uff0c\u53ef\u6ce8\u610f\u6709\u65f6\u5019 Java \u51fd\u6570\u5e94\u8be5\u4f20\u5165\u7684\u53c2\u6570\u7c7b\u578b\u662f\u4ec0\u4e48\uff1f\u662f\u5426\u80fd\u8c03\u7528\u975e\u9759\u6001\u65b9\u6cd5\uff0cpublic \u662f\u6700\u57fa\u672c\u7684\u8981\u6c42\uff0c\u4ee5\u53ca\u901a\u8fc7\u4ec0\u4e48\u7ec4\u4ef6\u6765\u8c03\u7528\u7684\u7b49\u7b49\u3002"},{"title":"\u4e24\u4e2a\u975e\u5e38\u5b9e\u7528\u7684\u83b7\u53d6 Spring Bean \u7684 Struts Action \u57fa\u7c7b\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/two-useful-getbean\/","pubDate":"Tue, 28 Dec 2010 09:30:16 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/two-useful-getbean\/","description":"\n\u6211\u4eec\u5728\u5b9e\u9645\u7684 Spring+Struts \u7684\u9879\u76ee\u4e2d\u4e00\u822c\u90fd\u4f1a\u5b9a\u4e49\u4e00\u4e2a Struts Action \u57fa\u7c7b\u3002\u57fa\u7c7b\u4e2d\u5f53\u7136\u662f\u63d0\u4f9b\u4e00\u4e9b\u516c\u5171\u7684\u65b9\u6cd5\u4e86\uff0c\u7528\u4e0a\u4e86 Spring \u7684\u8bdd\uff0c\u91cc\u9762\u653e\u51e0\u4e2a getBean() \u65b9\u6cd5\u5c31\u4f1a\u65b9\u4fbf\u8bb8\u591a\u3002Web \u9879\u76ee\u591a\u6570\u65f6\u5019\u6211\u60f3\u8fd8\u662f\u5728 Action \u4e2d\u6709\u7ecf\u5e38\u6027\u7684\u83b7\u53d6 Bean \u5b9e\u4f8b\uff0c\u5982\u679c\u6709\u7528\u5728\u522b\u5904\u7684\u8bdd\uff0c\u4e5f\u53ef\u4ee5\u501f\u9274\u3002<\/p>\n<br\/>\n\u5728\u6ca1\u6709\u6cdb\u578b\u652f\u6301\u4e0b\uff0c\u6211\u4eec\u4ece Spring Context \u4e2d\u83b7\u53d6 Bean \u8981\u5f3a\u578b\u8f6c\u6362\u7c7b\u578b\uff0c\u5982\uff1a<br\/><br\/>\nSomeClass some = (SomeClass)context.getBean(\"someClass\");<br\/><br\/>\n\u4e0a\u9762\u5bf9\u5e94\u7684\u65b9\u6cd5\u539f\u578b\u662f Object getBean(String beanName);<br\/><br\/>\n\u4ece jdk 1.5 \u5f00\u59cb\u6709\u6cdb\u578b\u4e86\uff0c\u53ef\u4ee5\u52a0\u4e00\u4e2a\u6cdb\u578b,\u7701\u5374\u4e86\u8f6c\u578b\u6b65\u9aa4\uff0c\u770b\u8d77\u6765\u8981\u8212\u670d\u4e00\u4e9b\uff0c\u5982\uff1a"},{"title":"Maven\u4f7f\u7528\u7b2c\u4e09\u65b9jar\u6587\u4ef6\u7684\u4e24\u79cd\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/maven-3-methods-to-use-3rd-jar\/","pubDate":"Thu, 23 Dec 2010 23:26:42 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maven-3-methods-to-use-3rd-jar\/","description":"\n\u5728Maven\u4e2d\uff0c\u4f7f\u7528\u7b2c\u4e09\u65b9\u5e93\u4e00\u822c\u662f\u901a\u8fc7pom.xml\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684dependency\u4ece\u8fdc\u7a0brepository\u4e2d\u4e0b\u8f7d\u8be5\u5e93\u3002\u4f46\u662f\u5982\u679c\u5e93\u6587\u4ef6\u662f\u516c\u53f8\u5185\u90e8\u7684\u5e93\uff0c\u6216\u8005\u5728\u672c\u5730\u800c\u4e0d\u80fd\u901a\u8fc7\u8fdc\u7a0brepository\u4e0b\u8f7d\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6709\u4e24\u79cd\u65b9\u6cd5\u53ef\u4ee5\u6ee1\u8db3\u9700\u6c42\u3002<\/p>\n<br\/>\n\u65b9\u6cd5\u4e00\uff1a<br\/><br\/>\n\u5c06\u672c\u5730\u7684jar\u6587\u4ef6\u5b89\u88c5\u5230\u672c\u5730repository\u4e2d\uff0c\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\uff1a<br \/>\n1\u3001\u51c6\u5907\u597d\u672c\u5730\u7684jar\u6587\u4ef6<br \/>\n2\u3001\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\u5b89\u88c5jar\u6587\u4ef6<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0 mvn install:install-file -Dfile=abc.jar<br \/>\n\u00a0\u00a0\u00a0\u00a0 -DgroupId=com.mycompany.myproduct -DartifactId=abc<br \/>\n\u00a0\u00a0\u00a0\u00a0 -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true<br \/>\n\u00a0\u00a0\u00a0 \u5176\u4e2d\uff0c\uff0dDfile\u5236\u5b9ajar\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u6267\u884c\u5b8c\u8be5\u547d\u4ee4\u540e\uff0c\u4f1a\u5728\u672c\u5730repository\uff08\u901a\u5e38\u662f$HOME\\.m2\u76ee\u5f55\uff09\u4e2d\u51fa\u73b0\u4e00\u4e2a\u76ee\u5f55\uff08com\uff09\uff0c\u5728\u5176\u4e0b\u4f1a\u6709\u4e00\u4e2aabc-1.0.jar\u7684\u6587\u4ef6\u548c\u4e00\u4e2a\u81ea\u52a8\u4ea7\u751f\u7684pom\u6587\u4ef6\u3002"},{"title":"\u5982\u4f55\u8ba9 Map \u4e2d\u7684\u503c\u6309\u653e\u5165\u987a\u5e8f\u8f93\u51fa","link":"https:\/\/yanbin.blog\/map-sorted-output-by-input\/","pubDate":"Tue, 07 Dec 2010 07:20:52 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/map-sorted-output-by-input\/","description":"\n<span style=\"color: #ff0000;\">\u7b14\u8005\u81f4: \u5f53\u4f60\u6253\u5f00\u8fd9\u4e2a\u9875\u9762\u7684\u65f6\u5019, \u57fa\u672c\u5c31\u65e0\u9700\u518d\u770b\u540e\u9762\u7684\u5185\u5bb9\u4e86, \u56e0\u4e3a\u76f4\u63a5\u7528 <code>LinkedHashMap<\/code>\u00a0\u5c31\u80fd\u6ee1\u8db3\u60a8\u7684\u9700\u6c42. \u00a0\u6587\u4e2d\u5bf9\u8fd9\u4e2a\u95ee\u9898\u7684\u63a2\u7d22\u53ea\u662f\u4e0d\u77e5\u9053\u522b\u4eba\u65e9\u5df2\u8fc7\u6cb3\u4e86, \u4ecd\u7136\u5728\u6cb3\u91cc\u6478\u7740\u77f3\u5934. <code>LinkedHashMap<\/code>\u00a0\u662f JDK 1.4 \u52a0\u8fdb\u6765\u7684, \u4e4b\u6240\u4ee5\u6709 <code>apache-commons ListOrderedMap<\/code>\u00a0\u5927\u7ea6\u662f\u56e0\u4e3a\u5b83\u6700\u65e9\u6240\u5904\u7684\u662f JDK 1.4 \u4e4b\u524d\u7684\u5e74\u4ee3.<\/span><\/p>\n<hr \/><br\/>\n\u5728\u4f7f\u7528 Java \u7684 Hashmap \u65f6\uff0c\u8f93\u51fa Map \u4e2d\u7684\u503c\u5982\u4f55\u4f7f\u4e4b\u6309\u653e\u5165\u7684\u987a\u5e8f\u8f93\u51fa\u6765\uff0c\u50cf List\u00a0\u90a3\u6837\u4fdd\u6301\u987a\u5e8f\u3002\u8fd9\u91cc\u7684\u987a\u5e8f\u4e0d\u662f\u8bf4\u5bf9\u96c6\u5408\u4e2d\u7684\u6570\u636e\u8fdb\u884c\u7684\u6392\u5e8f\uff0c\u8981\u662f\u7684\u8bdd\u7528 TreeMap\uff0c\u50cf TreeSet \u4e00\u6837\u5c31\u884c\u3002 \u6211\u4eec\u770b\u4e2a\u4f8b\u5b50\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">map<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">HashMap<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">map<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;a&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">12<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">map<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;b&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">11<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"n\">map<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;c&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">3<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"k\">for<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">key<\/span><span class=\"w\"> <\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"n\">map<\/span><span class=\"p\">.<\/span><span class=\"na\">keySet<\/span><span class=\"p\">())<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">map<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">key<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"Slf4j + Logback \u600e\u4e48\u8fc7\u6ee4\u6389\u7b2c\u4e09\u65b9\u5305\u4e2d\u7684\u65e5\u5fd7\u663e\u793a","link":"https:\/\/yanbin.blog\/slf4j-logback-filter-logger\/","pubDate":"Mon, 06 Dec 2010 06:17:52 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/slf4j-logback-filter-logger\/","description":"\n\u5176\u5b9e\u8fd9\u8ddf Slf4J \u901a\u7528\u65e5\u5fd7\u6846\u67b6\u6ca1\u4ec0\u4e48\u5173\u7cfb\uff0c\u5355\u5355\u662f Logback \u7684\u4e8b\uff0c\u628a Slf4J \u626f\u8fdb\u6765\u53ea\u56e0\u5b83\u4eec\u662f\u5bf9\u9ec4\u91d1\u7ec4\u5408\u3002<\/p>\n<br\/>\n\u6211\u4eec\u5728 log4j \u4e2d\u60f3\u8981\u4e0d\u663e\u793a\u7b2c\u4e09\u65b9\u5305\u7684\u975e\u5e38\u5197\u4f59\u7684\u65e5\u5fd7\u8f93\u51fa\u65f6\uff0c\u53ea\u8981\u5728 log4j.properties \u4e2d\u5199\u4e0a\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java-properties\" data-lang=\"java-properties\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"na\">log4j.logger.org.hibernate<\/span><span class=\"o\">=<\/span><span class=\"s\">ERROR<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8fd9\u6837\u5728 hibernate \u91cc\u7684\u65e5\u5fd7\u7ea7\u522b\u5728 ERROR \u4ee5\u4e0b\u7684 TRACE\u3001DEBUG\u3001WARN \u548c INFO \u5c06\u4e0d\u88ab\u8f93\u51fa\uff0c\u63a7\u5236\u53f0\u4f1a\u6bd4\u8f83\u7684\u5e72\u51c0\u3002<br\/><br\/>\nLogback \u7684\u914d\u7f6e\u6587\u4ef6\u662f logback.xml\uff0c\u66fe\u7ecf\u5728\u91cc\u9762\u7ed9 &lt;appender&gt; \u52a0\u7684 &lt;pattern&gt; \u662f\uff1a"},{"title":"iText \u7528 HTMLWorker \u8f6c\u6362 HTML \u4e3a PDF \u65f6\u53ef\u8bbe\u7f6e\u8868\u683c\u5217\u5bbd\u5ea6","link":"https:\/\/yanbin.blog\/itext-htmlworker-html2pdf-table-cellwidth\/","pubDate":"Sun, 05 Dec 2010 06:58:57 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/itext-htmlworker-html2pdf-table-cellwidth\/","description":"\n\u751f\u6210 pdf \u7684\u65b9\u5f0f\u6709\u591a\u79cd\uff0c\u76f4\u63a5\u7528 iText \u7f16\u7801\u63a7\u5236\u4ea7\u751f\uff0cfop \u8f6c\u6362\uff0c\u4e0d\u8fc7\u6211\u89c9\u5f97\u5f88\u65b9\u4fbf\u7684\u4e00\u79cd\u65b9\u6cd5\u5c31\u662f\u7528 iText \u7684 HTMLWorker \u7c7b\u76f4\u63a5\u628a HTML \u8f6c\u6362\u6210\u76f8\u5e94\u7684 PDF \u6587\u6863\uff0cHTMLWorker \u53ef\u652f\u6301\u56fe\u7247\u548c\u8868\u683c\uff0c\u4e00\u5b9a\u6570\u91cf\u7684\u6837\u5f0f\u63a7\u5236\u3002\u8fd9\u6837\u53ef\u4ee5\u8ba9\u6211\u4eec\u5173\u6ce8\u5230 HTML \u9875\u9762\u8bbe\u8ba1\u4e0a\uff0c\u81f3\u4e8e\u8f6c\u6362\u51fa\u6765\u7684\u6548\u679c\u5c31\u8981\u770b\u6bcd\u7248 HTML \u7684\u8bbe\u8ba1\u529f\u5e95\u4e86\u3002\u8981\u77e5\u9053\u8fd9\u4e2a HTML \u4e2d\u7684\u6837\u5f0f\u8981\u8ba9 HTMLWorker \u53ef\u7406\u89e3\u7684\uff0c\u5e76\u975e\u8bf4\u80fd\u652f\u6301 CSS2 \u8fd8\u662f CSS3\u3002HTMLWorker \u80fd\u652f\u6301\u7684\u6837\u5f0f\u8fd8\u662f\u975e\u5e38\u6709\u9650\uff0c\u5e76\u4e14\u8fd8\u672a\u6587\u6863\u5316\u7684\uff0c\u6709\u4e9b\u591a\u8bd5\u8bd5\uff0c\u80fd\u770b\u770b\u6e90\u4ee3\u7801\u662f\u81ea\u7136\u53ef\u4ee5\u8ba9\u80f8\u4e2d\u66f4\u6709\u6570\u4e86\u3002<\/p>\n<br\/>\n\u9879\u76ee\u4e2d\u6709\u4e00\u4e2a\u6bd4\u8f83\u8feb\u5207\u7684\u95ee\u9898\u662f\u628a HTML \u4e2d\u7684\u8868\u683c\u8f6c\u6362\u6210 PDF \u7684 PdfPTable \u65f6\uff0c\u65e0\u8bba\u662f\u5728 &lt;td&gt; \u4e0a\u7528 width=\"xxx\" \u6216\u662f style=\"width:xxx\" \u65f6\u90fd\u770b\u4e0d\u5230\u5bbd\u5ea6\u7684\u8bbe\u7f6e\u6548\u679c\uff0ciText \u603b\u662f\u8ba9\u751f\u6210\u7684 PdfPTable \u5e73\u5747\u5206\u914d\u5355\u5143\u683c\u5bbd\u5ea6\u7684\u3002\u8fd9\u5bf9\u4e8e\u5355\u5143\u683c\u5bbd\u5ea6\u6709\u8fc7\u4e8e\u60ac\u6b8a\u7684\u9700\u6c42\u662f\u65e0\u6cd5\u59a5\u534f\u7684\uff0c\u6240\u4ee5\u8981\u4e00\u79cd\u529e\u6cd5\u6765\u652f\u6301\u81ea\u5b9a\u4e49\u5355\u5143\u683c\u5bbd\u5ea6\uff0c\u8ba9 width=\"xxx\"\u00a0 \u6216\u662f style=\"width:xxx\" \u6709\u4e00\u79cd\u63a7\u5236\u80fd\u529b\u5c31\u884c\u3002\u53c8\u5f97\u6539\u6e90\u4ee3\u7801\u4e86\uff0c\u7f51\u4e0a\u627e\u5230\u4e86\u662f\u652f\u6301 iText 2.1.7\u00a0\u7684\u6539\u6cd5\uff0c\u672c\u7bc7\u662f\u9488\u5bf9 iText 5.0.4 \u7684\u505a\u6cd5\uff0c\u4f7f\u652f\u6301 width=\"10%\" \u767e\u5206\u6bd4\u6765\u63a7\u5236\u5355\u5143\u683c\u5bbd\u5ea6\u3002"},{"title":"\u7406\u89e3 Java \u6b63\u5219\u8868\u8fbe\u5f0f\u602a\u5f02\u7684 \\\\ \u548c \\\\\\\\\uff0c\u8ba9\u60a8\u89c1\u602a\u4e0d\u602a","link":"https:\/\/yanbin.blog\/understand-java-regex-backslash\/","pubDate":"Mon, 29 Nov 2010 06:40:57 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-regex-backslash\/","description":"\n<p>Java \u8bed\u8a00\u91cc\u7684\u51e0\u5927\u53d8\u9769\uff0c\u4e00\u4e3a jdk1.4 \u5f15\u5165\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\uff0cjdk1.5 \u5f15\u5165\u7684\u6cdb\u578b\u3002\u6ca1\u6709\u6cdb\u578b\u4e4b\u524d\u6709\u4e0d\u5c11\u4eba\u66fe\u60f3\u65b9\u8bbe\u6cd5\u4ece\u7f16\u8bd1\u5668\u5165\u624b\u8ba9 Java \u652f\u6301\u6cdb\u578b\u3002\u8bf4\u5230\u6cdb\u578b\u00a0 Perl \u65e0\u7591\u662f\u8be5\u65b9\u9762\u7684\u4f7c\u4f7c\u8005\uff0c\u867d\u7136\u6211\u4eec\u4e0d\u8981\u6c42 Java \u7684\u6b63\u5219\u8868\u5f0f\u80fd\u50cf Perl \u90a3\u6837\u53ef\u4ee5\u7528\u6765\u5199\u8bd7\uff0c\u4f46\u81f3\u5c11\u80fd\u6709 JavaScript \u597d\u7528\u4e9b\uff0c\u53ef\u662f\u8fd8\u4e0d\u5982\u3002JavaScript \u91cc \/\/ \u4e24\u659c\u7ebf\u4e00\u6846\u5c31\u662f\u4e00\u4e2a\u6a21\u5f0f\uff0c\u5206\u7ec4\u548c\u540e\u5411\u5f15\u7528\u66f4\u65b9\u4fbf\uff0c\u5f53\u7136\u524d\u9762\u90a3\u4e24\u5bb6\u4f19\u662f\u52a8\u6001\u7684\uff0c\u4e0d\u592a\u597d\u6bd4\u3002<\/p>\n<p>\u590d\u6742\u7684\u7528\u6cd5\u4e0d\u8bf4\uff0c\u4e14\u8bf4 Java \u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5728\u5339\u914d\u70b9(.) \u00a0\u548c\u659c\u6760(\\)\uff0c\u8868\u8fbe\u5f0f\u8981\u5206\u522b\u5199\u4f5c \\\\. \u548c <a>\\\\\\\\<\/a>\uff0c\u96be\u770b\u4e9b\uff0c\u4e0d\u597d\u7406\u89e3\u3002\u5e78\u597d\u8fd8\u6709\u4e9b\u4eba\u8bb0\u4f4f\u4e86\uff0c\u5339\u914d\u70b9(.) \u6216\u00a0\u00a0{\u3001[\u3001(\u3001?\u3001$\u3001^ \u548c * \u8fd9\u4e9b\u7279\u6b8a\u7b26\u53f7\u8981\u8981\u524d\u52a0\u53cc\u659c\u6846\uff0c\u5339\u914d \\ \u65f6\u8981\u7528\u56db\u659c\u6760\uff0c\u8fd9\u786e\u5b9e\u80fd\u8ba9\u4f60\u5305\u8d70\u5929\u6daf\u7684\u3002\u90a3\u4e48\u4e3a\u4ec0\u4e48\u662f\u8fd9\u6837\u5462\uff0c\u4e0d\u662f\u4e00\u4e2a\u659c\u6760\u3001\u4e09\u4e2a\u6216\u66f4\u591a\u5462\uff0c\u6240\u4ee5\u77e5\u5176\u7136\u8fd8\u8981\u77e5\u5176\u6240\u4ee5\u7136\uff0c\u8fd9\u6837\u624d\u80fd\u6bcf\u6b21\u5fc3\u4e2d\u6709\u6570\uff0c\u65b9\u80fd\u4ee5\u4e00\u53d8\u5e94\u4e07\u53d8\u3002"},{"title":"\u5982\u4f55\u5728 js \u4ee3\u7801\u4e2d\u4f7f\u7528 jsp \u6807\u7b7e\u6216 Java \u4ee3\u7801","link":"https:\/\/yanbin.blog\/use-jsp-tag-in-js\/","pubDate":"Wed, 17 Nov 2010 06:01:04 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/use-jsp-tag-in-js\/","description":"\nJSP \u6807\u7b7e\u8fd8\u662f\u5f88\u65b9\u4fbf\u7684\uff0c\u6bd4\u5982 Struts\u3001Spring \u7b49\u63d0\u4f9b\u7ed9\u6211\u4eec\u7684 JSP \u6807\u7b7e\uff0c\u53ef\u4ee5\u7528\u5b83\u4eec\u6765\u83b7\u53d6\u53d8\u91cf\u6216\u8fdb\u884c\u4e00\u4e9b\u8ba1\u7b97\u3002\u6bd4\u5982 struts2 \u7684 &lt;s:url value=\"\/admin\/unmi.action\"\/&gt; \u4f1a\u4e3a\u6211\u4eec\u81ea\u52a8\u5728\u524d\u9762\u9644\u52a0\u4e0a\u5e94\u7528\u4e0a\u4e0b\u6587\uff0c\u5982\u5b9e\u9645\u4f1a\u751f\u6210 \/testsite\/admin\/unmi.action\u3002\u8fd8\u6709\u66f4\u591a\u66f4\u65b9\u4fbf\u7684\u6807\u7b7e\u4f7f\u7528\uff0c\u6bd4\u5982\u7528\u6807\u7b7e\u83b7\u53d6\u5230 session \u6216\u8bf7\u6c42\u4e2d\u7684\u6570\u636e\u4f5c\u4e3a js \u7684\u53d8\u91cf\u7b49\u3002\u00a0<\/p>\n<br\/>\n\u5f15\u7533\u6b64\u8bdd\u9898\u7684\uff0c\u5176\u5b9e\u4e0d\u5149\u662f\u5728 JS \u4e2d\u4f7f\u7528 JSP \u6807\u7b7e\uff0c\u53ef\u7528 JSP \u6807\u7b7e\u7684\u5730\u65b9\u5f53\u7136\u53ef\u4ee5\u76f4\u63a5\u5199 Java \u4ee3\u7801\uff0c\u5373 ScriptLet \u4ee3\u7801\u3002"},{"title":"\u7528 DbUnit \u6267\u884c export \u5bfc\u51fa\u6570\u636e\u65f6\u62a5 MySQLSyntaxErrorException","link":"https:\/\/yanbin.blog\/dbunit-export-from-exception\/","pubDate":"Mon, 25 Oct 2010 11:21:46 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dbunit-export-from-exception\/","description":"\n\u6211\u662f\u501f\u52a9\u4e8e dbunit-maven-plugin \u6765\u4f7f\u7528 DbUnit \u7684\uff0c\u6570\u636e\u5e93\u662f MySql\uff0c\u5728\u4f7f\u7528 <span style=\"color: #800000;\">mvn dbunit:export<\/span> \u6307\u4ee4\u65f6\uff0c\u603b\u62a5\u9519\uff1a<br\/>\n<br\/>\n<span style=\"color: #ff0000;\">Embedded error: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc from unmi_test_table order by Id' at line 1<\/span><br\/>\n<br\/>\n\u82e5\u662f\u52a0\u4e0a -e \u6216 -X \u53c2\u6570\uff0c\u5982 <span style=\"color: #800000;\">mvn dbunit:export -e<\/span> \u65f6\u53ef\u4ee5\u770b\u5230\u66f4\u8be6\u7ec6\u7684\u5f02\u5e38\u4fe1\u606f\uff1a<br\/>\n<br\/>\n<span style=\"color: #ff0000;\">Caused by: org.apache.maven.plugin.MojoExecutionException: Error executing export"},{"title":"\u7528 dbunit-maven-plugin \u6765\u7ba1\u7406\u4f60\u7684\u6d4b\u8bd5\u6570\u636e","link":"https:\/\/yanbin.blog\/dbunit-maven-test-data\/","pubDate":"Sat, 23 Oct 2010 02:14:43 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dbunit-maven-test-data\/","description":"\n\u5355\u5143\u6d4b\u8bd5\u6709\u4eba\u5199\u8fc7\uff0c\u4e5f\u6709\u4eba\u6ca1\u505a\u8fc7\uff0c\u6570\u636e\u5e93\u7684 dbunit \u7684\u7528\u7684\u4eba\u5e94\u8be5\u66f4\u5c11\u4e86\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u7ed9\u4f60\u505a\u6d4b\u8bd5\u51c6\u5907\u6570\u636e\u3002\u4e00\u822c\u6211\u4eec\u505a\u6d4b\u8bd5\u4f1a\u5728\u4e00\u4e2a\u6d4b\u8bd5\u6570\u636e\u5e93\u4e2d\u4e0d\u505c\u7684\u6d4b\uff0c\u81ea\u7136\u4f1a\u7d2f\u79ef\u8bb8\u591a\u5783\u573e\u6570\u636e\uff0c\u7ed9\u5355\u5143\u6d4b\u8bd5\u4f1a\u9020\u6210\u4e0d\u4fbf\uff0c\u529f\u80fd\u6d4b\u8bd5\u5012\u65e0\u592a\u7d27\u8981\u3002\u5982\u679c\u6211\u4eec\u60f3\u5728\u5355\u5143\u6d4b\u8bd5\u7684\u65f6\u5019\u6709\u4e00\u4efd\u5e72\u51c0\u7684\u6570\u636e\uff0c\u6709\u4e2a\u505a\u6cd5\u662f\u641e\u4e2a\u5907\u7528\u7684\u6570\u636e\u5e93\uff0c\u6d4b\u8bd5\u524d\u5bfc\u5230\u6d4b\u8bd5\u5e93\u7684\uff0c\u6216\u7528\u67d0\u4e9b\u6570\u636e\u5e93\u7684\u5bfc\u5165\u5bfc\u51fa\u529f\u80fd\u3002<\/p>\n<br\/>\n\u8fd9\u91cc\u6211\u4eec\u6765\u770b dbunit \u600e\u4e48\u5b9e\u73b0\u51c6\u5907\u6d4b\u8bd5\u6570\u636e\u7684\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u5bfc\u51fa\u6570\u636e\u5e93\u6570\u636e\u5230\u6570\u636e\u6587\u4ef6\u4e2d\uff0c\u4ece\u6570\u636e\u6587\u4ef6\u4e2d\u5bfc\u5165\u5e72\u51c0\u7684\u6570\u636e\u5230\u6570\u636e\u5e93\u4e2d\uff0c\u6bd4\u8f83\u6570\u636e\u5e93\u4e0e\u6570\u636e\u6587\u4ef6\u3001\u6216\u589e\u91cf\u7684\u63d2\u5165\u8bb0\u5f55\u7b49\u7b49\u3002"},{"title":"\u628a Lucene \u7d22\u5f15\u6570\u636e\u5b58\u5230\u6570\u636e\u5e93\u8868\u4e2d","link":"https:\/\/yanbin.blog\/store-lucene-index-in-database\/","pubDate":"Tue, 19 Oct 2010 08:27:49 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/store-lucene-index-in-database\/","description":"\n\u4e00\u822c\u6211\u4eec\u90fd\u662f\u628a Lucene \u7d22\u5f15\u5b58\u653e\u5728\u6587\u4ef6\u7cfb\u7edf\u4e2d\uff0c\u5927\u6570\u636e\u91cf\u65f6\u4f1a\u8003\u8651\u7528\u5206\u5e03\u5f0f\u6587\u4ef6\u7cfb\u7edf\uff0c\u5982 Hadoop \u53ca MapReduce\u3001GFS \u7684\u5e94\u7528\u3002\u4e5f\u8bb8\u4f60\u4f1a\u60f3\u6211\u4eec\u6709\u6570\u636e\u5e93\u4f5c\u4e3a\u96c6\u4e2d\u7684\u6570\u636e\u5b58\u50a8\u5730\uff0c\u662f\u5426\u53ef\u4ee5\u628a Lucene \u7d22\u5f15\u6587\u4ef6\u5b58\u50a8\u5230\u5173\u7cfb\u578b\u6570\u636e\u5e93\u4e2d\u3002\u53ef\u4ee5\u8fd9\u4e48\u505a\uff0c\u4e0d\u8fc7\u597d\u50cf\u6027\u80fd\u4e0a\u6709\u4e9b\u95ee\u9898\uff0c\u672c\u6587\u5c31\u6b64\u4e5f\u4f5c\u8fd9\u6837\u4e00\u4e2a\u5c1d\u8bd5\u3002<br\/>\n<br\/>\n\u770b <a href=\"http:\/\/wiki.apache.org\/lucene-java\/LuceneFAQ\">http:\/\/wiki.apache.org\/lucene-java\/LuceneFAQ<\/a><br\/>\nCan I store the Lucene index in a relational database?<br\/>\nLucene does not support that functionality out of the box, but several people have implemented <a href=\"http:\/\/www.google.com\/search?q=jdbcdirectory%20lucene'\" target=\"_blank\">JdbcDirectory's<\/a>. The reports we have seen so far indicate that performance with such implementations is not great, but it is doable."},{"title":"\u5728 Java Web \u9879\u76ee\u4e2d\u9009\u62e9\u4f7f\u7528 Slf4J \u901a\u7528\u65e5\u5fd7\u6846\u67b6","link":"https:\/\/yanbin.blog\/java-web-slf4j-logback\/","pubDate":"Sat, 16 Oct 2010 12:00:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-web-slf4j-logback\/","description":"\n\u5728\u524d\u4e00\u7bc7\u65e5\u5fd7\uff1a<a href=\"https:\/\/yanbin.blog\/ssh-ssi-slf4j-logback\" target=\"_blank\" rel=\"noopener\">Java \u6d41\u884c\u6846\u67b6(Spring\/Struts2\/Hibernate\/iBatis)\u90fd\u5728\u4f7f\u7528\u4ec0\u4e48\u65e5\u5fd7\u7ec4\u4ef6<\/a>\uff0c\u4ecb\u7ecd\u4e86\u5f53\u524d\u6d41\u884c\u6846\u67b6 Spring\u3001 Struts2\u3001 Hibernate\u3001iBatis(Mybatis) \u5206\u522b\u4f7f\u7528\u7684\u662f\u4ec0\u4e48\u901a\u7528\u65e5\u5fd7\u7ec4\u4ef6\uff1a\n<br\/> <br\/>\nSpring 3.0.4\uff1aCommons-Logging<br \/>\nStruts 2.2.1\uff1a\u95f4\u63a5\u7684\u4f18\u5148\u652f\u6301 Commons-Logging<br \/>\nHibernate 3.6.0\uff1a\u76f4\u63a5\u7684\u4f7f\u7528 Slf4J<br \/>\niBatis\/MyBatis 3.0.2\uff1a\u95f4\u63a5\u7684\u4f18\u5148\u4f7f\u7528 Slf4J<br\/><br\/>\n\u518d\u8003\u8651 Slf4J \u4ee5\u53ca Logback \u7684\u4f18\u8d8a\u6027\uff0c\u6027\u80fd\u5f97\u5230\u7684\u6539\u5584\uff0c\u591a JVM \u5199\u540c\u4e00\u65e5\u5fd7\u6587\u4ef6\u90fd\u65e0\u59a8\uff0c\u65b9\u4fbf\u8fd0\u7528\u4e8e OSGI \u73af\u5883\uff0c\u81ea\u52a8\u538b\u7f29\u65e5\u5fd7\uff0c\u53c2\u6570\u5316\u3002\u6240\u4ee5\u4e2a\u4eba\u8ba4\u4e3a\u5728 SSH \u6216 SSI \u9879\u76ee\u4e2d\u63a8\u8350\u7528<br\/><br\/>\n<u>Slf4J + Logback<\/u> \u5bf9\u4e8e Hibernate \u548c iBatis\/MyBatis \u76f4\u63a5\u8d70\u8fd9\u6761\u8def<br \/>\n<u>jcl-over-slf4j + Logback<\/u> \u5bf9\u4e8e Spring \u548c Struts2\uff0c\u9700\u7528\u7528 jcl-over-slf4j \u628a Commons-Logging \u6865\u63a5\u5230 Slf4J\uff0c\u7136\u540e Logback\u3002"},{"title":"Java \u6d41\u884c\u6846\u67b6(Spring\/Struts2\/Hibernate\/iBatis)\u90fd\u5728\u4f7f\u7528\u4ec0\u4e48\u65e5\u5fd7\u7ec4\u4ef6","link":"https:\/\/yanbin.blog\/ssh-ssi-slf4j-logback\/","pubDate":"Sat, 16 Oct 2010 06:28:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ssh-ssi-slf4j-logback\/","description":"\n\u505a Java Web \u5e94\u7528\u6211\u60f3\u591a\u4f1a\u91c7\u7528\u8fd9\u4e24\u79cd\u6846\u67b6\u7ec4\u5408\uff0cSSH \u548c SSI\uff0c\u5176\u5b9e\u6211\u662f\u4e0d\u592a\u559c\u6b22\u7528\u8fd9\u4e24\u79cd\u7f29\u5199\u65b9\u5f0f\uff1a<br\/>\n<br\/>\nSSH = Spring + Struts + Hibernate\uff0cSSH \u7531\u4e45\u5df2\u4e45\u6240\u4ee3\u8868\u7684\u662f Secure Shell\uff0c\u50cf https<br\/>\nSSI = Spring + Struts + iBatis\uff0cSSI \u5728\u5f88\u4e45\u4ee5\u524d\u5c31\u662f Server Side Include\uff0c\u50cf shtml\uff0c\u800c iBatis \u5df2\u66f4\u540d\u4e3a MyBatis \u4e86\u3002<br\/>\n<br\/>\n\u8981\u662f\u5728\u4ee5\u5f80\u505a\u8fd9\u6837\u7684 Java \u9879\u76ee\u90fd\u4f1a\u7528 Commons-Logging + Log4J \u6765\u4f5c\u4e3a\u65e5\u5fd7\u6846\u67b6\uff0c\u56e0\u4e3a\u591a\u6570\u7ec4\u4ef6\u7528\u7684\u662f Common-Logging \u901a\u7528\u7ec4\u4ef6\uff0c\u800c\u90a3\u65f6 Log4J \u63a7\u5236\u5b9e\u9645\u7684\u65e5\u5fd7\u8f93\u51fa\u4e5f\u662f\u6700\u5f3a\u7684\u3002<br\/>"},{"title":"\u4f7f\u7528 SiteMesh2 \u65f6\u4e3a\u6bcf\u4e2a\u9875\u9762\u6307\u5b9a\u4e0d\u540c\u7684 body id \u503c","link":"https:\/\/yanbin.blog\/sitemesh2-different-body-id\/","pubDate":"Wed, 13 Oct 2010 12:29:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/sitemesh2-different-body-id\/","description":"\nSiteMesh \u662f\u4e00\u4e2a\u5f88\u597d\u7684 Java Web \u6a21\u677f\u6846\u67b6\uff0c\u5b83\u7684\u601d\u7ef4\u65b9\u5f0f\u4e0e\u901a\u5e38\u7684\u6a21\u677f\u5b9e\u73b0(\u6bd4\u5982 Tiles \u6216 include)\u6709\u4e9b\u533a\u522b\u3002SiteMesh \u6a21\u677f\u4e00\u65e6\u914d\u7f6e\u597d\u540e\uff0c\u5728\u7f16\u8f91\u5185\u5bb9\u9875\u65f6\u53ef\u4ee5\u5ffd\u89c6\u5b83\u7684\u5b58\u5728\u3002\u53ef\u4ee5\u5b83\u662f\u88ab\u52a8\uff0c\u5185\u5bb9\u9875\u4e2d\u7684\u8f93\u51fa\u88ab<strong>\u62bd\u53d6<\/strong>\u5230\u6a21\u677f\u4e2d\uff0c\u4e00\u822c\u7684\u6a21\u677f\u4e3a\u4e3b\u52a8\u7684\u628a\u81ea\u5df1\u67d0\u90e8\u5206\u5185\u5bb9\u53bb<strong>\u586b\u5145<\/strong>\u6a21\u677f\u3002<\/p>\n<br\/>\n\u5728\u7ad9\u70b9\u4e2d\u5e94\u7528\u6837\u5f0f\u6216 JS \u4ee3\u7801\u65f6\u5f88\u53ef\u80fd\u4f1a\u4f9d\u8d56\u4e8e\u6bcf\u4e2a\u9875\u9762\u7684 &lt;body&gt; \u7684 id\uff0c\u6bd4\u5982\uff1a<br\/><br\/>\nbody#archive primary{....} \/** \u6837\u5f0f **\/<br \/>\n$(\"body#archive\").bgColor='red'; \/\/JS\n\u6240\u4ee5\u5c31\u8981\u6c42\u6bcf\u4e2a\u9875\u9762\u6709\u4e0d\u540c\u7684 body id \u503c\u3002\u5728\u5f88\u591a SiteMesh \u7684\u4f8b\u5b50\u4e2d\u9875\u9762\u6e32\u67d3\u540e body \u90fd\u6ca1\u6709 id \u503c\u7684\uff0c\u6216\u662f\u76f8\u540c\u7684 id \u503c\u3002"},{"title":"\u6b65\u6b65\u7406\u89e3 JAVA \u6cdb\u578b\u7f16\u7a0b(\u4e09)","link":"https:\/\/yanbin.blog\/understand-java-generic-3\/","pubDate":"Fri, 16 Apr 2010 04:53:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-generic-3\/","description":"\n\u524d\u9762\u4ecb\u7ecd\u7684\u65e0\u8bba\u662f\u6cdb\u578b\u7c7b\u8fd8\u662f\u6cdb\u578b\u65b9\u6cd5\uff0c\u57fa\u672c\u4e0a\u90fd\u662f\u628a\u5b9a\u4e49\u7684\u7c7b\u578b\u53c2\u6570\u4f5c\u4e3a\u4e00\u4e2a\u6574\u4f53\u6765\u64cd\u4f5c\uff0c\u653e\u5230\u6570\u7ec4\u6216\u53d6\u51fa\u6765\uff0c\u9876\u591a\u5c31\u662f\u8c03\u7528\u4e86\u4e00\u4e0b hashCode() \u65b9\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u662f Java \u7684\u6839\u5bf9\u8c61\u62e5\u6709\u7684\u65b9\u6cd5\u3002\u6bd4\u5982\u8bf4\u4e00\u4e2a\u6cdb\u578b\u6570\u7ec4\uff0c\u8981\u5f97\u5230\u5176\u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">com.unmi<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"cm\"> * \u6cdb\u578b\uff0c\u7c7b\u578b\u53d8\u91cf\u7684\u9650\u5b9a\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">ArrayAlg<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">T<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">T<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"o\">==<\/span><span class=\"kc\">null<\/span><span class=\"w\"> <\/span><span class=\"o\">||<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"na\">length<\/span><span class=\"w\"> <\/span><span class=\"o\">==<\/span><span class=\"n\">0<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"kc\">null<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">T<\/span><span class=\"w\"> <\/span><span class=\"n\">smallest<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"o\">[<\/span><span class=\"n\">0<\/span><span class=\"o\">]<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">i<\/span><span class=\"o\">=<\/span><span class=\"n\">0<\/span><span class=\"p\">;<\/span><span class=\"n\">i<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"na\">length<\/span><span class=\"p\">;<\/span><span class=\"n\">i<\/span><span class=\"o\">++<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">smallest<\/span><span class=\"p\">.<\/span><span class=\"na\">compareTo<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span><span class=\"o\">&gt;<\/span><span class=\"n\">0<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">smallest<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">smallest<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u6b65\u6b65\u7406\u89e3 JAVA \u6cdb\u578b\u7f16\u7a0b(\u4e8c)","link":"https:\/\/yanbin.blog\/understand-java-generic-2\/","pubDate":"Thu, 15 Apr 2010 23:56:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-generic-2\/","description":"\n\u524d\u9762\u8bb2\u4e86\u6cdb\u578b\u7c7b\u7684\u5b9a\u4e49\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u4e00\u4e2a\u666e\u901a\u7c7b\u4e2d\u5355\u5355\u5b9a\u4e49\u4e00\u4e2a\u6cdb\u578b\u65b9\u6cd5\u3002\u4e5f\u5c31\u662f\u8bf4\u7c7b\u80fd\u591f\u5e26\u4e2a\u7c7b\u578b\u53c2\u6570\uff0c\u65b9\u6cd5\u4e5f\u53ef\u4ee5\u5e26\u7c7b\u578b\u53c2\u6570\u7684\u3002\u8fd8\u662f\u6765\u770b\u4e2a\u4f8b\u5b50(\u5305\u62ec\u5982\u4f55\u5e94\u7528)\uff0c\u4e00\u4e2a\u83b7\u5f97\u6570\u7ec4\u4e2d\u95f4\u5143\u7d20\u7684\u65b9\u6cd5\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5b58\u50a8\u5143\u7d20\u7684\u7c7b\u578b\u662f\u4e0d\u5b9a\u7684\uff0c\u6240\u4ee5\u628a\u8be5\u65b9\u6cd5\u5b9a\u4e49\u6210\u6cdb\u578b\u7684\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">com.unmi<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"cm\"> * \u6cdb\u578b\u65b9\u6cd5\u793a\u4f8b\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">ArrayAlg<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u8fd9\u4e2a\u5c31\u662f\u5728\u666e\u901a\u7c7b ArrayAlg \u4e2d\u5b9a\u4e49\u7684\u6cdb\u578b\u65b9\u6cd5<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">T<\/span><span class=\"w\"> <\/span><span class=\"nf\">getMiddle<\/span><span class=\"p\">(<\/span><span class=\"n\">T<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"p\">){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">a<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"na\">length<\/span><span class=\"o\">\/<\/span><span class=\"n\">2<\/span><span class=\"o\">]<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">names<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"s\">&#34;Fantasia&#34;<\/span><span class=\"p\">,<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">,<\/span><span class=\"s\">&#34;Kypfos&#34;<\/span><span class=\"p\">};<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c1\">\/\/String middle = ArrayAlg.&lt;String&gt;getMiddle(names);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u4e0a\u9762\u90a3\u6837\u5199\u662f\u53ef\u4ee5\uff0c\u7f16\u8bd1\u5668\u53ef\u63a8\u65ad\u51fa\u8981\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u6240\u4ee5\u7701\u53bb&lt;String&gt;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">middle<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayAlg<\/span><span class=\"p\">.<\/span><span class=\"na\">getMiddle<\/span><span class=\"p\">(<\/span><span class=\"n\">names<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">middle<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u6b65\u6b65\u7406\u89e3 JAVA \u6cdb\u578b\u7f16\u7a0b(\u4e00)","link":"https:\/\/yanbin.blog\/understand-java-generic-1\/","pubDate":"Thu, 15 Apr 2010 12:13:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-generic-1\/","description":"\nJDK 1.5 \u76f8\u5bf9\u4e8e JDK 1.4 \u6765\u8bf4\u53d8\u5316\u6700\u5927\u7684\u90e8\u5206\u5c31\u662f\u6cdb\u578b\uff0c\u751a\u81f3\u53ef\u4ee5\u8bf4\u81ea Java 1.0 \u53d1\u5e03\u4ee5\u6765\u4e5f\u662f\u6700\u5927\u7684\u4e00\u6b21\u8bed\u8a00\u53d8\u5316\uff0c\u56e0\u4e3a\u8981\u6d89\u53ca\u5230\u7f16\u8bd1\u5668\u7684\u5927\u6539\u52a8\u3002\u5f88\u65e9\u7684\u65f6\u5019\u5927\u5bb6\u5bf9\u6cdb\u578b\u7684\u547c\u58f0\u5f88\u5927\uff0c\u6b63\u5982 C++ \u7684\u6a21\u677f\uff0cC# \u7684\u6cdb\u578b\u786e\u5b9e\u662f\u4e2a\u503c\u5f97\u501f\u9274\u7684\u597d\u7279\u6027\u3002JDK1.5 \u8fd9\u524d\uff0c\u5f88\u591a\u4eba\u5bf9\u4e8e\u6cdb\u578b\u662f\u6025\u4e0d\u53ef\u8010\uff0c\u5728 JDK1.4\u00a0\u4e0b\u642d\u914d\u4e00\u4e2a\u5916\u6302\u7684 Generic Java \u7f16\u8bd1\u5668\uff0c\u901a\u8001\u5b9e -Xbootclasspath\u3001-bootclasspath \u540c\u6837\u80fd\u8ba9\u4f60\u5728 1.4\u00a0\u7684 JDK \u4e0a\u4f7f\u7528\u6cdb\u578b\uff1a<\/p>\n<br\/>\njavac -J-Xbootclasspath\/p:JSR14HOME\\gjcrt.jar -bootclasspath JSR14HOME\\collect.jar;JDK141HOME\\jre\\lib\\rt.jar -source 1.5 FileName.java<br \/>\njava -Xbootclasspath\/p:JSR14HOME\\gjc-rt.jar FileName"},{"title":"JMS \u4f7f\u7528 ActiveMQ \u4f20\u9001\u6587\u4ef6","link":"https:\/\/yanbin.blog\/jms-use-activemq-transfer-file\/","pubDate":"Sun, 11 Apr 2010 10:27:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jms-use-activemq-transfer-file\/","description":"\n\u8fd9\u91cc\u4f7f\u7528\u7684 MQ \u4e2d\u95f4\u4ef6\u662f\u5f00\u6e90\u7684 ActiveMQ\uff0c\u6211\u4eec\u6ca1\u6709\u91c7\u7528 BytesMessage \u6765\u6309\u5b57\u8282\u4f20\u9001\u6587\u4ef6\uff0c\u800c\u662f ActiveMQ \u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86 <a href=\"http:\/\/activemq.apache.org\/maven\/5.3.1\/activemq-core\/apidocs\/org\/apache\/activemq\/BlobMessage.html\" target=\"_blank\" rel=\"noopener\">org.apache.activemq.BlobMessage<\/a>\uff0c\u53ef\u4ee5\u7528\u5b83\u6765\u4f20\u9001\u5927\u5bf9\u8c61\u3002<a href=\"http:\/\/activemq.apache.org\/maven\/5.3.1\/activemq-core\/apidocs\/org\/apache\/activemq\/ActiveMQSession.html\" target=\"_blank\" rel=\"noopener\">org.apache.activemq.ActiveMQSession<\/a>\u00a0\u4e2d\u6709\u4ee5\u4e0b\u51e0\u4e2a\u521b\u5efa BlobMessage \u5bf9\u8c61\u7684\u65b9\u6cd5\uff1a<\/p>\n<br\/>\ncreateBlobMessage(URL url)<br\/><br\/>\ncreateBlobMessage(URL url, boolean deletedByBroker)<br\/><br\/>\ncreateBlobMessage(File file)<br\/><br\/>\ncreateBlobMessage(InputStream in)<br\/><br\/>\n\u63a5\u6536\u5230 BlobMessage \u6d88\u606f\u540e\uff0c\u53ef\u4ee5\u8c03\u7528\u5176 getInputStream() \u65b9\u6cd5\u83b7\u5f97\u6570\u636e\uff0c\u7136\u540e\u5199\u6210\u78c1\u76d8\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u3001\u6587\u4ef6\u5927\u5c0f\u7b49\u53ef\u901a\u8fc7 Message \u7684 getXxxProperty(\"Property.Name\") \u53d6\u7684\u3002"},{"title":"Java \u7ebf\u7a0b\u540c\u6b65\uff0c\u5bf9\u8c61\u9501\u4e0e\u4e92\u65a5\u89c4\u5219","link":"https:\/\/yanbin.blog\/java-thread-sync-lock-mutex\/","pubDate":"Thu, 08 Apr 2010 20:03:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-thread-sync-lock-mutex\/","description":"\n<p>\u5728\u524d\u9762\u4e00\u7bc7\n<a id=\"Editor_Results_rprSelectionList_ctl01_LinkTitle\" class=\"titlelink\" href=\"https:\/\/yanbin.blog\/java-synchronized-method-codes\/\">\n\u662f\u540c\u6b65\u65b9\u6cd5\u8fd8\u662f synchronized \u4ee3\u7801\uff1f-- \u8be6\u89e3\u591a\u7ebf\u7a0b\u540c\u6b65\u89c4\u5219<\/a>\n\u5176\u5b9e\u5df2\u6e05\u695a\u8bb2\u8ff0\u4e86\u8fd9\u91cc\u60f3\u8981\u662f\u89e3\u7684\u8bdd\u9898\uff0c\u53ea\u662f\u4e4b\u524d\u7684\u957f\u7bc7\u5927\u8bba\uff0c\u6ca1\u4e2a\u91cd\u70b9\uff0c\u8bfb\u6765\u5b9e\u5728\u4f1a\u8ba9\u4eba\u53d7\u7d2f\uff0c\u6545\u5728\u6b64\u5355\u5217\u4e00\u4e13\u9898\uff0c\u5047\u4ee5\u56fe\u793a\uff0c\u4e5f\u4e3a\u81ea\u5df1\u52a0\u6df1\u5bf9\u540c\u6b65\u9501\u7684\u7406\u89e3\u3002\u9053\u4e2d\u4eba\u89c9\u5f97\u54ea\u91cc\u8bf4\u5f97\u6709\u51fa\u5165\u6216\u6709\u66f4\u5999\u7684\u7406\u89e3\u65b9\u5f0f\uff0c\u5c3d\u7ba1\u62cd\u8fc7\u6765\u3002\n<\/p>\n<p>\u8bb0\u5f97\u6211\u521d\u8bc6\u591a\u7ebf\u7a0b\u65f6\uff0c\u5c31\u662f\u5f88\u7b80\u5355\u5316\u7684\u53bb\u7406\u89e3\u4e86\u540c\u6b65\uff1a\u8bf4\u5230\u8981\u540c\u6b65\uff0c\u65e0\u5916\u4e4e\u5c31\u662f\u7ed9\u65b9\u6cd5\u52a0 synchronized \u5173\u952e\u5b57\uff0c\u6216\u8005\u7ed9\u4ee3\u7801\u5757\u52a0\u4e0a synchronized(this)\n\u62ec\u8d77\u6765[\u6ce8\uff1ajdk 1.5 \u540e\u53ef\u7528 Lock \u6765\u540c\u6b65\u4ee3\u7801]\uff0c\u4ee5\u4e3a\u8fd9\u6837\u5c31\u4e07\u4e8b\u5927\u5409\uff0c\u5c31\u80fd\u4fdd\u8bc1\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u65f6\uff0c\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u5c31\u8fdb\u4e0d\u6765\u3002\n\u5176\u5b9e\u4e0d\u5c3d\u7136\uff0c\u56e0\u4e3a\u9759\u6001\u540c\u6b65\u65b9\u6cd5\u4e0e\u975e\u9759\u6001\u540c\u6b65\u65b9\u6cd5\u662f\u6709\u533a\u522b\u7684\uff0c\u800c synchronized(this) \u62ec\u53f7\u4e2d\u662f\u7528 this \u8fd8\u662f\u8981\u7528\u522b\u7684\u5bf9\u8c61\uff0c\u4e5f\u662f\u6709\u8bb2\u7a76\u7684\uff0c\n\u8fd9\u4e9b\u95ee\u9898\u53ef\u4ee5\u9605\u8bfb\u524d\u4e00\u7bc7\uff1a\n<a id=\"Editor_Results_rprSelectionList_ctl01_LinkTitle\" class=\"titlelink\" href=\"https:\/\/yanbin.blog\/java-synchronized-method-codes\/\">\n\u662f\u540c\u6b65\u65b9\u6cd5\u8fd8\u662f synchronized \u4ee3\u7801\uff1f-- \u8be6\u89e3\u591a\u7ebf\u7a0b\u540c\u6b65\u89c4\u5219\n<\/a>\u3002"},{"title":"SLF4J \u7684\u51e0\u79cd\u5b9e\u9645\u5e94\u7528\u6a21\u5f0f--\u4e4b\u4e09\uff1aJCL-Over-SLF4J+SLF4J","link":"https:\/\/yanbin.blog\/jcl-over-slf4j-slf4j\/","pubDate":"Wed, 07 Apr 2010 10:42:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jcl-over-slf4j-slf4j\/","description":"\n\u6211\u4eec\u524d\u9762\u5df2\u7ecf\u8bb2\u8fc7\u4e86 SLF4J \u7684\u4e24\u79cd\u7528\u6cd5\uff1aSLF4J+Log4J\u00a0 \u548c SLF4J+Logback\uff0c\u90a3\u662f\u5728\u6bd4\u8f83\u7406\u60f3\u7684\u60c5\u51b5\u4e0b\uff0c\u6240\u7528\u7ec4\u4ef6\u53ea\u4f7f\u7528\u4e86 SLF4J \u8fd9\u4e00\u79cd\u7edf\u4e00\u65e5\u5fd7\u6846\u67b6\u7684\u65f6\u5019\u3002\u53ef\u662f JCL\u00a0\u4e00\u76f4\u5f71\u54cd\u6df1\u8fdc\uff0cSLF4J \u6e10\u5165\u4f73\u5883\u7684\u65f6\u4e2a\uff0c\u5728\u4f60\u7684\u9879\u76ee\u4e2d\u5f88\u53ef\u80fd\u6240\u7528\u7684\u7ec4\u4ef6\uff0c\u5b83\u4eec\u5206\u522b\u7528\u4e86 JCL \u548c SLF4J \u4e24\u79cd\u7ec4\u4ef6\u3002\u6bd4\u5982\u8bf4\u5728\u9879\u76ee\u4e2d\u7528\u4e86 Hibernate 3.5 \u548c Struts\uff0c\u6216\u5176\u4ed6 Apache \u7684\u4e00\u4e9b\u5f00\u6e90\u7ec4\u4ef6\uff0c\u4f60\u5927\u7ea6\u4e5f\u4e0d\u60f3\u7528\u4e86 SLF4J \u7684\u7ec4\u4ef6\u65e5\u5fd7\u4fe1\u606f\u8f93\u51fa\u5230 A \u5904\uff0c\u7528\u4e86 JCL \u7684\u7ec4\u4ef6\u65e5\u5fd7\u8f93\u51fa\u5230 B \u5904\uff0c\u90a3\u4f60\u81ea\u5df1\u5199\u7684\u4ee3\u7801\u4e2d\u7684\u65e5\u5fd7\u4fe1\u606f\u8be5\u5f80\u54ea\u513f\u5199\u5462\uff1f<\/p>\n<br\/>\n\u4e2d\u56fd\u4eba\u4e00\u76f4\u90fd\u613f\u8ffd\u6c42\u5927\u4e00\u7edf\uff0c\u4e0d\u559c\u6b22\u57ce\u90a6\u5236\u7684\u4fbf\u4e8e\u5206\u800c\u6cbb\u4e4b\u3002\u4f46\u8bf4\u5230\u65e5\u5fd7\u8f93\u51fa\u8fd8\u662f\u5f97\u7edf\u4e00\u5230\u5355\u4e00\u901a\u9053\u4e2d\u6765\uff0c\u4e00\u65b9\u9762\u591a\u4e2a\u901a\u9053\u6d6a\u8d39\u8d44\u6e90\uff0c\u53e6\u65b9\u9762\u4e5f\u4fbf\u4e8e\u914d\u7f6e\u548c\u7ba1\u7406\u3002\u90a3\u4e48\u65e2\u7136 SLF4J \u662f\u8d8b\u52bf\uff0c\u5f53 SLF4J \u548c JCL \u88ab\u4e22\u5230\u4e00\u4e2a\u575b\u5b50\u91cc\uff0c\u9996\u5148\u4f1a\u8ba9 SLF4J \u4e3a\u4e3b\uff0cJCL \u4e3a\u8f85\uff0c\u4e5f\u5c31\u662f\u8981\u628a JCL \u6865\u63a5\u5230 SLF4J \u4e0a\u6765\uff0c\u901a\u8fc7 SLF4J \u7edf\u4e00\u8f93\u51fa\u65e5\u5fd7\u4fe1\u606f\u3002\u4e8e\u662f\u4e5f\u5c31\u662f\u8fd9\u7bc7\u8981\u4ecb\u7ecd\u7684 SLF4J \u4f7f\u7528\u6a21\u5f0f\uff1aJCL-Over-SLF4J+SLF4J\u3002"},{"title":"SLF4J \u7684\u51e0\u79cd\u5b9e\u9645\u5e94\u7528\u6a21\u5f0f--\u4e4b\u4e8c\uff1aSLF4J+Logback","link":"https:\/\/yanbin.blog\/slf4j-logback\/","pubDate":"Wed, 07 Apr 2010 09:04:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/slf4j-logback\/","description":"\n\u524d\u9762\u8bb2\u7684 SLF4J \u7684\u7528\u6cd5\u4e4b\u4e00\u662f SLF4J+Log4J\uff0c\u800c\u8fd9\u91cc\u8981\u63a8\u51fa\u7684\u7ec4\u5408\u662f SLF4J+LogBack\u3002\u4e0d\u7528 Log4J\uff1f\u96be\u9053\u8fd8\u6709\u6bd4 Log4J \u66f4\u597d\u7684\u65e5\u5fd7\u5b9e\u73b0\u5417\uff1f\u662f\u7684\uff0c\u7b54\u6848\u5c31\u662f <a href=\"http:\/\/logback.qos.ch\/\" target=\"_blank\" rel=\"noopener\">LogBack<\/a>\u3002\u5047\u5982\u4f60\u77e5\u9053 LogBack \u548c Log4J \u662f\u540c\u51fa\u4e00\u4f4d\u5927\u5e08\u4e4b\u624b\uff0c\u4f60\u5c31\u4e0d\u4f1a\u89c9\u5f97\u60ca\u8bb6\u4e86\u3002LogBack \u5bf9 Log4J \u8fdb\u884c\u4e86\u589e\u5f3a\uff0c\u5e76\u6295\u5165\u4e86 SLF4J \u7684\u6000\u62b1\uff0c\u5b83\u8fd8\u88ab\u4f5c\u8005\u8ba4\u5b9a\u4e3a Log4J \u7684\u7ee7\u4efb\u8005\u3002<\/p>\n<br\/>\n\u4e3a\u4ec0\u4e48\u53eb\u505a Logback\uff0c\u6211\u5c31\u4e0d\u77e5\u9053\u4e86\uff0c\u53cd\u6b63\u4e0d\u8981\u53eb\u505a Brokeback \u5c31\u884c\u3002\u8fd9\u91cc\u662f\u63a8\u5d07\u7528 Logback \u66ff\u4ee3 Log4J \u7684\u5341\u51e0\u4e2a\u7406\u7531\uff1a<a href=\"http:\/\/logback.qos.ch\/reasonsToSwitch.html\" target=\"_blank\" rel=\"noopener\">Reasons to prefer logback over log4j<\/a>\uff0c\u8bf4\u7684\u5927\u81f3\u662f\u66f4\u5feb\uff1b\u597d\u6d4b\u8bd5\uff1b\u4e0e SLF4J \u5173\u7cfb\u7d27\uff1b\u6587\u6863\u4e30\u5bcc\uff1b\u80fd\u81ea\u52a8\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\uff1b\u591a\u4e2a JVM \u5199\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6216\u5176\u4ed6 I\/O \u9519\u8bef\u65f6\u4e0d\u5f71\u54cd\u7a0b\u5e8f\u6267\u884c\uff1b\u914d\u7f6e\u6587\u4ef6\u4e2d\u52a0\u5165\u6761\u4ef6\u63a7\u5236\uff1b\u5f3a\u5927\u7684\u65e5\u5fd7\u8fc7\u6ee4\uff1b\u66f4\u5f3a\u7684\u65e5\u5fd7\u5207\u5206\u529f\u80fd\uff1b\u81ea\u52a8\u538b\u7f29\u3001\u5220\u9664\u65e5\u5fd7\u6587\u4ef6\uff1b\u5f02\u5e38\u6808\u4e2d\u66f4\u591a\u7684\u6570\u636e\u4fe1\u606f\u3002"},{"title":"SLF4J \u7684\u51e0\u79cd\u5b9e\u9645\u5e94\u7528\u6a21\u5f0f--\u4e4b\u4e00\uff1aSLF4J+Log4J","link":"https:\/\/yanbin.blog\/slf4j-log4j\/","pubDate":"Wed, 07 Apr 2010 05:06:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/slf4j-log4j\/","description":"\nSLF4J(Simple Logging Facade for Java) \u662f\u4e00\u4e2a\u901a\u7528\u7684\u65e5\u5fd7\u6846\u67b6\uff0c\u4e0d\u80fd\u4f55\u4ee5\u8c13\u4e4b Facade(\u95e8\u9762)\uff0c\u6240\u626e\u773c\u7684\u89d2\u8272\u76f8\u5f53\u4e8e Jakarta Commons Logging\u3002\u5c31\u50cf JCL \u9700\u8981\u5e95\u5c42\u7684\u65e5\u5fd7\u5b9e\u73b0\uff0c\u5982 Log4J\u3001java.util.logging\u3001Simple Logger \u7b49\u6765\u5b8c\u6210\u5177\u4f53\u7684\u4fe1\u606f\u8f93\u51fa\uff0c\u4e8b\u5b9e\u4e0a\u57fa\u672c\u603b\u662f JCL+Log4J \u90a3\u4e48\u4e00\u4e2a\u7edd\u914d\u3002SLF4J \u7684\u539f\u65e8\u4e5f\u662f\u80fd\u652f\u6301\u591a\u79cd\u4e0b\u5c42\u65e5\u5fd7\u6846\u67b6\u5b9e\u73b0\uff0c\u4f46\u6700\u597d\u7684\u65e5\u5fd7\u5b9e\u73b0\u4ecd\u7136\u662f Log4J\uff0c\u6240\u4ee5\u672c\u7bc7\u8bb2\u8ff0 SLF4J \u7684\u7b2c\u4e00\u79cd\u7528\u6cd5 SLF4J+Log4J\u3002<br\/>\n<br\/>\n\u9700\u8981\u7684\u914d\u7f6e\u6587\u4ef6\u548c\u7ec4\u4ef6\u5305\uff0c\u4e0b\u9762\u4e09\u4e2a jar \u6587\u4ef6\u548c\u4e00\u4e2a properties \u6587\u4ef6\u90fd\u662f\u8981\u653e\u5728\u9879\u76ee\u7684 ClassPath \u4e0a\u3002<br\/>\n<br\/>\n1. slf4j-api-1.5.11.jar<br\/>\n2. slf4j-log4j12-1.5.11.jar<br\/>\n3. log4j-1.2.15.jar<br\/>\n4. log4j.properties(\u4e5f\u53ef\u4ee5\u662f log4j.xml\uff0c\u672c\u4f8b\u4e2d\u7528 log4j.propertes)"},{"title":"Java SE6 \u4e2d\u7684\u65b0\u529f\u80fd\u7279\u6027\u7b80\u4ecb","link":"https:\/\/yanbin.blog\/java-se6-new-features\/","pubDate":"Tue, 06 Apr 2010 11:52:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-se6-new-features\/","description":"\n1. String \u65b0\u589e\u4e86 isEmpty() \u65b9\u6cd5<br\/>\n\u00a0\u00a0\u00a0\u00a0 \u5bf9\u4e8e String \u4e0d\u9700\u8981\u7528 str.length() !=0 \u00a0\u6765\u5224\u65ad<br\/>\n<br\/>\n2. Arrays \u65b0\u589e copyOf() \u4ece\u5df2\u77e5\u6570\u7ec4\u4e2d\u62f7\u8d1d\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u6570\u7ec4<br\/>\n\u00a0\u00a0\u00a0\u00a0 \u4e0d\u518d\u9700\u8981\uff0c\u5148\u51c6\u5907\u4e00\u4e2a\u6570\u7ec4\uff0c\u7136\u540e\u7528 System.arrayCopy() \u6765\u4ece\u65e7\u6570\u7ec4\u5f80\u65b0\u6570\u7ec4\u4e2d\u62f7\u8d1d\u6570\u636e<br\/>\n<br\/>\n3. Arrays \u8fd8\u65b0\u589e\u4e86\u00a0 copyOfRange()\u00a0\uff0cbinarySearch(arr, fromIndex, toIndex, des) \u65b9\u6cd5\uff0c\u53ef\u5728\u4e00\u4e2a\u8303\u56f4\u5185\u67e5\u627e\u3002<br\/>\n<br\/>\n4. \u53ef\u4ee5\u7528 Calendar \u5b9e\u4f8b\u7684 getDisplayNames() \u548c getDisplayName() \u83b7\u5f97\u533a\u57df\u5316\u7684\u65e5\u671f\u683c\u5f0f\u663e\u793a<br\/>\n<br\/>\n5. System\u4e0a\u65b0\u589e console() \u83b7\u5f97 Console \u5b9e\u4f8b\uff0c\u53ef\u7528\u5176\u7684 printf()\u3001readLine()\u3001readPassword()\u3001reader()\u3001writer() \u7b49\u65b9\u6cd5\uff0c\u5982"},{"title":"\u65b0\u4e00\u4ee3\u901a\u7528\u65e5\u5fd7\u6846\u67b6 SLF4J \u7528\u6237\u6307\u5357","link":"https:\/\/yanbin.blog\/new-common-logging-slf4j-guide\/","pubDate":"Tue, 06 Apr 2010 04:48:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/new-common-logging-slf4j-guide\/","description":"\n<strong><br \/>\n<span style=\"font-size: large;\">SLF4J \u7528\u6237\u6307\u5357<\/span><br \/>\n<\/strong><br\/><br\/>\nSimple Logging Facade for Java(\u7b80\u5355\u65e5\u5fd7\u95e8\u9762--\u95e8\u9762\u4e00\u8bcd\u603b\u89c9\u6709\u4e9b\u522b\u626d\uff0c\u8fd8\u6ca1\u627e\u5230\u66f4\u597d\u7684\u8bcd)\uff0c\u7b80\u79f0 SLF4J\uff0c\u662f\u4f5c\u4e3a\u5404\u79cd\u65e5\u5fd7\u6846\u67b6\u7684\u7b80\u5355\u95e8\u9762\u6216\u8005\u62bd\u8c61\u7684\u3002\u6bd4\u5982\uff0c\u90a3\u4e9b\u65e5\u5fd7\u6846\u67b6\u6709 java.util.logging, log4j \u548c logback \u7b49\uff0cSLF4j \u5141\u8bb8\u7ec8\u7aef\u7528\u6237\u5728\u90e8\u7f72\u7684\u65f6\u5019\u63d2\u5165\u81ea\u5df1\u60f3\u8981\u7684\u65e5\u5fd7\u6846\u67b6\u3002<br\/><br\/>\nHello World<br\/><br\/>\n\u4f9d\u7167\u7f16\u7a0b\u7684\u4f20\u7edf\uff0c\u8fd9\u4e2a\u4f8b\u5b50\u63cf\u7ed8\u4e86\u7b80\u5355\u7684\u65b9\u5f0f\u6765\u4f7f\u7528 SLF4j \u8f93\u51fa \"Hello world\"\u3002\u5b83\u4ece\u83b7\u5f97\u4e00\u4e2a\u540d\u4e3a \"HelloWorld\" \u7684 logger \u5f00\u59cb\u3002\u63a5\u7740\u4f7f\u7528\u8fd9\u4e2a logger \u8f93\u51fa \"Hello World\" \u65e5\u5fd7\u6d88\u606f\u3002"},{"title":"Logging tool for JDBC","link":"https:\/\/yanbin.blog\/logging-tool-for-jdbc\/","pubDate":"Tue, 30 Mar 2010 23:18:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/logging-tool-for-jdbc\/","description":"\njdbcdslog \u662f\u4e00\u6b3e\u77e5\u540d\u7528\u6765\u8ddf\u8e2a JDBC \u7684\u5168\u529f\u80fd\u5de5\u5177.<br\/>\n<br\/>\n\u7279\u5f81\u5305\u62ec:<br\/>\n- \u53ef\u6302\u63a5\u5230\u6570\u636e\u5e93\u8fde\u63a5,&nbsp;\u9a71\u52a8\u6216\u6570\u636e\u6e90\u4e0a(XA,&nbsp;\u8fde\u63a5\u6c60)<br\/>\n- \u53ef\u8bb0\u5f55 PreparedStatement&nbsp;\u548c CallableStatement \u8c03\u7528\u6240\u7ed1\u5b9a\u7684\u53c2\u6570<br\/>\n- \u53ef\u8bb0\u5f55 ResultSet \u5bf9\u8c61\u4e2d\u7684\u67e5\u8be2\u8bb0\u5f55\u884c<br\/>\n- \u53ef\u8bb0\u5f55\u67e5\u8be2\u6267\u884c\u65f6\u95f4<br\/>\n- \u652f\u6301\u591a\u79cd\u65e5\u5fd7\u5f15\u64ce (\u611f\u8c22 SLF4J, \u4f60\u53ef\u4ee5\u4f7f\u7528\u591a\u6570\u6d41\u884c\u7684\u65e5\u5fd7\u7ec4\u4ef6\u5e93, \u50cf&nbsp;log4j, apache common logging, java logging&nbsp;\u6216\u8005\u7b80\u5355\u7684\u8f93\u51fa\u5230 System.out)"},{"title":"\u4eb2\u5386\u57fa\u672c OSGI \u5b9e\u4f8b\uff0c\u8fdb\u5165\u53e6\u756a\u601d\u7ef4\u9886\u57df","link":"https:\/\/yanbin.blog\/osgi-sample-e\/","pubDate":"Tue, 30 Mar 2010 05:35:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/osgi-sample-e\/","description":"\n<p>\u8f6f\u4ef6\u7684\u6a21\u5757\u8d8a\u6765\u8d8a\u63d2\u4ef6\u5316\u53d1\u5c55\u4e86\uff0c\u8fde\u786c\u4ef6\u90fd\u5904\u5904\u70ed\u63d2\u62d4\uff0c\u8f6f\u4ef6\u66f4\u5f53\u5982\u6b64\u3002\u8bb0\u539f\u6765\u6709\u4e2a JPF(Java Plugin Framework)\uff0c\u4e5f\u80fd\u5b9e\u73b0\u52a8\u6001\u63d2\u4ef6\u5316\uff0c\u4f46\u8981\u662f\u6709\u4e2a\u4e1a\u754c\u6807\u51c6\u7684\u4e1c\u897f\u4e00\u822c\u6765\u8bf4\u4f1a\u66f4\u597d\u7684\u3002\u4e8e\u662f\u8f6e\u5230 <a href=\"http:\/\/www.osgi.org\" target=\"_blank\" rel=\"noopener\">OSGI<\/a>(Open Service Gateway Initiative) \u767b\u53f0\uff0cOSGI \u51fa\u6765\u4e5f\u6709\u597d\u51e0\u4e2a\u5e74\u5934\u4e86\uff0c\u5e94\u7528\u4e5f\u8f70\u8f70\u70c8\u70c8\u7684\uff0c\u6bd4\u5982 Eclipse 3 \u5f00\u59cb\u4e0d\u518d\u4f7f\u7528\u539f\u6765\u7684\u63d2\u4ef6\u4f53\u7cfb\uff0c\u5b8c\u5168\u7528 OSGI \u642d\u5efa\u3002WebSphere 6.1 \u4e5f\u5168\u9762\u6539\u7528 OSGI\uff1bJBoss\u3001WebLogic\u3001Spring DM\uff0c\u751a\u81f3\u662f BMW \u8f66\u7684\u63a7\u5236\u7cfb\u7edf\u4e2d\u90fd\u5f97\u5230\u4e86\u5f88\u597d\u7684\u5e94\u7528\u3002<\/p>\n<p>\u524d\u9762\u8bb2\u5230\u53ef\u4ee5\u7528 OSGI\u00a0\u4f5c\u4e3a\u4f60\u7684\u5fae\u5185\u6838\uff0c\u5fae\u5185\u6838\u7684\u597d\u5904\u53ef\u4ee5\u6253\u4e2a\u8fd9\u6837\u7684\u6bd4\u65b9\uff1a\u4e00\u53f0 Linux \u670d\u52a1\u5668\u51fa\u6545\u969c\u4e86\uff0c\u5e94\u7528\u7a0b\u5e8f\u574f\u4e86\u3001\u67d0\u4e9b\u670d\u52a1\u4e0d\u80fd\u8bbf\u95ee\u7b49\uff0c\u4f46\u53ea\u8981\u5b83\u8fd8\u6765\u8fde\u5165\u7f51\u7edc\uff0cSSH \u8fd8\u662f\u6d3b\u7684\uff0c\u6211\u4eec\u5c31\u6709\u529e\u6cd5\u8fdb\u53bb\u4fee\u590d\u5b83\uff0c\u60f3\u5b89\u88c5\u3001\u5378\u8f7d\u4ec0\u4e48\u90fd\u884c\u3002"},{"title":"\u542f\u52a8 Equinox \u65f6\u51fa\u73b0 The System Bundle's start level can not be modified. \u9519\u8bef","link":"https:\/\/yanbin.blog\/equinox-bundles-start-level-not-modified\/","pubDate":"Mon, 29 Mar 2010 23:17:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/equinox-bundles-start-level-not-modified\/","description":"\n\u4f7f\u7528 Eclipse \u7684 OSGI \u5b9e\u73b0 Equinox\uff0c\u901a\u8fc7 config.ini \u914d\u7f6e\u6587\u4ef6\u5728\u547d\u4ee4\u884c\u65f6\u542f\u52a8 Equinox \u65f6\uff0c\u53ef\u4ee5\u8fdb\u5230 osgi&gt; \u662f\u63d0\u793a\u7b26\uff0c\u4f46\u662f\u9664 org.eclipse.osgi_3.5.2.R35x_v20100126 \u662f STARTING \u5916\uff0c\u5176\u4ed6\u7684 Bundle \u90fd\u662f RESOLVED \u72b6\u6001\uff0c\u6ca1\u6cd5\u8fdb\u5165\u5230 ACTIVE \u72b6\u6001\uff0cosgi&gt; start xxx \u4e5f\u4e0d\u884c\u3002<br\/>\n<br\/>\n\u7136\u540e\u770b\u76ee\u5f55 configuration \u76ee\u5f55\u4e2d\u751f\u6210\u7684\u65e5\u5fd7\u6587\u4ef6\uff0c\u662f\u5982\u4e0b\u9519\u8bef\uff1a<br\/>\n<br\/>\n<span style=\"color: #ff0000;\">!SESSION 2010-03-30 11:40:40.156 -----------------------------------------------<br\/>\neclipse.buildId=unknown<br\/>\njava.version=1.6.0_18<br\/>\njava.vendor=Sun Microsystems Inc.<br\/>\nBootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=zh_CN<br\/>\nCommand-line arguments:\u00a0 -console"},{"title":"\u662f\u540c\u6b65\u65b9\u6cd5\u8fd8\u662f synchronized \u4ee3\u7801\uff1f\u2013 \u8be6\u89e3\u591a\u7ebf\u7a0b\u540c\u6b65\u89c4\u5219","link":"https:\/\/yanbin.blog\/java-synchronized-method-codes\/","pubDate":"Mon, 22 Mar 2010 11:55:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-synchronized-method-codes\/","description":"\n\u719f\u6089 Java \u7684\u591a\u7ebf\u7a0b\u7684\u4e00\u822c\u90fd\u77e5\u9053\u4f1a\u6709\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u60c5\u51b5\u53d1\u751f\uff0c\u6bd4\u5982\u4e24\u4e2a\u7ebf\u7a0b\u5728\u64cd\u4f5c\u540c\u4e00\u4e2a\u7c7b\u53d8\u91cf\u65f6\uff0c\u800c\u4fdd\u62a4\u6570\u636e\u4e0d\u81f3\u4e8e\u9519\u4e71\u7684\u529e\u6cd5\u5c31\u662f\u8ba9\u65b9\u6cd5\u540c\u6b65\u6216\u8005\u4ee3\u7801\u5757\u540c\u6b65\u3002\u540c\u6b65\u65f6\u975e\u539f\u5b50\u64cd\u4f5c\u5c31\u5f97\u540c\u6b65\uff0c\u6bd4\u5982\u4e00\u4e2a\u7b80\u5355\u7684 1.2+1 \u8fd0\u7b97\u4e5f\u8be5\u540c\u6b65\uff0c\u4ee5\u4fdd\u8bc1\u4e00\u4e2a\u4ee3\u7801\u5757\u6216\u65b9\u6cd5\u6210\u4e3a\u4e00\u4e2a\u539f\u5b50\u64cd\u4f5c\u3002<br\/>\n<br\/>\n\u7b80\u5355\u70b9\u8bf4\u5c31\u662f\u7ed9\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\u53ef\u80fd\u4f1a\u9020\u6210\u6570\u636e\u7834\u574f\u7684\u65b9\u6cd5\uff0c\u505a\u6cd5\u6709\u4e24\u79cd\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7591\u95ee\uff1a<br\/>\n<br\/>\n<span style=\"color: #0000ff;\"><u>1. \u4e0d\u8bba\u662f\u9759\u6001\u7684\u6216\u975e\u9759\u6001\u7684\u65b9\u6cd5\u90fd\u52a0\u4e0a synchronized \u5173\u952e\u5b57\uff0c\u90a3\u9759\u6001\u7684\u65b9\u6cd5\u548c\u975e\u9759\u6001\u7684\u65b9\u6cd5\u524d\u52a0\u4e0a synchronized \u5173\u952e\u5b57\u6709\u533a\u522b\u5417\uff1f<\/u><\/span><br\/>\n<br\/>\n<u>2. \u6216\u8005\u5728\u53ef\u7591\u7684\u4ee3\u7801\u5757\u4e24\u65c1\u7528 synchronized(this) \u6216 synchronized(someObject) \u5305\u88f9\u8d77\u6765\uff0c\u800c\u9009\u7528 this \u8fd8\u662f\u67d0\u4e00\u4e2a\u5bf9\u8c61--someObject\uff0c\u53c8\u6709\u4ec0\u4e48\u4e0d\u540c\u5462\uff1f<\/u><br\/>"},{"title":"Java NIO \u5e94\u7528 -- \u4f7f\u7528\u5185\u5b58\u6620\u5c04\u6587\u4ef6\u5b9e\u73b0\u8fdb\u7a0b\u95f4\u901a\u4fe1","link":"https:\/\/yanbin.blog\/java-nio-memory-mapping-communicate\/","pubDate":"Fri, 19 Mar 2010 03:30:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-nio-memory-mapping-communicate\/","description":"\n\u4e00\u770b\u5230 Java NIO \u7684\u5185\u5b58\u6620\u5c04\u6587\u4ef6(MappedByteBuffer)\uff0c\u8ba9\u6211\u7acb\u5373\u5c31\u8054\u60f3\u5230 Windows \u7cfb\u7edf\u7684\u5185\u5b58\u6620\u5c04\u6587\u4ef6\u3002Windows \u7cfb\u7edf\u7684\u5185\u5b58\u6620\u5c04\u6587\u4ef6\u80fd\u7528\u6765\u5728\u591a\u4e2a\u8fdb\u7a0b\u95f4\u5171\u4eab\u6570\u636e\uff0c\u5373\u8fdb\u7a0b\u95f4\u7684\u5171\u4eab\u5185\u5b58\uff0c\u662f\u901a\u8fc7\u628a\u540c\u4e00\u5757\u5185\u5b58\u533a\u57df\u6620\u5c04\u5230\u4e0d\u540c\u8fdb\u7a0b\u7684\u5730\u5740\u7a7a\u95f4\u4e2d\uff0c\u4ece\u800c\u8fbe\u5230\u5171\u4eab\u5185\u5b58\u3002<br\/><br\/>\nJava NIO \u7684\u5185\u5b58\u6620\u5c04\u6587\u4ef6\u548c Windows \u7cfb\u7edf\u4e0b\u7684\u4e00\u6837\uff0c\u90fd\u80fd\u628a\u7269\u7406\u6587\u4ef6\u7684\u5185\u5bb9\u6620\u5c04\u5230\u5185\u5b58\u4e2d\uff0c\u90a3\u4e48 MappedByteBuffer \u662f\u5426\u80fd\u7528\u6765\u5728\u4e0d\u540c Java \u8fdb\u7a0b(JVM) \u95f4\u5171\u4eab\u6570\u636e\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\uff0c\u8fd9\u6837\u5728\u901a\u5e38\u7684 Socket \u65b9\u5f0f\u6765\u5b9e\u73b0 Java \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4e4b\u4e0a\u53c8\u591a\u4e86\u4e00\u79cd\u65b9\u6cd5\u3002"},{"title":"\u5171\u4eab\u5185\u5b58\u5728Java\u4e2d\u5b9e\u73b0\u548c\u5e94\u7528[\u8f6c]","link":"https:\/\/yanbin.blog\/share-memory-for-java\/","pubDate":"Thu, 18 Mar 2010 23:14:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/share-memory-for-java\/","description":"\n<strong>1\u3001\u5171\u4eab\u5185\u5b58\u5bf9\u5e94\u5e94\u7528\u5f00\u53d1\u7684\u610f\u4e49<\/strong><br\/>\n<br\/>\n\u5bf9\u719f\u77e5UNIX\u7cfb\u7edf\u5e94\u7528\u5f00\u53d1\u7684\u7a0b\u5e8f\u5458\u6765\u8bf4\uff0cIPC\uff08InterProcess Communication\uff09\u673a\u5236\u662f\u975e\u5e38\u719f\u6089\u7684\uff0cIPC\u57fa\u672c\u5305\u62ec\u5171\u4eab\u5185\u5b58\u3001\u4fe1\u53f7\u706f\u64cd\u4f5c\u3001\u6d88\u606f\u961f\u5217\u3001\u4fe1\u53f7\u5904\u7406\u7b49\u90e8\u5206\uff0c\u662f\u5f00\u53d1\u5e94\u7528\u4e2d\u975e\u5e38\u91cd\u8981\u7684\u5fc5\u4e0d\u53ef\u5c11\u7684\u5de5\u5177\u3002\u5176\u4e2d\u5171\u4eab\u5185\u5b58IPC\u673a\u5236\u7684\u5173\u952e\uff0c\u5bf9\u4e8e\u6570\u636e\u5171\u4eab\u3001\u7cfb\u7edf\u5feb\u901f\u67e5\u8be2\u3001\u52a8\u6001\u914d\u7f6e\u3001\u51cf\u5c11\u8d44\u6e90\u8017\u8d39\u7b49\u5747\u6709\u72ec\u5230\u7684\u4f18\u70b9\u3002<br\/>\n<br\/>\n\u5bf9\u5e94UNIX\u7cfb\u7edf\u6765\u8bf4\uff0c\u5171\u4eab\u5185\u5b58\u5206\u4e3a\u4e00\u822c\u5171\u4eab\u5185\u5b58\u548c\u6620\u50cf\u6587\u4ef6\u5171\u4eab\u5185\u5b58\u4e24\u79cd\uff0c\u800c\u5bf9\u5e94Windows\uff0c\u5b9e\u9645\u4e0a\u53ea\u6709\u6620\u50cf\u6587\u4ef6\u5171\u4eab\u5185\u5b58\u4e00\u79cd\u3002\u6240\u4ee5Java\u5e94\u7528\u4e2d\uff0c\u4e5f\u662f\u53ea\u80fd\u521b\u5efa\u6620\u50cf\u6587\u4ef6\u5171\u4eab\u5185\u5b58\u3002"},{"title":"Java NIO \u5165\u95e8\u5b66\u4e60(\u8bfb\u5199\u6587\u4ef6)","link":"https:\/\/yanbin.blog\/java-nio-access-fil\/","pubDate":"Thu, 18 Mar 2010 05:51:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-nio-access-fil\/","description":"\n\u6211\u4eec\u7528\u539f\u6709 IO \u8bfb\u5199\u6587\u4ef6\u5e94\u8be5\u4e0d\u4f1a\u964c\u751f\u4e86\uff0c\u987a\u5e26\u56de\u987e\u4e00\u4e0b\uff0c\u5927\u81f4\u4e24\u79cd\uff1a\n<br\/>\n1. \u5728 InputStream \u6216 OutputStream \u4e0a\u8bfb\u5199\u5b57\u8282\u6216\u5b57\u8282\u6570\u7ec4\uff0c\u8bfb InputStream \u65f6\u7528\u662f\u5426\u8fd4\u56de -1 \u6765\u5224\u65ad\u662f\u5426\u5230\u8fbe\u672b\u5c3e\u3002<br \/>\n2. \u5305\u88c5\u6210 Reader\/Writer \u53ef\u4ee5\u76f4\u63a5\u8bfb\u5199\u5b57\u7b26\u4e32\uff0c\u8fdb\u4e00\u6b65\u5305\u88c5\u5230 BufferedReader\/BufferedWriter \u5c31\u53ef\u4ee5\u6309\u884c\u8bfb\u5199\u4e86\u3002readLine() \u65f6\u770b\u662f\u5426\u8fd4\u56de null \u65ad\u5b9a\u662f\u5426\u8bfb\u5b8c\u4e86\u6700\u540e\u4e00\u884c\u3002<br\/><br\/>\n\u73b0\u5728\u6211\u4eec\u8981\u7528 NIO \u6765\u8bfb\u5199\u6587\u4ef6\uff0c\u80af\u5b9a\u662f\u8981\u7528\u5230 Channel \u548c Buffer \u4e86\u3002\u4e00\u53e5\u8bdd\u63cf\u8ff0\u8fc7\u7a0b\u5c31\u662f\u4ece FileInputStream \u5f97\u5230\u7684 FileChannel \u4e2d\u8bfb\u53d6\u6570\u636e\u5230 Buffer \u4e2d\uff0c\u518d\u5904\u7406 Buffer \u4e2d\u7684\u6570\u636e\u3002\u770b\u4ee3\u7801\uff1a"},{"title":"Java NIO \u5165\u95e8\u5b66\u4e60(\u901a\u9053\u548c\u7f13\u51b2\u533a)","link":"https:\/\/yanbin.blog\/java-nio-channel-buffer\/","pubDate":"Thu, 18 Mar 2010 02:30:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-nio-channel-buffer\/","description":"\n<p>\u5bf9\u4e8e NIO \u6765\u8bf4\uff0cChannel(\u901a\u9053) \u548c Buffer(\u7f13\u51b2\u533a) \u8fd9\u4e24\u4e2a\u4e1c\u897f\u662f\u4e0d\u5f97\u4e0d\u63d0\u7684\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f NIO \u7684\u6838\u5fc3\u5bf9\u8c61\uff0c\u51e0\u4e4e\u6bcf\u4e00\u4e2a I\/O \u64cd\u4f5c\u90fd\u8981\u5b83\u4eec\u3002<\/p>\n<p>\u901a\u9053\u662f\u5bf9\u539f I\/O \u6d41\u7684\u6a21\u62df\uff0c\u4f46\u6709\u4e0d\u540c\u7684\u662f\u5b83\u662f\u53cc\u5411\u7684\uff0c\u4e0d\u518d\u50cf\u6d41\u90a3\u6837\u5206 InputStream \u548c OutputStream\uff0c\u901a\u9053\u7684\u53cc\u5411\u6027\u66f4\u597d\u7684\u53cd\u6620\u4e86\u5e95\u5c42\u64cd\u4f5c\u7cfb\u7edf\u7684\u771f\u8bc6\u60c5\u51b5\u3002\u4e5f\u4e0d\u80fd\u50cf\u539f I\/O \u90a3\u6837\u53ef\u4ee5\u76f4\u63a5\u5f80\u6d41\u91cc\u5199\u6216\u8bfb\u6570\u636e\uff0c\u5728\u901a\u9053\u4e86\u4f20\u8f93\u6570\u636e\u5fc5\u987b\u7ecf\u7531\u7f13\u51b2\u533a\u3002\u6709\u70b9\u7c7b\u4f3c\u539f I\/O \u6d41\u901a\u8fc7\u8fc7\u6ee4\u5668\u6d41 BufferedInputStream \u548c BufferedOutputStream \u6765\u8bfb\u5199\u6570\u636e\u3002<\/p>\n<p>FileInputStream\/FileOutputStream\/RandomAccessFile\/DatagramSocket\/ServerSocket\/Socket \u7684 getChannel() \u65b9\u6cd5\u53ef\u4ee5\u83b7\u5f97\u76f8\u5e94\u7c7b\u578b\u7684 Channel\uff0cChannel \u7684\u7c7b\u578b\u6709 FileChannel\/SocketChannel\/SelectableChannel\/DatagramChannel\/ServerSocketChannel \u7b49\u3002"},{"title":"Java NIO \u5165\u95e8\u5b66\u4e60(\u8fc7\u95e8)","link":"https:\/\/yanbin.blog\/java-nio-get-started\/","pubDate":"Wed, 17 Mar 2010 05:45:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-nio-get-started\/","description":"\n<p>Java NIO(New IO) \u8fd8\u662f\u5728 JDK 1.4 \u4e2d\u5f15\u5165\u7684\u65b0\u7279\u6027\u3002JDK 1.4 \u7684\u53e6\u4e00\u91cd\u8981\u7279\u6027\u6b63\u5219\u8868\u8fbe\u5f0f\u5927\u5bb6\u5e94\u8be5\u7ecf\u5e38\u7528\u5230\uff0c\u4f46 NIO \u5c31\u53ef\u80fd\u4f7f\u7528\u5be5\u5be5\u4e86\uff0c\u5927\u6982\u662f\u7f18\u4e8e\u65e7\u6709 IO \u4f53\u7cfb\u4ecd\u7136\u591f\u7528\u3002\u6709\u5982 JDK1.5 \u65e9\u5c31\u6cdb\u578b\u548c\u6ce8\u89e3\u4e86\uff0c\u4f46\u57fa\u4e8e\u5404\u79cd\u539f\u56e0\u800c\u65e0\u6cd5\u4eb2\u529b\u53bb\u5b9e\u8df5\u6cdb\u578b\u548c\u6ce8\u89e3\u4e00\u822c\uff0cNIO \u591a\u6570\u65f6\u5019\u4e5f\u53ea\u662f\u4e0e\u6211\u4eec\u64e6\u7740\u80a9\u800c\u5df2\u3002<\/p>\n<p>\u76f8\u6bd4\u4e0e Old IO\uff0cNIO\u00a0\u5728\u67d0\u4e9b\u9886\u57df\u91cc\u786e\u6709\u5176\u8fc7\u4eba\u4e4b\u5904\uff0c\u6240\u4ee5\u73b0\u5728\u8ba9\u6211\u4eec\u4e00\u8d77\u6765\u5bf9 NIO \u6709\u4e2a\u66f4\u695a\u7684\u8ba4\u8bc6\u3002<\/p>\n<p>NIO \u7684\u76f8\u5173 API\uff0c\u5728 java.nio \u4e2d\uff0c\u5b83\u4f1a\u4e0e\u4f60\u7ea0\u7f20\u7684\u5c31\u662f\u5404\u79cd <span style=\"color: #ff0000;\">Channel<\/span> \u548c <span style=\"color: #ff0000;\">Buffer<\/span>\u3002\u76f8\u5173\u7684\u5e94\u7528\u5728\u4e8e\u5904\u7406\u901a\u9053\u548c\u7f13\u51b2\u533a\u3001\u5f02\u6b65(\u975e\u963b\u585e)\u7684 IO\u3001\u6587\u4ef6\u7684\u9501\u5b9a\u3001\u5b57\u7b26\u96c6\u7684\u5904\u7406\u4e0a\u3002"},{"title":"\u672c\u60f3\u505a\u4e2a Scala \u7684\u63a8\u5e7f\uff0c\u65e0\u5948\u672c\u53ef\u6ce8\u518c\u7684\u57df\u540d\u5931\u4e86\u65f6\u673a\uff0c\u671b\u5927\u5bb6\u80fd\u51fa\u8c0b\u5212\u7b56","link":"https:\/\/yanbin.blog\/promote-scala-miss-dn\/","pubDate":"Mon, 14 Sep 2009 14:18:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/promote-scala-miss-dn\/","description":"\n\u4e86\u89e3\u4e86\u4e0b Scala(<a href=\"http:\/\/www.scala-lang.org\">http:\/\/www.scala-lang.org<\/a>) \u8bed\u8a00\u7684\u7279\u6027\uff0c\u4e5f\u89c9\u5f97\u9887\u6709\u4e9b\u641e\u5934\u3002\n\u9996\u5148\u4e0d\u5931\u9762\u8c61\u5bf9\u8c61\u7684\u7279\u5f81\uff0c\u53c8\u80fd\u4f5c\u6cdb\u51fd\u7f16\u7a0b\uff0c\u5e76\u80fd\u50cf Erlang\u00a0\u90a3\u6837\u9002\u7528\u4e8e\u591a\u6838\u3001\u5e76\u53d1\u7f16\u7a0b\u3002\n\u4e14\u770b\u770b\u8fd9\u4e2a\u8bed\u8a00\u7684\u540d\u79f0 <strong>Scala<\/strong>ble\uff0c\u5373\u53ef\u77e5\u5b83\u7684\u5fd7\u5411\u4e4b\u8fdc\u5927\u3002\u529b\u6c42\u4ee5\u9ad8\u5b9a\u5236\u3001\u6269\u5c55\u6027\u53bb\u5e94\u7528\u4e8e\uff0c\u65e0\u8bba\u662f\u5c0f\u8f6f\u4ef6\u8fd8\u662f\u5927\u5e94\u7528\u3002<br \/><br \/>\nGroovy \u4e4b\u7236\u8bf4\u8fc7\uff1a\u8981\u662f\u65e9\u77e5\u6709 Scala\uff0c\u5c31\u4e0d\u4f1a\u518d\u53d1\u660e Groovy\u3002\u8fd9\u4e24\u4e1c\u897f\u90fd\u662f\u6784\u7b51\u5728 JVM \u5e73\u53f0\u7684\uff0c\u8981\u8bf4 Groovy \u53d1\u5c55\u81f3\u5ff5\u4eca\uff0c\u6240\u5f97\u5956\u9879\u4e5f\u4e0d\u5c11\uff0c\u63a8\u5e7f\u597d\u50cf\u4e0d\u548b\u6837\u3002\n\u4ee5\u53ca\u6709\u201cScala \u5c06\u6210\u4e3a\u73b0\u4ee3 Web 2.0 \u7684\u53d1\u8d77\u8bed\u8a00\u201d \u7684\u8bba\u8c03\uff0c\u8fd8\u6709 Scala \u5b9e\u9645\u5728 Twitter \u4e0a\u7684\u5e94\u7528\u7b49\u7b49\u3002<br \/><br \/>\n\u7136\u800c\uff0c\u56fd\u5185\u597d\u50cf\u5bf9\u00a0 Scala \u7684\u4e86\u89e3\u8fd8\u4e0d\u591a\uff0c\u4e8e\u662f\u6ecb\u751f\u4e86\u4e00\u4e2a\u5728\u56fd\u5185\u5bf9\u5b83\u8fdb\u884c\u63a8\u5e7f\u7684\u5ff5\u5934\uff1a\u5efa\u4e2a\u7ad9\u70b9\u3001\u5f04\u4e2a\u57df\u540d\u3001\u7d27\u8ddf Scala \u7684\u811a\u6b65\uff0c\u7f51\u53cb\u70ed\u5fc3\u53c2\u4e0e\u3002\n\u5c31\u50cf\u4eba\u540d\u4e00\u6837\uff0c\u57df\u540d\u4e5f\u5e94\u8be5\u662f\u8981\u8ba9\u4eba\u5370\u50cf\u6df1\u523b\u7684\u3002\u524d\u51e0\u5929\u5728\u4e07\u7f51\u4e0a\u641c\u7d22\u65f6\u50cf scalachina.com\u3001scalacn.com\u3001cnscala \u7b49\u90fd\u6ca1\u4eba\u7528\uff0c\u53ef\u662f\u5de5\u4f5c\u5fd9\u4e86\u4e0b\uff0c\n\u803d\u6401\u4e86\u51e0\u5929\uff0c\u90a3\u51e0\u4e2a\u57df\u540d\u5c31\u88ab\u4eba\u5360\u4e86\u53bb\uff0c\u5e76\u4e14\u4e5f\u80fd\u770b\u5230\u4eba\u5bb6\u7684\u9875\u9762\u4e86\u3002<br \/><br \/>\n\u6ca1\u5948\uff0c\u65f6\u95f4\u4e0a\u54b1\u662f\u5dee\u4e86\u4e00\u6b65\uff0c\u90a3\u6211\u8fd8\u662f\u6709\u4fe1\u606f\u5728\u5176\u4ed6\u65b9\u9762\u505a\u5f97\u66f4\u597d\u7684\u554a\u3002\u518d\u8bf4\u5462\uff0c\u4e5f\u6ca1\u8fc7\u51e0\u4e2a \u4ec0\u4e48\u4ec0\u4e48\u4e2d\u56fd \u7684\u7f51\u7ad9\u505a\u5f97\u7279\u522b\u51fa\u8272\u7684\u5440\uff0c\n\u770b\u770b JavaEye \u662f\u600e\u4e48\u540e\u6765\u5d1b\u8d77\u7684\u5c31\u77e5\u9053\u4e86\u3002\u6211\u7684\u76ee\u6807\u662f\u60f3\u505a\u51fa\u4e00\u4e2a\u50cf JavaEye \u90a3\u6837\u7684\u4e1c\u897f\uff0c\u770b\u8fc7\u6709\u4e2a\u53eb PhpEye\uff0c\u5982\u679c\u518d\u53eb ScalaEye \u5c31\u6709\u4e9b\u8001\u571f\u4e86\uff0c\n\u539f\u672c\u60f3\u7684 Scala \u4e2d\u56fd \u8fd9\u6837\u7684\u540d\u79f0\u5c31\u6709\u4e9b\u4fd7\u7684\u3002<br \/><br \/>"},{"title":"\u4e5f\u8bf4 Java \u7684\u53cc\u62ec\u7b26\u521d\u59cb\u5316, \u5176\u5b9e\u5c31\u662f\u4ee4\u4eba\u8d39\u89e3\u7684\u4e0d\u89c4\u8303\u4ee3\u7801","link":"https:\/\/yanbin.blog\/java-double-brackets-initial\/","pubDate":"Wed, 12 Aug 2009 03:33:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-double-brackets-initial\/","description":"\n\u521d\u770b cgaolei \u7ffb\u8bd1\u7684 <a href=\"http:\/\/www.javaeye.com\/topic\/418542\" target=\"_blank\" rel=\"noopener\">Java\u6280\u5de7\u4e4b\u53cc\u62ec\u5f27\u521d\u59cb\u5316<\/a> \u4e00\u6587\uff0c\u8d70\u9a6c\u89c2\u82b1\uff0c\u53ea\u77e5\u7528\u6cd5\uff0c\u672a\u7ec6\u770b\u540e\u9762\u7684\u89e3\u91ca\u3002\u851a\u4e3a\u60ca\u8273\uff0c\u5fc3\u91cc\u60f3 Java \u7adf\u7136\u6709\u8fd9\u4e48\u795e\u5947\u7684\u8bed\u6cd5\u800c\u4e00\u76f4\u672a\u5f97\u77e5\u3002\u56e0\u4e3a\u5728\u521d\u59cb\u5316\u96c6\u5408\u65f6\u786e\u5b9e\u65b9\u4fbf\u4e0d\u5c11\u3002\u539f\u6765\u505a\u67d0\u4e9b\u6d4b\u8bd5\u8981\u521d\u59cb\u5316\u96c6\u5408\u65f6\u4f1a\u7528\u5230 commons-lang\u00a0\u5305\u548c JDK \u7684 Arrays \u5de5\u5177\u7c7b\uff0c\u73b0\u5728\u77e5\u9053\u53ef\u4ee5\u8fd9\u4e48\u7528\u4e86\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"n\">Map<\/span><span class=\"w\"> <\/span><span class=\"n\">map<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">HashMap<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Name&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;QQ&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;1125535&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"p\">}};<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"w\"> <\/span><span class=\"n\">stooges<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Larry&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Moe&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Curly&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"p\">}};<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u770b\u8d77\u6765\u90fd\u662f\u5728\u4e00\u6761\u8bed\u53e5\u91cc\u5b8c\u6210\uff0c\u800c\u4e0d\u9700\u8981\u5206\u6b65\u9aa4\u5199\u6210:"},{"title":"\u4f7f\u7528 XStream \u5728 JavaBean \u4e0e XML\/JSON \u4e4b\u95f4\u76f8\u4e92\u8f6c\u6362","link":"https:\/\/yanbin.blog\/xstream-javabean-xml-json\/","pubDate":"Tue, 11 Aug 2009 08:18:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/xstream-javabean-xml-json\/","description":"\nXML \u548c JSON \u662f\u5f53\u4eca\u5e38\u7528\u7684\u4e24\u79cd\u6570\u636e\u63cf\u8ff0\u4e0e\u4f20\u8f93\u7684\u683c\u5f0f\uff0c\u7279\u522b\u662f\u6d89\u53ca\u5230 JS \u65f6\u4f7f\u7528 JSON \u9887\u4e3a\u9891\u7e41\u3002\u81ea\u7136\uff0c\u5728 Java\u00a0 \u7684\u4e16\u754c\u91cc\u5c11\u4e0d\u4e86\u5b8c\u6210 JavaBean \u4e0e\u8fd9\u4e24\u79cd\u683c\u5f0f\u76f8\u4e92\u8f6c\u6362\u7684\u7ec4\u4ef6\uff0c\u90a3\u5c31\u662f XStream \u548c JSON-lib\u3002\u8fd9\u91cc\u6211\u7b80\u5355\u8bb0\u4e0b XStream\u00a0 \u7684\u7528\u6cd5\u3002<\/p>\n<br\/>\n\u5176\u5b9e\u76f8\u7c7b\u4f3c\u7684\u5de5\u5177\u65e9\u5df2\u6709\u4e4b\u3002\u5982\u679c\u7528\u8fc7 DWR \u7684\u540c\u5fd7\uff0c\u4e00\u5b9a\u6709\u5370\u50cf\uff0cDWR \u8fdb\u884c\u8fdc\u7a0b\u65b9\u6cd5\u8c03\u7528\u65f6\u4e5f\u80fd\u4e3a\u4f60\u5b8c\u6210 JavaBean \u548c JSON \u683c\u5f0f\u7684\u53cc\u5411\u8f6c\u6362\u7684\uff0c\u6240\u4f9d\u8d56\u7684\u662f\u5b83\u7684\u5404\u79cd Converter\u3002\u518d\u8981\u662f\u5bf9 Struts1 \u7684\u7ec6\u8282\u6709\u6240\u6ce8\u610f\u7684\u8bdd\uff0cStruts1 \u7684 ActionServlet \u5728\u521d\u59cb\u5316 struts-config.xml \u65f6\u662f\u901a\u8fc7 <a href=\"http:\/\/commons.apache.org\/digester\/\" target=\"_blank\" rel=\"noopener\">commons-digester<\/a> \u6765\u5b8c\u6210 XML \u5230 JavaBean \u8f6c\u6362\u7684\u3002\u76f8\u5e94\u7684 Apache \u4e5f\u6709\u4e00\u4e2a <a href=\"http:\/\/commons.apache.org\/betwixt\/\" target=\"_blank\" rel=\"noopener\">commons-betwixt<\/a> \u5b9e\u73b0\u4e86 JavaBean \u5230 XML \u7684\u751f\u6210\u3002"},{"title":"\u5173\u4e8e JavaBean \u89c4\u8303\u4f60\u8fd8\u662f\u5e94\u8be5\u77e5\u9053\u7684\u4e8c\u4e09\u4e8b(\u8865\u5145)","link":"https:\/\/yanbin.blog\/about-javabean-spec-plus\/","pubDate":"Thu, 02 Jul 2009 04:42:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/about-javabean-spec-plus\/","description":"\n<p>\u524d\u9762\u5199\u8fc7\u4e00\u7bc7\uff1a<a id=\"viewpost1_TitleUrl\" href=\"https:\/\/yanbin.blog\/about-javabean-spec\/\" target=\"_blank\">\n<span style=\"color: #000080;\">\u5173\u4e8e JavaBean \u89c4\u8303\u4f60\u8fd8\u662f\u5e94\u8be5\u77e5\u9053\u7684\u4e8c\u4e09\u4e8b<\/span>\n<\/a>\uff0c\u53d1\u73b0\u8fd8\u7565\u53d7\u5173\u6ce8\u3002\u5176\u4e2d\u6709\u4eba\u5bf9 boolean \u578b\u5c5e\u6027\u7684 getter\/setter \u65b9\u6cd5\u8fd8\u6709\u4e9b\u60f3\u6cd5\uff0c\u4ee5\u53ca JavaBean \u7684\u89c4\u8303\u662f\u6839\u636e\u5c5e\u6027\u540d\u627e\u76f8\u5e94\u7684\ngetter\/setter \u65b9\u6cd5\uff0c\u8fd8\u662f\u7531 getter\/setter \u5b9a\u4f4d\u5c5e\u6027\u5462\u3002\u672c\u6587\u4e3b\u8981\u5c31\u8fd9\u4e24\u95ee\u9898\u5c55\u5f00\u8bdd\u9898\uff0c\u539f\u672c\u60f3\u9644\u4e2d\u524d\u7bc7\u4e2d\u53bb\uff0c\u4f46\u8003\u8651\u4f1a\u8ba9\u524d\u6587\u51cc\u4e71\uff0c\u6240\u4ee5\u53e6\u7acb\u65b0\u7bc7\u3002\n<\/p>\n<p><strong>1. \u5173\u4e8e boolean\u00a0 \u578b\u5c5e\u6027<br \/> <\/strong><br \/> \u5206\u522b\u6765\u770b\u770b Eclipse(3.5) \u548c NetBean(6.7) \u7684\u91cd\u6784\u529f\u80fd\u5bf9\noolean student \u548c boolean isStudent \u751f\u6210\u4ec0\u4e48\u6837\u7684 getter\/setter \u65b9\u6cd5\u7684\u3002"},{"title":"\u5173\u4e8e JavaBean \u89c4\u8303\u4f60\u8fd8\u662f\u5e94\u8be5\u77e5\u9053\u7684\u4e8c\u4e09\u4e8b","link":"https:\/\/yanbin.blog\/about-javabean-spec\/","pubDate":"Wed, 01 Jul 2009 09:19:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/about-javabean-spec\/","description":"\n\u4f5c\u4e3a Java\u00a0 \u7a0b\u5e8f\u5458\uff0c\u5bf9\u4e8e JavaBean \u4e5f\u8bb8\u4f60\u4f1a\u8bf4\u518d\u719f\u6089\u4e0d\u8fc7\u4e86\uff0c\u5b83\u8d2f\u7a7f\u5728\u7cfb\u7edf\u7684\u591a\u5c42\u4e2d\uff0c\u4e0d\u540c\u7684\u53eb\u6cd5\u6709 PO\u3001VO\u3001DTO\u3001POJO\u3001DO(Domain Object)\u3002\u7136\u800c\u5b83\u65e0\u5916\u4e4e\u5c31\u662f\u4e00\u4e2a Class \u7c7b\uff0c\u5e26\u4e0a\u4e9b\u5c5e\u6027\u548c\u5b83\u4eec\u7684 setter\/getter \u65b9\u6cd5\uff0cset\/get \u540e\u9762\u90a3\u4e00\u4e2a\u5b57\u6bcd\u5927\u5199\u3002\u867d\u7136\u6211\u4eec\u73b0\u5728\u5f88\u5c11\u628a JavaBean \u4e0e\u90a3\u4e2a\u53e4\u8001\u7684 2.0 \u7684\u00a0EJB \u641e\u6df7\uff0c\u4f46\u4e3a\u4ec0\u4e48\u660e\u660e\u7528 IDE \u4e3a\u5c5e\u6027\u751f\u6210\u7684 getter\/setter \u65b9\u6cd5\uff0c\u5e94\u7528\u4e00\u8fd0\u884c\uff0c\u8fd8\u662f\u62a5\u627e\u4e0d\u5230\u67d0\u4e2a bean \u5c5e\u6027\u7684 setter \u6216 getter \u65b9\u6cd5\u5462\uff1f<br\/>\n<br\/>\n\u8981\u77e5\u9053\uff0c\u5728 Sun \u7684\u7f51\u7ad9\u4e0a\u90a3\u4e2a\u5173\u4e8e JavaBean \u89c4\u8303\u7684 PDF \u6587\u6863\u53ef\u662f\u6709\u8db3\u8db3\u5b9e\u5b9e\u7684 114 \u9875\u554a\u3002\u96be\u514d\u6709\u4e9b\u89c4\u5219\u6709\u70b9\u53e4\u602a\uff0c\u81f3\u4f7f\u77e5\u540d\u7684 IDE \u90fd\u96be\u4ee5\u5e94\u5bf9\uff0c\u6240\u4ee5\u6211\u4eec\u8fd8\u662f\u6709\u5fc5\u8981\u4e86\u89e3\u5176\u4e2d\u4e8c\u4e09\uff0c\u6765\u89c4\u8303\u6211\u4eec\u7684 JavaBean \u548c\u89e3\u91ca\u4e00\u4e9b\u60c5\u5f62\u3002<br\/>\n<br\/>\nSun\u00a0 \u7684\u5173\u4e8e JavaBean \u89c4\u8303\u89c1\uff1a<a href=\"http:\/\/java.sun.com\/javase\/technologies\/desktop\/javabeans\/docs\/spec.html\">http:\/\/java.sun.com\/javase\/technologies\/desktop\/javabeans\/docs\/spec.html<\/a>\uff0c\u5176\u4e2d\u53ef\u4e0b\u8f7d\u5230 JavaBean \u89c4\u8303\u7684\u00a0 PDF \u6587\u6863\u3002"},{"title":"DWR \u7684 Converter \u5b9e\u73b0\u539f\u7406\u7b80\u5355\u5206\u6790\u53ca\u5e94\u7528","link":"https:\/\/yanbin.blog\/dwr-converter-mechanism-application\/","pubDate":"Tue, 23 Jun 2009 04:43:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dwr-converter-mechanism-application\/","description":"\n\u6211\u4eec\u5728\u5e94\u7528 DWR \u8c03\u7528\u8fdc\u7a0b\u65b9\u6cd5\u65f6\u6d89\u53ca\u5230 JS \u4e0e JAVA \u4e4b\u95f4\u53c2\u6570\u548c\u8fd4\u56de\u503c\u7684\u6570\u636e\u8f6c\u6362\uff0c\u4f8b\u5982\uff1a<br\/>\n<br\/>\nJS \u7684 123 \u4e0e Java \u7684 int\u00a0 \u6216 Integer\u3001long \u95f4\u7684\u8f6c\u6362<br\/>\nJS \u7684 \"2009-06-23\" \u4e0e Java \u7684 java.util.Date \u4e4b\u95f4\u7684\u8f6c\u6362<br\/>\nJS \u7684 \"[1,2,3]\" \u4e0e Java \u7684 int[] \u95f4\u7684\u8f6c\u6362<br\/>\nJS \u7684 \"{id:123, name: 'Unmi'}\" \u4e0e Java \u7684 Class Person{int id; String name} \u95f4\u7684\u8f6c\u6362<br\/>\n<br\/>\n\u6216\u8005\u66f4\u590d\u6742\u7684\u5d4c\u5957\u7c7b\u578b( \"{id:123, name: 'Unmi', blogs:['http:\/\/unmi.blogjava.net','http:\/\/blog.csdn.net\/kypfos']}\" ) \u4e0e Java \u7c7b\u578b\u95f4\u7684\u8f6c\u6362\uff0c\u7b49\u7b49\u3002\u90a3\u4e48\u8fd9\u4e00\u5207\u662f\u600e\u4e48\u8fdb\u884c\u7684\u5462\uff1f\u5176\u5b9e\u6211\u4eec\u89c1\u8bc6\u8fc7\u5f88\u591a\u7ec4\u4ef6\u7684\u7c7b\u578b\u6620\u5c04\uff0c\u5982 Java \u7684 PropertyEditor\u3001Hibernate(UserType)\u3001iBatis(TypeHandler) \u7684\u7c7b\u578b\u6620\u5c04\uff0cStruts1\/2 \u4e2d Form\/Model \u7528\u7684 Converter \u7b49\u3002"},{"title":"\u8bf7\u6559\u4e00\u4e0b Servlet \u4e2d\u5982\u4f55\u8bbe\u5b9a\u4e0b\u8f7d\u6587\u4ef6\u4fdd\u5b58\u7528\u7684\u5b57\u7b26\u96c6","link":"https:\/\/yanbin.blog\/servlet-download-encoding\/","pubDate":"Thu, 18 Jun 2009 03:33:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/servlet-download-encoding\/","description":"\n<p>\u5728\u524d\u9762\u4e00\u7bc7\u65e5\u5fd7\uff1a<a href=\"https:\/\/yanbin.blog\/understand-apply-struts2-file-download\/\" target=\"_blank\">\n\u7406\u89e3\u548c\u7075\u6d3b\u5e94\u7528 Struts2 \u7684\u6587\u4ef6\u4e0b\u8f7d\u529f\u80fd\n<\/a>\u00a0\u8fd8\u7559\u4e0b\u4e00\u4e2a\u95ee\u9898\uff0c\u5728 Servlet \u4e2d\u652f\u6301\u6587\u4ef6\u4e0b\u8f7d\u529f\u80fd\u65f6\uff0c\u5ba2\u6237\u4fdd\u5b58\u4e0b\u8f7d\u6587\u4ef6\u6240\u7528\u7684\u5b57\u7b26\u96c6\u603b\u662f ANSI(ISO8859-1)\uff0c\n\u5982\u4f55\u80fd\u8bbe\u5b9a\u5ba2\u6237\u4fdd\u5b58\u6587\u4ef6\u7528\u7684\u5b57\u7b26\u96c6\u5462\uff1f\u50cf BlogJava \u7684\u5907\u4efd\u6570\u636e\u529f\u80fd\u4e0b\u8f7d\u540e\u5c31\u662f\u7528\u7684 UTF-8 \u5b57\u7b26\u96c6\u7684\u3002\n\u81ea\u5df1\u4f5c\u4e86\u4e00\u4e9b\u5c1d\u8bd5\uff0c\u603b\u662f\u65e0\u6d4e\u4e8e\u4e8b\uff0c\u770b\u5982\u4e0b\u4ee3\u7801\u662f Servlet \u7684 doGet() \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">doGet<\/span><span class=\"p\">(<\/span><span class=\"n\">HttpServletRequest<\/span><span class=\"w\"> <\/span><span class=\"n\">request<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">HttpServletResponse<\/span><span class=\"w\"> <\/span><span class=\"n\">response<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">ServletException<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">IOException<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c1\">\/\/ PrintWriter out = response.getWriter();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">PrintWriter<\/span><span class=\"w\"> <\/span><span class=\"n\">out<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">PrintWriter<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">OutputStreamWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">response<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">.<\/span><span class=\"na\">getOutputStream<\/span><span class=\"p\">(),<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;UTF-8&#34;<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"na\">setContentType<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;text\/plain;charset=UTF-8&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"na\">setHeader<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Content-Disposition&#34;<\/span><span class=\"p\">,<\/span><span class=\"s\">&#34;attachment;filename=down.txt&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">write<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Servlet download file test&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">close<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"\u4f7f\u7528 DWR \u6211\u662f\u8fd9\u6837\u505a\u7b80\u5355\u5206\u9875\u7684[\u81ea\u5df1\u8bb0\u5f55\u4e00\u4e0b]","link":"https:\/\/yanbin.blog\/dwr-simple-pagination\/","pubDate":"Wed, 17 Jun 2009 21:21:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dwr-simple-pagination\/","description":"\nDWR \u672c\u8eab\u672a\u63d0\u4f9b\u5206\u9875\u7684\u529f\u80fd\uff0c\u6240\u4ee5\u8fd9\u90e8\u5206\u8981\u81ea\u5df1\u6765\u5b9e\u73b0\u3002\u5982\u679c\u628a\u540e\u53f0\u7684\u6240\u6709\u8bb0\u5f55\u90fd\u62c9\u5230\u9875\u9762\u7528 JS \u5206\u9875\uff0c\u90a3\u662f\u5f88\u4e0d\u73b0\u5b9e\u7684\u3002\u56e0\u6b64\uff0c\u867d\u8bf4\u662f DWR \u5206\u9875\uff0c\u4f46\u8fd8\u5f97\u670d\u52a1\u7aef\u6765\u652f\u6301\uff0c\u7531\u670d\u52a1\u7aef\u7684\u8fdc\u7a0b\u65b9\u6cd5\u53ea\u8fd4\u56de\u5f53\u524d\u9875\u6240\u663e\u793a\u7684\u8bb0\u5f55\uff0cDWR \u81ea\u5df1\u8981\u660e\u786e\u5f53\u524d\u662f\u7b2c\u51e0\u9875\uff0c\u662f\u5426\u6709\u4e0a\u4e00\u9875\u3001\u4e0b\u4e00\u9875\u3002<\/p>\n<br\/>\n\u8fd8\u662f\u7528\u4ee3\u7801\u6765\u8bf4\u660e\u5427\uff0c\u5206\u89e3\u4e3a\u4e09\u90e8\u5206\u4ee3\u7801\uff1a<br\/><br\/>\n1. \u66b4\u9732\u7ed9 DWR \u8c03\u7528\u7684 Java \u7684\u8fdc\u7a0b\u65b9\u6cd5<br \/>\n2. JS \u7684 DWR \u8c03\u7528<br \/>\n3. \u663e\u793a\u5206\u9875\u5bfc\u822a\u680f<br\/><br\/>\n<strong>DWR \u8981\u8c03\u7528\u7684\u00a0Java \u65b9\u6cd5\uff1a<\/strong><br\/>"},{"title":"DWR \u8c03\u7528\u8fdc\u7a0b\u65b9\u6cd5\u7684\u9519\u8bef\u548c\u5f02\u5e38\u5904\u7406","link":"https:\/\/yanbin.blog\/dwr-remote-method-exception-handle\/","pubDate":"Mon, 15 Jun 2009 03:00:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dwr-remote-method-exception-handle\/","description":"\n\u8bb0\u5f97\u4ee5\u524d\u901a\u5e38\u6211\u4eec\u5728\u8c03\u7528 DWR \u7684\u8fdc\u7a0b\u65b9\u6cd5\u662f\u8fd9\u6837\u5199<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-js\" data-lang=\"js\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nx\">Remote<\/span><span class=\"p\">.<\/span><span class=\"nx\">method<\/span><span class=\"p\">(<\/span><span class=\"nx\">params<\/span><span class=\"p\">,<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">){<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"> <span class=\"c1\">\/\/\u670d\u52a1\u7aef\u6267\u884c\u540e\u5ba2\u6237\u7aef\u7684\u903b\u8f91\uff0c\u5982\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"> <span class=\"nx\">alert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&#34;\u670d\u52a1\u7aef\u6267\u884c\u540e\u8fd4\u56de\u7684\u6570\u636e\uff1a&#34;<\/span><span class=\"o\">+<\/span><span class=\"nx\">data<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">});<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u7b2c\u4e00\u4e2a\u81f3\u5012\u6570\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4e3a\u5ba2\u6237\u7aef\u4f20\u5411\u670d\u52a1\u7aef\u7684\u6570\u636e\uff0c\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u76f4\u63a5\u5c31\u662f\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\u3002\u56e0\u4e3a\u670d\u52a1\u7aef\u6839\u636e Java \u5bf9\u8c61\u751f\u6210\u7684 js \u4ee3\u7801\u5c31\u662f\uff1a<br\/>\n<br\/>\n<span style=\"color: #800080;\">Remote.method = function(p0, callback) {<br\/>\n\u00a0\u00a0\u00a0 dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback);<br\/>\n}<br\/>\n<\/span><br\/>"},{"title":"DWR \u7684 DWRUtil.addRows() \u51fd\u6570\u7684\u4f7f\u7528","link":"https:\/\/yanbin.blog\/dwr-dwrutil-addrows-function\/","pubDate":"Fri, 12 Jun 2009 02:55:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dwr-dwrutil-addrows-function\/","description":"\n\u4f7f\u7528 DWR \u4e00\u4e2a\u5e38\u7528\u7684\u64cd\u4f5c\u5c31\u662f\u53d6\u5230\u7684\u6570\u636e\u5f80\u8868\u683c\u91cc\u586b\u5145\uff0c\u8fd9\u5c31\u662f DWR \u7684 DWRUtil.addRows() \u64cd\u4f5c\u4e86\uff0c\u672c\u7bc7\u5c31\u662f\u4ee5\u4f8b\u5b50\u8be6\u7ec6\u8bf4\u660e\u8fd9\u4e2a\u51fd\u6570\u7684\u7528\u6cd5\u3002\u800c\u53e6\u4e00\u4e2a\u79fb\u9664\u6240\u6709\u8868\u683c\u884c\u7684\u64cd\u4f5c DWRUtil.removeAllRows() \u4f7f\u7528\u7b80\u5355\u5c31\u4e0d\u591a\u8bf4\u660e\u4e86\u3002<\/p>\n<br\/>\n\u5f00\u59cb\u7684\u65f6\u5019\u6211\u4eec\u8fd8\u662f\u8981\u5bf9\u8fd9\u4e2a\u51fd\u6570\u7684\u539f\u578b\u52a0\u4ee5\u8bf4\u660e\uff0c\u867d\u7136\u6709\u4e9b\u4fd7\u5957\uff0c\u4f46\u8fd8\u662f\u5fc5\u8981\u7684\uff1a<br\/><br\/>\n<span style=\"color: #800080;\">DWRUtil.addRows(id, array, cellfuncs, [options]);<\/span><br\/><br\/>\n\u63cf\u8ff0:<br \/>\n\u5411\u6307\u5b9aid\u7684table\u5143\u7d20\u6dfb\u52a0\u884c\u3002\u5b83\u4f7f\u7528\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20(\u5bf9\u8c61)\u5728table\u4e2d\u521b\u5efa\u4e00\u884c\u3002\u7136\u540e\u7528 cellfuncs \u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u7684\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u5217\u3002\u5355\u5143\u683c\u662f\u4f9d\u6b21\u7528 cellfunc \u6839\u636e\u6ca1\u6709\u6570\u7ec4\u4e2d\u7684\u5143\u7d20\u521b\u5efa\u51fa\u6765\u7684\u3002<br\/><br\/>\nDWR1.1\u5f00\u59cb\uff0caddRows()\u4e5f\u53ef\u4ee5\u7528\u5bf9\u8c61(\u904d\u5386\u5bf9\u8c61\u7684\u5c5e\u6027\u521b\u5efa\u884c)\u505a\u4e3a\u6570\u636e\u3002\u5982\u679c\u4f60\u7528\u4e00\u4e2a\u5bf9\u8c61\u4ee3\u66ff\u4e00\u4e2a\u6570\u7ec4\u6765\u521b\u5efa\u5355\u5143\u683c\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u4f1a\u88ab\u4f20\u9012\u7ed9cell\u51fd\u6570\u3002"},{"title":"Apache Commons Logging \u662f\u5982\u4f55\u51b3\u5b9a\u4f7f\u7528\u54ea\u4e2a\u65e5\u5fd7\u5b9e\u73b0\u7c7b\u7684","link":"https:\/\/yanbin.blog\/apache-commons-logging-which-log-implementation\/","pubDate":"Thu, 14 May 2009 10:23:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/apache-commons-logging-which-log-implementation\/","description":"\nApache Commons Logging \u50cf SLF4J \u4e00\u6837\uff0c\u662f\u4e2a\u901a\u7528\u65e5\u5fd7\u6846\u67b6\uff0c\u5e7f\u6cdb\u5e94\u7528\u5728\u5404\u4e2a\u5f00\u6e90\u7ec4\u4ef6\u4e2d\u3002\u8bf4\u5176\u901a\u7528\uff0c\u662f\u56e0\u4e3a\u5b83\u672c\u8eab\u53ea\u63d0\u4f9b\u4e86\u7b80\u5355\u7684\u65e5\u5fd7\u8f93\u51fa\u7684\u5b9e\u73b0(org.apache.commons.logging.impl.SimpleLog\u548corg.apache.commons.logging.impl.NoOpLog)\uff0c\u4e3b\u8981\u662f\u4e3a\u4f60\u7edf\u4e00\u4f7f\u7528\u5176\u4ed6\u4e13\u4e1a\u65e5\u5fd7\u5b9e\u73b0(Log4j\u3001jdk1.4 Logger\u3001aavalon-Logkit)\u7684\u65b9\u5f0f\uff0c\u8ba9\u4f60\u5728\u7a0b\u5e8f\u4e2d\u770b\u4e0d\u5230\u5177\u4f53\u65e5\u5fd7\u5b9e\u73b0\u7684\u4ee3\u7801\uff0c\u4ee5\u914d\u7f6e\u65b9\u5f0f\u89e3\u85d5\u3002<\/p>\n<br\/>\n\u90a3\u4e48 commons-logging \u662f\u600e\u4e48\u51b3\u5b9a\u7a0b\u5e8f\u6267\u884c\u65f6\u8be5\u4f7f\u7528\u54ea\u4e2a\u5177\u4f53\u7684\u65e5\u5fd7\u5b9e\u73b0\u5462\uff1f\u8fd9\u91cc commons-logging \u6709\u4e24\u4e2a\u6b65\u9aa4\u8981\u505a\uff1a<br\/><br\/>\n<span style=\"color: #000080;\">1. \u5b9a\u4f4d org.apache.commons.logging.LogFactory \u7684\u5b9e\u73b0\u7c7b(\u8fd9\u4e00\u6b65\u662f\u5173\u952e)<br \/>\n2. \u5b9a\u4f4d\u5230\u7684 LogFactory \u5b9e\u73b0\u7c7b\u51b3\u5b9a\u4f7f\u7528\u54ea\u4e2a org.apache.commons.logging.Log \u5b9e\u73b0<br \/>\n<\/span><br \/>\n\u90a3\u73b0\u5728\u6211\u4eec\u628a\u6ce8\u610f\u529b\u4e3b\u8981\u96c6\u4e2d\u5728 commons-logging \u5982\u4f55\u5b9a\u4f4d LogFactory \u5b9e\u73b0\u7c7b\u4e0a\u6765\u3002org.apche.commons.logging.LogFactory \u662f\u4e00\u4e2a\u62bd\u8c61\u7c7b\uff0c\u6240\u4ee5\u9700\u8981\u4e00\u4e2a LogFactory \u5177\u4f53\u7c7b\u3002"},{"title":"\u4e86\u89e3 Java ClassLoader -- \u4e3a\u4fbf\u4e8e\u9605\u8bfb\u6574\u7406\u505a\u6210\u4e86\u4e00\u4e2a CHM \u6587\u4ef6","link":"https:\/\/yanbin.blog\/understand-java-classloader-chm\/","pubDate":"Wed, 13 May 2009 05:43:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-java-classloader-chm\/","description":"\n<p>Java \u7a0b\u5e8f\u5458\u8fd8\u662f\u5e94\u8be5\u5bf9 Java ClassLoader\u00a0\u6709\u6240\u4e86\u89e3\uff0c\u66fe\u7ecf\u95ee\u8fc7\u4e00\u4e2a\u505a Java \u7684 JVM\u00a0 \u662f\u4ec0\u4e48\uff1f\u7ed3\u679c\u662f\uff1a\u6ca1\u542c\u8fc7\u3002\n\u6c57\u989c\u4e86\u5427\uff0c\u4f46\u4e5f\u4e0d\u5c11\u5199 JSP \u7684\u751a\u81f3\u662f Java \u4ee3\u7801\u7684\u771f\u7684\u53ef\u80fd\u4e0d\u4e86\u89e3 ClassLoader\uff0c\u6240\u4ee5\u5bf9 Classpath \u4ecd\u7136\u8d39\u89e3\u3002\nJRE \u672c\u8eab\u5c31\u6709\u4e00\u4e2a ClassLoader \u5c42\u6b21\uff0c\u66f4\u522b\u8bf4\u5728\u5404\u79cd\u5e94\u7528\u670d\u52a1\u5668\u4e2d\u56e0\u4e3a ClassLoader \u5c42\u6b21\u7684\u56e0\u7d20\u4ea7\u751f\u4e86\u83ab\u540d\u5176\u5999\u7684\u95ee\u9898\u3002\n\u4f8b\u5982\uff0c\u6570\u636e\u5e93\u9a71\u52a8\u6709\u65f6\u5019\u5e94\u8be5\u653e\u5728\u54ea\u4e2a\u76ee\u5f55\u4e2d\uff0c\u600e\u4e48\u5e94\u7528\u5374\u52a0\u8f7d\u4e86\u4e00\u4e2a\u65e7\u7248\u7684 Jar \u5305\u7b49\u7b49\u3002<\/p>\n<p>\u672c\u7bc7\u7684 Understand Java ClassLoader.chm \u6587\u4ef6\u662f\u6211\u6839\u636e IBM \u5f00\u53d1\u8005\u7f51\u7ad9\u4e0a\u7684\n<a href=\"https:\/\/www6.software.ibm.com\/developerworks\/cn\/education\/java\/j-classloader\/tutorial\">\nhttps:\/\/www6.software.ibm.com\/developerworks\/cn\/education\/java\/j-classloader\/tutorial<\/a>\n\u6574\u7406\u800c\u6210\u7684\u3002\u4ee5\u524d\u662f\u7528 Visual CHM \u5de5\u5177\u6765\u5236\u4f5c CHM \u6587\u4ef6\uff0c\u800c\u8fd9\u4e2a\u5462\u662f\u7528 FAR \u751f\u6210\u7684\uff0c\u611f\u89c9 FAR \u7684\u529f\u80fd\u8981\u5f3a\u5927\u4e9b\u3002"},{"title":"Eclipse \u8fdc\u7a0b\u8c03\u8bd5 WebSphere Application Server (WAS)","link":"https:\/\/yanbin.blog\/eclipse-remote-debug-was\/","pubDate":"Tue, 12 May 2009 03:24:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/eclipse-remote-debug-was\/","description":"\n\u6211\u4eec\u7528 Eclipse \u5f00\u53d1 Web \u9879\u76ee\u65f6\uff0c\u591a\u4f1a\u7528\u67d0\u4e2a\u63d2\u4ef6(\u5982 MyEclipse) \u6765\u5bf9 Tomcat \u4e2d\u7684\u5e94\u7528\u8fdb\u884c\u5355\u6b65\u8c03\u8bd5\u3002\u800c\u8981\u8c03\u8bd5 WAS \u4e0b\u7684\u5e94\u7528\uff0cMyEclipse \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u4f46\u5728 MyEclipse \u4e2d\u542f\u52a8 WAS \u6bd4\u8f83\u6162\uff0c\u4e14\u9700\u8981\u5728\u672c\u5730\u5b89\u88c5\u4e00\u4e2a WAS\u3002\u518d\u6709\u4fbf\u6377\u70b9\u7684\u65b9\u6cd5\u662f\u7528 WSAD (Websphere Studio Application Developer) \u6216\u5b83\u7684\u5347\u7ea7\u7248 RAD (Rational Application Developer)\uff0c\u5b83\u4eec\u5185\u7f6e\u4e86\u5bf9 WAS \u5f88\u597d\u7684\u652f\u6301\uff0c\u4e0d\u8fc7\u4e5f\u9700\u8981\u672c\u673a\u5b89\u88c5\u4e86 WAS\uff0cWSAD\/RAD \u80a5\u5927\u7684\u8eab\u8eaf\u81ea\u662f\u4e0d\u5fc5\u8bf4\u3002\u82e5\u8981\u8ba9 WSAD\/RAD \u8fdb\u884c\u8fdc\u7a0b\u8c03\u8bd5\uff0c\u4f3c\u4e4e\u8fd8\u5f97\u5728Server \u4e0a\u5b89\u88c5\u4e2a IBM Agent Controller\u3002<br\/>\n<br\/>\n\u5b9e\u9645\u4e0a WAS \u5c31\u652f\u6301\u8fdc\u7a0b\u8c03\u8bd5\u7684\u8bbe\u7f6e\uff0c\u6253\u5f00\u5b83\uff0c\u4f60\u53ea\u9700\u8981\u7528 Eclipse Debug \u4e2d\u7684 Remote Java Application \u529f\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u76f8\u5e94\u7aef\u53e3\u5373\u884c\u3002\u8bbe\u7f6e\u5f88\u7b80\u5355\uff0c\u8fd9\u6837\u7684\u529e\u6cd5\u4f60\u751a\u81f3\u53ef\u4ee5\u5728\u95f2\u65f6\u5077\u5077\u7684\u8c03\u8bd5\u4e00\u4e0b\u751f\u4ea7\u73af\u5883\u7684 WAS \u5e94\u7528\u4ee5\u9a8c\u8bc1\u6d4b\u8bd5\u73af\u5883\u96be\u4ee5\/\u65e0\u6cd5\u91cd\u73b0\u7684\u95ee\u9898\u3002\u5177\u4f53\u505a\u6cd5\u5982\u4e0b(WAS 5.x \u548c 6.x \u4e0b\u7684\u64cd\u4f5c\u57fa\u672c\u76f8\u540c)\uff1a"},{"title":"\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u4e94. \u7ed3\u5408 IronTrack SQL\uff09","link":"https:\/\/yanbin.blog\/p6spy-view-executing-sql-irontrack\/","pubDate":"Tue, 31 Mar 2009 03:18:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/p6spy-view-executing-sql-irontrack\/","description":"\n<p>\u672c\u60f3\u628a p6spy \u7ed3\u5408 SQL Profiler \u6216 IronTrack SQL \u7684\u4f7f\u7528\u4ecb\u7ecd\u6387\u51d1\u4e8e\u4e00\u5757\u6765\u5199\u3002\u7b80\u5355\u70b9\u8bf4\uff0c\u53ea\u662f\u4e00\u8d34\u4e0a\u56fe\u6837\uff0c\u7bc7\u5e45\u4fbf\u9700\u62d6\u62c9\u96be\u9042\u4eba\u613f\uff0c\u4e5f\u597d\uff0c\n\u7d22\u6027\u628a\u5b83\u4eec\u5206\u6210\u4e24\u4e2a\u7bc7\u7ae0\u3002\u4e00\u6765\u6bcf\u7bc7\u4e3b\u65e8\u9c9c\u660e\uff0c\u4e8c\u6765\u4e94\u7bc7\u6210\u4e00\u7cfb\u5217\u6bd4\u8d77\u56db\u66f4\u6765\u7684\u81ea\u7136\u4e14\u5409\u5229\u3002<\/p>\n<p>\u524d\u9762\u8bb2\u8fc7 p6spy \u672c\u8eab\u5c31\u53ef\u5229\u7528 Log4j \u7684\u00a0SocketAppender \u5411\u8fdc\u7aef\u53d1\u9001\u65e5\u5fd7\uff0cSQL Profiler\u00a0\u4e0d\u8fc7\u662f\u5728\u8fd9\u4e2a\u57fa\u7840\u4e0a\u4f5c\u4e86\u8fdb\u4e00\u6b65\u62d3\u5c55\u3002\n\u800c\u63a5\u4e0b\u6765\u8981\u8bf4\u7684 IronTrack SQL \u5c31\u7565\u6709\u4e0d\u540c\u4e86\uff0c\u770b\u5b83\u5e26\u7684 p6spy.properties \u6587\u4ef6\uff0c\u91cc\u9762\u6709 IronTrack SQL \u7ed9 p6spy \u5b9a\u5236\u7684\u4e00\u4e2a\u6a21\u5757\uff1a\nmodule.ibeam=com.irongrid.ibeam.server.IBeamFactory\u3002\u5b83\u7528\u5230\u4e86 log4j-1.2.8.jar\uff0c\u4e0d\u8fc7\u8fd8\u5f97\u7814\u7a76\u4e0b Log4j \u5728\u5176\u4e2d\u6240\u8d77\u7684\u4f5c\u6765\u3002\n\u73b0\u5728\u5c31\u6765\u4ecb\u7ecd p6spy \u7ed3\u5408 IrconTrack SQL \u7684\u4f7f\u7528\uff0c\u6700\u597d\u662f\u4f60\u77e5\u9053\u5982\u4f55\u5355\u72ec\u4f7f\u7528 p6spy\u3002\u538b\u7f29\u5305\u91cc\u6709\u6587\u6863\uff1a\u662f IronTrackSQL\\docs\\index.html\u3002<\/p>"},{"title":"\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u56db. \u7ed3\u5408 SQL Profiler\uff09","link":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-profiler\/","pubDate":"Mon, 30 Mar 2009 20:34:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-profiler\/","description":"\n<p>p6spy \u867d\u597d\uff0c\u4f46\u628a SQL \u8bed\u53e5\u8f93\u51fa\u5230\u6587\u4ef6\u6216\u662f\u63a7\u5236\u53f0\u4e2d\u770b\u8d77\u6765\u6709\u4e9b\u5403\u529b\u3002\u82e5\u80fd\u56fe\u5f62\u754c\u9762\u5c55\u793a\u51fa\u6765\u4fbf\u53ef\u4e00\u76ee\u4e86\u7136\uff0c\u4eb2\u5207\u8bb8\u591a\u3002\u6709\u79cd\u65b9\u6cd5\u662f\u914d\u7f6e p6spy.properties\n\u4f7f\u7528 Log4j \u7684 SocketAppender\uff0c\u7136\u540e\u542f\u52a8 Log4j \u7684 org.apache.log4j.net.SocketServer \u754c\u9762\uff0c\u6216\u662f\u5728 Eclipse log4j plug-in \u4e2d\u4e5f\u80fd\u89c2\u5bdf\u6240\u6267\u884c\u7684 SQL \u8bed\u53e5\u3002<\/p>\n<p>\u4e0d\u8fc7\u8fd8\u6709\u79cd\u66f4\u4e13\u4e1a\u505a\u6cd5\uff0c\u672c\u7bc7\u5c06\u4ecb\u7ecd p6spy \u5982\u4f55\u7ed3\u5408 Sql Profiler \u6216 IronTrack SQL \u6765\u4f7f\u7528\uff0c\u5e76\u9644\u4ee5\u8d34\u56fe\uff0c\u6765\u611f\u53d7\u4e00\u4e0b\u5427\u3002\u4e5f\u4ee5\u6b64\u6765\u5b8c\u6210\u5173\u4e8e p6spy \u7684\u8fd9\u4e2a\u7cfb\u5217\u3002\n\u5176\u5b9e\u4f60\u5230\u540e\u9762\u4e5f\u4f1a\u53d1\u73b0\uff0c\u5373\u4fbf\u662f\u7528 Sql Pofier \u7684\u5b9e\u73b0\u8fc7\u7a0b\u4e5f\u662f\u501f\u52a9\u4e86 Log4j \u7684 SocketApender\uff0c\u4f60\u53ef\u4ee5\u4ece\u5b83\u81ea\u5df1\u5e26\u7684 p6spy.properties \u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u770b\u51fa\u6765\uff0c\n\u5373\u5176\u4e2d\u7684 log4j.appender.SQLPROFILER_CLIENT=org.apache.log4j.net.SocketAppender \u8fd9\u4e48\u4e00\u4e2a\u914d\u7f6e\u3002"},{"title":"\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u4e09. \u5b9a\u5236\u8f93\u51fa\uff09","link":"https:\/\/yanbin.blog\/p6spy-view-custom-java-executing-sql\/","pubDate":"Mon, 16 Mar 2009 05:52:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/p6spy-view-custom-java-executing-sql\/","description":"\n<p>\u65e2\u7136\u63d0\u5230 p6spy \u7684\u8f93\u51fa\uff0c\u90a3\u5c31\u6709\u5fc5\u8981\u8bf4\u660e\u4e00\u4e0b p6spy \u8f93\u51fa\u65e5\u5fd7\u7684\u683c\u5f0f\u4e86\u3002\u4ece\u4e0a\u4e00\u7bc7\n<a href=\"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-tomcat\/\">\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u4e8c. Tomcat \u4e0b\u7684\u914d\u7f6e<\/a>\n\u4e2d\u628a\u8f93\u51fa\u7684\u4e00\u6bb5\u5185\u5bb9\u62ff\u8fc7\u6765\uff0c\u5982\u4e0b\uff1a<\/p>\n<p>\n<span style=\"color: #800080;\">\n03-16-09 15:12:06:656|16|4|statement|SELECT * FROM OM_CUSTOMERS\u00a0 WHERE CUSTOMER_ID=? ORDER BY CUSTOMER_ID ASC|SELECT * FROM OM_CUSTOMERS\u00a0 WHERE CUSTOMER_ID=2194 ORDER BY CUSTOMER_ID ASC<br \/>\n03-16-09 15:12:06:671|15|3|statement|SELECT * FROM OM_ORDER_TYPE WHERE TYPE_ID=?|SELECT * FROM OM_ORDER_TYPE WHERE TYPE_ID=25<br \/>\n03-16-09 15:12:06:687|16|1|statement|select * from sys_lookups where lookup_type=?\u00a0 and lookup_code=? |select * from sys_lookups where lookup_type='OM_ORDER_STATUS'\u00a0 and lookup_code='70'<br \/>\n03-16-09 15:12:06:812|-1||resultset|select * from sys_lookups where lookup_type='OM_ORDER_STATUS'\u00a0 and lookup_code='70' |meaning = \u5df2\u5b89\u6392\u751f\u4ea7"},{"title":"\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u4e8c. Tomcat \u4e0b\u7684\u914d\u7f6e\uff09","link":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-tomcat\/","pubDate":"Fri, 13 Mar 2009 02:15:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-tomcat\/","description":"\n\u5728\u524d\u7bc7 <a href=\"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-first\/\" target=\"_blank\" rel=\"noopener\">\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5(\u4e00. \u5f15\u5b50\uff09<\/a>\u00a0\u5927\u7565\u4ecb\u7ecd\u4e86 p6spy\uff0c\u5e76\u4e14\u5728 <a href=\"http:\/\/www.p6spy.com\/documentation\/install.htm#install\">http:\/\/www.p6spy.com\/documentation\/install.htm#install<\/a>\u00a0\u4e5f\u6709 p6spy \u5728\u4e0d\u540c\u670d\u52a1\u5668\u4e0b\u7684\u5b89\u88c5\u65b9\u6cd5\u3002\u672c\u6587\u4e0d\u6253\u7b97\u4f9d\u7167\u5b98\u65b9\u7684\u8bf4\u660e\u6765\u505a\uff0c\u6211\u4eec\u8ba9 Tomcat \u7684 Common \u7c7b\u52a0\u8f7d\u5668\u6765\u52a0\u8f7d p6spy.jar \u5305\uff0c\u5305\u542b\u4e86 Tomcat 5\/6 \u4e0b\u7684 p6spy \u914d\u7f6e\uff0c\u6570\u636e\u5e93\u8fde\u63a5\u6c60\u5b9e\u73b0\u7528 C3P0\uff0c\u6570\u636e\u5e93\u4e3a Oracle\uff0c\u914d\u7f6e\u5728\u4e00\u4e2a\u4e0e\u5e94\u7528\u540c\u540d\u7684\u5355\u72ec\u7684 xml \u6587\u4ef6\u4e2d\uff0cTomcat \u4e2d\u662f\u5728\u5e94\u7528\u7684 META-INF\/context.xml \u6587\u4ef6\u4e2d\u3002\u6b65\u9aa4\u5982\u4e0b\uff1a<br\/><br\/>\n<strong>1. \u8f6f\u4ef6\u51c6\u5907<br \/>\n<\/strong><br \/>\n\u4e0b\u8f7d Tomcat 5 \u6216\u8005 6 \u8fdb\u884c\u5b89\u88c5\uff0c\u4e0d\u5fc5\u591a\u8bf4\u3002\u5047\u8bbe\u7f6e Tomcat \u7684\u76ee\u5f55\u4e3a $TOMCAT_HOME\u3002<br \/>\n\u4e0b\u8f7d <a href=\"http:\/\/prdownloads.sourceforge.net\/p6spy\/p6spy-install.zip?download\"><span style=\"font-family: Verdana; font-size: x-small;\">p6spy-install.zip<\/span><\/a>\uff0c\u89e3\u538b\u7f29 p6spy-install.zip\uff0c\u5176\u4e2d\u6709 p6spy.jar \u548c spy.properties<br \/>\n\u51c6\u5907\u597d\u6570\u636e\u5e93\u7684\u9a71\u52a8\u5305\uff0c\u6bd4\u5982 Oracle \u7684 classes12.jar\uff0c\u548c C3P0 \u5b9e\u73b0\u5305\uff0c\u5982 c3p0-0.9.0.2.jar\u3002"},{"title":"\u7528 p6spy \u6765\u89c2\u5bdf Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u7684\u6240\u6709 SQL \u8bed\u53e5\uff08\u4e00. \u5f15\u5b50\uff09","link":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-first\/","pubDate":"Wed, 11 Mar 2009 09:20:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/p6spy-view-java-executing-sql-first\/","description":"\n\u4e00\u4e2a\u4f01\u4e1a\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\u74f6\u9888\u53ef\u80fd\u4f1a\u5728\u786c\u4ef6\u914d\u7f6e\u3001\u7f51\u7edc\u65b9\u9762\u3001\u7a0b\u5e8f\u4ee3\u7801\u3001\u5e94\u7528\u670d\u52a1\u5668\u914d\u7f6e\u3001\u6570\u636e\u5e93\u914d\u7f6e\u3001SQL \u8bed\u53e5\u3002\u8fd9\u91cc\u6211\u628a\u672c\u6587\u7684\u5173\u6ce8\u70b9 SQL \u65e0\u610f\u95f4\u653e\u5728\u4e86\u6700\u540e\uff0c\u5176\u5b9e\u5b83\u4e0d\u5e76\u4e0d\u610f\u5473\u7740\u6700\u540e\u8003\u8651\u7684\uff0c\u800c\u662f\u8fc7\u7a0b\u4e2d\u5c31\u8981\u65f6\u523b\u7559\u610f\u7684\u3002<br\/>\n<br\/>\nSQL \u8bed\u53e5\u7684\u4f18\u5316\u603b\u5f97\u628a\u6240\u6267\u884c\u8bed\u53e5\u6293\u51fa\u6765\u77a7\u77a7\uff0c\u5206\u6790\u5206\u6790\u3002\u5982\u679c\u76f4\u63a5\u7528 JDBC \u6216\u8005\u662f\u7c7b iBatis \u7684\u4e1c\u897f\u6765\u8bbf\u95ee\u6570\u636e\u5e93\uff0c\u90a3\u6240\u6267\u884c\u7684 SQL \u8bed\u53e5\u662f\u660e\u786e\u7684\uff0c\u800c\u73b0\u5728\u7684\u9879\u76ee\u5927\u591a\u4f1a\u7528 ORM \u7ec4\u4ef6\uff0c\u4f8b\u5982 Hibernate\u3001JPA\u3001CMP\u3001TopLink \u90fd\u6709\u81ea\u5df1\u7279\u5b9a\u7684\u67e5\u8be2\u8bed\u6cd5\uff0c\u6700\u7ec8\u5f53\u7136\u8981\u8f6c\u6362\u6210 SQL \u8bed\u53e5\u7684\uff0c\u6240\u4ee5\u4f1a\u751f\u6210\u4ec0\u4e48\u6837\u7684 SQL \u8bed\u53e5\u5c31\u4e0d\u751a\u660e\u4e86\uff0c\u82e5\u4eba\u4e3a\u7684\u770b\u7740\u4e13\u6709\u67e5\u8be2\u8bed\u53e5\u6765\u76f8\u8c61\u51fa SQL \u8bed\u53e5\u5e76\u975e\u6613\u4e8b\u3002\u867d\u7136 Hibernate \u8bbe\u7f6e show_sql=true \u65f6\u4e5f\u80fd\u6253\u5370\u51fa\u751f\u6210\u7684 SQL(\u5e26\uff1f\u53f7\u53c2\u6570)\uff0c\u914d\u5408\u8be6\u7ec6\u7684\u65e5\u5fd7\u53c2\u6570\u503c\u4e5f\u53ef\u4ee5\u5bf9\u4e0a\uff0c\u4e0d\u8fc7\u633a\u9ebb\u70e6\u7684\u3002"},{"title":"Maven \u5f00\u53d1\u8005\u624b\u518c\u7ffb\u8bd1\u8fdb\u884c\u4e2d......","link":"https:\/\/yanbin.blog\/maven-manual-translating\/","pubDate":"Thu, 16 Oct 2008 12:41:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maven-manual-translating\/","description":"\n<p>\u770b\u5230 Maven \u4e0d\u65ad\u7684\u6f14\u8fdb, \u8457\u540d\u7684\u00a0 Appfuse \u4e5f\u6452\u5f03\u4e86 Ant \u800c\u91c7\u7528\u4e86 Maven \u4f5c\u4e3a\u5b83\u7684\u6784\u5efa\u7ba1\u7406\u5de5\u5177\uff0c\u5404\u4e2a Java IDE \u5bf9\u4e8e Maven \u7684\u652f\u6301\u4e5f\u662f\u7eb7\u7eb7\u4e0a\u9a6c\uff0c\u6240\u4ee5\u6025\u8feb\u7684\u611f\u89c9\u5bf9\u4e8e Maven \u7684\u51fa\u73b0\u662f\u4e0d\u5bb9\u5ffd\u89c6\u4e86\u3002Ant \u7eb5\u7136\u662f\u80fd\u6ee1\u8db3\u4e8e\u6211\u4eec\u7684\u9700\u6c42\uff0c\u4e0d\u8fc7 Ant \u7684 build.xml \u811a\u672c\u603b\u90a3\u4e48\u81c3\u80bf\u4e0d\u582a\uff0c\u4e0d\u5229\u4e8e\u9605\u8bfb\u3002<\/p><p>\u800c Maven \u4e0e Ant \u540c\u51fa\u4e00\u65cf\uff0c\u4e3a Apache \u95e8\u4e0b\u7684\u5e08\u5144\u5f1f\u3002\u65e2\u7136 Apache \u4f1a\u518d\u53d1\u660e\u8fd9\u6837\u4e00\u4e2a\u65b0\u8f6e\u5b50\uff0c\u76f8\u6bd4\u4e8e Ant \u786e\u6709\u5b83\u7684\u8bb8\u591a\u72ec\u5230\u4e4b\u5904\u3002Maven \u4f9d\u8d56\u4e86 ant-x.x.x \u5305\uff0c\u4f46\u8981\u8bf4\u662f\u5efa\u7acb\u5728 Maven \u4e4b\u4e0a\u7684\u8bdd\u6050\u6709\u4e0d\u592a\u5408\u9002\u3002<\/p><p>\u5173\u4e8e Maven \u4e0e Ant \u4e4b\u95f4\u6bd4\u8f83\u7684\u6587\u7ae0\u5728\u7f51\u4e0a\u80fd\u627e\u5230\u4e0d\u5c11\uff0c\u5982 <a href=\"http:\/\/www.matrix.org.cn\/thread.shtml?topicId=16836&amp;forumId=31\" target=\"_blank\">maven\u548cant\u7684\u6bd4\u8f83<\/a>\u3002\u5177\u4f53\u7684\u4e0d\u7ec6\u8bf4\uff0c\u7565\u8868\u51e0\u4e2a Maven \u5173\u952e\u4e4b\u5904\uff1a1. \u5bf9\u4f9d\u8d56\u5305\u7684\u5904\u7406\u5341\u5206\u4f18\u96c5\uff1b2. \u6709\u5927\u91cf\u53ef\u7528\u7684\u63d2\u4ef6\u652f\u6301\uff1b3. \u4fbf\u4e8e\u4e0e\u5176\u4ed6\u5de5\u5177\u7684\u652f\u6301\uff1b4. \u9002\u5408\u4e8e\u591a\u9879\u76ee\u7684\u5f00\u53d1\u3002\u672c\u4eba\u4e5f\u662f\u63a5\u89e6\u4e0d\u4e45\uff0c\u8fd8\u6709\u8bb8\u591a\u6709\u5f85\u53d1\u6398\u3002"},{"title":"Maven 1 \u7684 Unknown error downloading; status code was: 301 \u9519\u8bef\u89e3\u51b3","link":"https:\/\/yanbin.blog\/maven-1-301-unknown-error-downloading\/","pubDate":"Tue, 14 Oct 2008 02:10:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maven-1-301-unknown-error-downloading\/","description":"\n\u73b0\u5728\u65e9\u5df2\u662f Maven 2 \u4e86\uff0c\u53ef\u8fd8\u662f\u6709\u673a\u4f1a\u7528\u4e86\u4e00\u4e0b Maven 1\uff0c\u6240\u7528\u7684\u7248\u672c\u662f Maven 1.0.2\uff0c\u521a\u5f00\u59cb\u5c1d\u8bd5\u7684\u65f6\u5019\u51fa\u73b0\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\uff1a<br\/>\n<br\/>\n<strong>1. \u6267\u884c maven genapp \u65f6\u4ea7\u751f\u5982\u4e0b\u5f02\u5e38\uff1a<\/strong><br\/>\n<br\/>\n<span style=\"color: #800080;\">???????? commons-jelly-tags-interaction-20030211.143817.jar????<br\/>\nError retrieving artifact from [http:\/\/www.ibiblio.org\/maven\/commons-jelly\/jars\/commons-jelly-tags-interaction-20030211.143817.jar]: java.net.ConnectException: Connection timed out: connect<br\/>\n?????? commons-jelly-tags-interaction-20030211.143817.jar ?????\u00a7\u00b0???<br\/>\n???????????????\u00b1???????\u00a8??????????<\/span><br\/>\n<br\/>\n<span style=\"color: #800080;\">commons-jelly-tags-interaction-20030211.143817.jar"},{"title":"\u4e3a JDOM \u89e3\u6790 XML \u6587\u4ef6\u6210 Document \u52a0\u901f","link":"https:\/\/yanbin.blog\/speed-jdom-resolve-xml\/","pubDate":"Fri, 03 Oct 2008 23:49:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/speed-jdom-resolve-xml\/","description":"\n\u672c\u7bc7\u8bb2\u8ff0\u5728 XML \u4e2d\u4f7f\u7528\u4e86 DTD \u7684\u60c5\u51b5\u4e0b\uff0c\u7528 JDOM \u89e3\u6790\u65f6\u5982\u4f55\u52a0\u901f\uff0c\u4f7f\u7528 Schema \u9a8c\u8bc1 XML \u7684\u4e0d\u5728\u8ba8\u8bba\u4e4b\u4e2d\u3002\u6240\u7528\u7684\u662f\u4e00\u4e2a Struts 1.3 \u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5927\u5c0f\u4e3a 102 K\u3002<\/p>\n\u6211\u4eec\u7528 JDOM \u89e3\u6790 XML \u6700\u7b80\u5355\u7684\u4ee3\u7801\u83ab\u8fc7\u4e8e\u4ee5\u4e0b\u4e24\u884c\u4ee3\u7801\uff0c\u4e0d\u8fc7\u4e3a\u4e86\u6d4b\u8bd5\u6211\u4eec\u5728\u5176\u524d\u540e\u52a0\u4e0a\u8bb0\u5f55\u6267\u884c\u65f6\u95f4\u7684\u4ee3\u7801\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"n\">start<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">SAXBuilder<\/span><span class=\"w\"> <\/span><span class=\"n\">builder<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">SAXBuilder<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">Document<\/span><span class=\"w\"> <\/span><span class=\"n\">document<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"na\">build<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;struts-config.xml&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u8017\u65f6\uff1a&#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"p\">()<\/span><span class=\"o\">-<\/span><span class=\"n\">start<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"s\">&#34; \u6beb\u79d2.&#34;<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5728\u8fd9\u4e2a struts-config.xml \u4e2d\u7684 DTD \u58f0\u660e\u5982\u4e0b\uff1a"},{"title":"\u7528 JFugue \u7ed9 Ant \u6784\u5efa\u5b8c\u6210\u5206\u522b\u5728\u6210\u529f\u6216\u5931\u8d25\u65f6\u52a0\u4e0a\u4e0d\u540c\u7684\u58f0\u97f3\u63d0\u9192","link":"https:\/\/yanbin.blog\/java-jfugue-ant-build-sound\/","pubDate":"Tue, 23 Sep 2008 03:48:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-jfugue-ant-build-sound\/","description":"\n\u73b0\u5728\u57fa\u672c\u7528 Eclipse\uff0c\u6240\u6709\u7684\u64cd\u4f5c\u90fd\u5728\u65e0\u58f0\u65e0\u606f\u4e2d\u8fdb\u884c\u7684\uff0c\u9664\u4e86\u64cd\u4f5c\u7cfb\u7edf\u5e26\u6765\u7684\u5494\u5693\u58f0\u8fd8\u6709\u4f60\u7684\u547c\u54e7\u58f0\u3002\u6000\u5ff5\u8d77\u4f7f\u7528 JBuilder \u7684\u65f6\u4ee3\u4e86\uff0c\u5728 JBuilder \u4e2d\u7f16\u8bd1\u3001\u6267\u884c\u7a0b\u5e8f\u6216 Ant \u811a\u672c\uff0c\u5728\u6210\u529f\u6216\u5931\u8d25\u65f6\u90fd\u6709\u4e0d\u540c\u7684\u58f0\u97f3\u63d0\u9192\u3002<br\/><br\/>\n\u90a3\u6211\u4eec\u4e0d\u59a8\u4e5f\u6765\u7528 JFugue \u8ba9 Ant \u6784\u5efa\u6210\u529f\u6216\u5931\u8d25\u65f6\u53d1\u51fa\u4e0d\u540c\u7684\u58f0\u97f3\uff0c\u5173\u4e8e JFugue \u7684\u4f7f\u7528\u5728 <a href=\"https:\/\/yanbin.blog\/java-music-jfugue\/\">\u8ba9 Java \u8f7b\u677e\u4e50\u52a8\u8d77\u6765\uff0c\u4f7f\u7528 JFugue \u5236\u4f5c\u81ea\u5df1\u7684\u97f3\u4e50<\/a>\u00a0\u4ecb\u7ecd\u8fc7\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u80fd\u5728\u95ed\u76ee\u517b\u795e\u4e2d\u5b8c\u6210 Ant \u7684\u6784\u5efa\uff0c\u542c\u58f0\u97f3\u5c31\u77e5\u9053\u6210\u529f\u8fd8\u662f\u5931\u8d25\u3002\u5f53\u7136\uff0c\u654f\u6377\u8fc7\u7a0b\u4e2d\u591a\u662f\u5728\u665a\u4e0a\u65e0\u4eba\u503c\u5b88\u7684\u65f6\u5019\u5b8c\u6210\u81ea\u52a8\u6784\u5efa\uff0c\u90a3\u665a\u4e0a\u53ef\u8981\u5c0f\u5fc3\uff0c\u522b\u5413\u7740\u9b3c\u4e86\u3002<br\/><br\/>\n\u5b9e\u73b0\u539f\u7406\uff0c\u542f\u52a8 ant \u65f6\u7528\u53c2\u6570 -logger YourLoggerClass \u6307\u5b9a\u4f60\u81ea\u5df1\u7684 Logger \u7c7b(\u4e5f\u662f\u4e00\u4e2a\u76d1\u542c\u5668)\uff0c\u5728\u4f60\u7684 Logger \u7c7b\u7684 buildFinished(BuildEvent event) \u65f6\uff0c\u53d1\u73b0\u65e0\u5f02\u5e38\uff0c\u8868\u793a\u6210\u529f\uff0c\u7528 JFugue \u53d1\u51fa\u4e00\u79cd\u58f0\u97f3\uff0c\u6709\u5f02\u5e38\u65f6\uff0c\u8868\u65f6\u5931\u8d25\uff0c\u7528 JFugue \u53d1\u51fa\u53e6\u5916\u4e00\u79cd\u58f0\u97f3\u3002"},{"title":"\u8ba9 Java \u8f7b\u677e\u4e50\u52a8\u8d77\u6765\uff0c\u4f7f\u7528 JFugue \u5236\u4f5c\u81ea\u5df1\u7684\u97f3\u4e50","link":"https:\/\/yanbin.blog\/java-music-jfugue\/","pubDate":"Fri, 19 Sep 2008 04:53:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-music-jfugue\/","description":"\n\u5b66\u8fc7\u6216\u7528\u8fc7 Basic \u7684\u670b\u53cb\u5927\u7ea6\u8fd8\u4f1a\u8bb0\u5f97\uff0c\u5728 Basic \u91cc\u8981\u6f14\u594f(\u5f53\u65f6\u8fd8\u662f\u4ece PC \u5587\u53ed\u91cc\u53d1\u51fa\u7684\uff0c\u73b0\u5728\u4e5f\u80fd\u8d70\u58f0\u5361\u4e86)\u4e00\u6bb5 <span style=\"color: #0000ff;\">\u54c6\u6765\u54aa\u53d1\u5506\u62c9\u897f\u54c6<\/span> \u53ef\u4ee5\u5199\u6210\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-basic\" data-lang=\"basic\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kr\">PLAY<\/span><span class=\"w\"> <\/span><span class=\"s2\">&#34;C D E F G A B O6C&#34;<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u76f4\u63a5\u7528 JDK \u53ef\u6ca1\u6709\u8fd9\u4e48\u7b80\u5355\uff0c\u867d\u7136 JDK 1.3 \u5f00\u59cb\u5c31\u5f15\u5165\u4e86 Java Sound API \u5904\u7406 MIDI(Musical Instrument Digital Interface)\uff0c\u53ef\u662f\u5b83\u7684\u63a5\u53e3\u5f88\u96be\u4f7f\u7528\uff0c\n\u53e6\u5916\uff0cSun \u4e5f\u4e13\u4e3a\u89c6\u3001\u97f3\u9891\u7684\u6355\u83b7\u3001\u56de\u653e\u3001\u683c\u5f0f\u8f6c\u6362\u63d0\u4f9b\u4e86\n<a href=\"http:\/\/java.sun.com\/javase\/technologies\/desktop\/media\/jmf\/\" target=\"_blank\">Java Media Framework API <\/a>\n(JMF)\uff0c\u4f46\u4e0d\u80fd\u7528\u6765\u521b\u4f5c\u3002\u6709\u4e00\u4e2a\u5f00\u6e90\u7684\u7ec4\u4ef6 JFugue(<a href=\"http:\/\/www.jfugue.org\/\">http:\/\/www.jfugue.org\/<\/a>)\uff0c\n\u5b83\u80fd\u8ba9\u4f60\u5c3d\u663e\u97f3\u4e50\u65b9\u9762\u7684\u5929\u8d4b\uff0c\u7ed9\u4f60\u4e00\u4e2a\u9ad8\u7ea7\u6613\u7528\u7684\u63a5\u53e3\u6765\u64cd\u4f5c Java Sound\uff0c\u5236\u4f5c\u81ea\u5df1\u7684 MIDI \u97f3\u4e50\u3002"},{"title":"\u53c8\u662f Oracle JDBC \u9a71\u52a8\u7248\u672c\u592a\u4f4e\u5f15\u53d1\u7684\u9519\u8bef-rs.getByte() \u7684\u5dee\u5f02","link":"https:\/\/yanbin.blog\/oracle-jdbc-low-version-rs-getbyte\/","pubDate":"Thu, 28 Aug 2008 06:05:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/oracle-jdbc-low-version-rs-getbyte\/","description":"\n<p>\u524d\u9762\u5199\u8fc7\u4e00\u4e2a\u56e0\u4e3a Oracle \u9a71\u52a8\u7248\u592a\u4f4e\u5f15\u8d77\u7684\u4e00\u5728\u9898\uff1a<a id=\"viewpost1_TitleUrl\" href=\"https:\/\/yanbin.blog\/oracle-low-jdbc-version-unknow-chars\/\">Oracle \u9a71\u52a8\u7248\u672c\u5f15\u8d77\u7684\u663e\u793a\u5b57\u6bb5\u5947\u602a\u7f16\u7801\u95ee\u9898<\/a>\u3002\n\u4eca\u5929\u53c8\u9047\u7740\u4e00\u4e2a\u3002<\/p>\n<p>\u672c\u5730\u5199\u597d\u7684\u4e00\u6bb5\u8fde\u63a5\u6570\u636e\u5e93\u7684\u7a0b\u5e8f\uff0c\u4e00\u653e\u5230\u6b63\u5f0f\u670d\u52a1\u5668\u4e0a\u53c8\u4e0d\u80fd\u6b63\u5e38\u5de5\u4f5c\u4e86\uff0c\u539f\u6765\u7684\u4ee3\u7801\u4e2d\u6ca1\u6709\u6253\u5370\u51fa\u5f02\u5e38\u6808\uff0c\u90fd\u770b\u4e0d\u51fa\u4ec0\u4e48\u95ee\u9898\u6765\uff0c\u540e\u6765\u52a0\u4e0a\u5f02\u5e38\u6808\u8f93\u51fa\uff0c\u5f97\u5230\u5982\u4e0b\u4fe1\u606f\uff1a<\/p>\n<p><span style=\"color: #ff1493;\">Fail to convert to internal representation<br \/> \u00a0java.sql.SQLException: Fail to convert to internal representation<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:219)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 at oracle.jdbc.driver.OracleStatement.getLongValue(OracleStatement.java:3022)"},{"title":"\u60f3\u9009\u4e00\u79cd\u52a8\u6001\u8bed\u8a00\uff0b\u8de8\u5e73\u53f0\u754c\u9762\u7ec4\u4ef6\u7684\u7ec4\u5408\uff0c\u5e0c\u671b\u5927\u5bb6\u7ed9\u70b9\u610f\u89c1","link":"https:\/\/yanbin.blog\/script-plus-crossed-widget\/","pubDate":"Thu, 31 Jul 2008 09:02:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/script-plus-crossed-widget\/","description":"\n\u539f\u6765\u53ea\u662f\u5173\u6ce8\u8fc7\u8de8\u5e73\u53f0\u7ec4\u4ef6\u7684\u9009\u62e9\u5bf9\u6bd4\uff0c\u6709 GTK\u3001wxWidgets\u3001Qt\u3001AWT\/SWING\u3001SWT\u3002<br\/>\n<br\/>\nGTK \u662f GNOME \u7684\u5b9e\u73b0\u7ec4\u4ef6<br\/>\n<br\/>\nwxWidgets \u5bf9\u4e8e\u7528\u8fc7 MFC \u7684\u4eba\u6765\u8bf4\u7528\u8d77\u6765\u5f88\u987a\u624b<br\/>\n<br\/>\nQt \u662f KDE \u7684\u5b9e\u73b0\u7ec4\u4ef6<br\/>\n<br\/>\nAWT\/SWING \u65e0\u9700\u591a\u8bf4\uff0cSWT \u76f8\u4fe1\u4e5f\u4e3a Java \u5f00\u53d1\u4eba\u5458\u719f\u77e5\u4e86\u3002<br\/>\n<br\/>\n\u66fe\u5f97\u76ca\u4e8e VC \u5199\u7684\u7a0b\u5e8f\u5c0f\u5de7\u4e14\u57fa\u672c\u4e0a\u62f7\u4e2a EXE \u6587\u4ef6\u5230\u522b\u4eba\u673a\u5668\u4e0a\u5c31\u80fd\u8fd0\u884c\uff0c\u6240\u4ee5\u5e0c\u671b\u8fd8\u662f\u7528 C++ \u6765\u7f16\u5199\u754c\u9762\u7a0b\u5e8f\uff0c\u6240\u4ee5\u8003\u8651\u8fc7 wxWidgets \u548c Qt\u3002\u540e\u6765\u53d1\u73b0\u8fd9\u4e24\u4e2a\u7ec4\u4ef6\u7684\u52a8\u6001\u5e93\u7684\u4e2a\u5934\u4e5f\u4e0d\u5c0f\uff0c\u5373\u4f7f\u5728\u5ba2\u6237\u7aef\u5b89\u88c5\u4e2a JRE \u53c8\u4f55\u59a8\uff0c\u4f55\u51b5 JAVA+SWT \u7684\u7a0b\u5e8f\u4e0e wxWidgets\/Qt \u7684\u672c\u5730\u7a0b\u5e8f\u901f\u5ea6\u4e0a\u5dee\u522b\u5df2\u4e0d\u5927\u3002\u7efc\u4e0a\uff0c\u5982\u679c\u4ec5\u4ec5\u662f\u8de8\u5e73\u53f0\u7684\u754c\u9762\u7a0b\u5e8f\u4e2a\u4eba\u770b\u91cd JAVA+SWT \u4e86\uff0cSWING \u7ed9\u6211\u4ea7\u751f\u7684\u6b32\u671b\u8fd8\u4e0d\u5927\u3002"},{"title":"JDBC \u8fde\u63a5 Oracle \u65f6\uff0c\u7528 rs.absolute(n) \u771f\u7684\u4e0d\u5982 n \u6b21 next() \u6027\u80fd\u597d","link":"https:\/\/yanbin.blog\/jdbc-oracle-rs-absoluten-or-next-n\/","pubDate":"Thu, 24 Jul 2008 09:16:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdbc-oracle-rs-absoluten-or-next-n\/","description":"\n\u524d\u9762\u5199\u8fc7\u4e00\u7bc7\uff1a<a id=\"viewpost1_TitleUrl\" href=\"https:\/\/yanbin.blog\/oracle-low-jdbc-version-unknow-chars\">Oracle \u9a71\u52a8\u7248\u672c\u5f15\u8d77\u7684\u663e\u793a\u5b57\u6bb5\u5947\u602a\u7f16\u7801\u95ee\u9898<\/a>\u3002\u8bb2\u5230\u56e0 Oracle 8.0.5 \u4e0d\u652f\u6301\u5b50\u67e5\u8be2\u6392\u5e8f\uff0c\u4e3a\u6539\u5584\u539f\u6765\u90a3\u79cd\u6bcf\u6b21\u7ffb\u9875\u65f6\u90fd\u634b\u51fa\u6240\u6709\u6570\u636e\u6210\u5bf9\u8c61\u5230 List \u4e2d\uff0c\u7136\u540e\u4ece\u4e2d\u62e3\u53d6\u9875\u9762\u5b9e\u9645\u8981\u663e\u793a\u7684\u8bb0\u5f55\u7684\u6027\u80fd\u95ee\u9898\u65f6\uff0c\u91c7\u7528\u4e86 rs.absolute() \u76f4\u63a5\u8df3\u5230\u8d77\u59cb\u8bb0\u5f55\u6e38\u6807\u7684\u65b9\u6cd5\uff0c\u4f46\u53c8\u5f15\u5165\u4e86\u4e71\u7801\u95ee\u9898\uff0c\u4f8b\u5982\uff1a\"\u65e0\u6548\"\uff0c\u53d8\u6210\u4e86 \"0xE697A0E69588\"\u3002<br\/><br\/>\n\u867d\u8bf4\uff0c\u6362\u4e2a\u9a71\u52a8\uff0c\u5982 8.1.7.0.0 \u4ee5\u4e0a\u7248\u672c\u7684\u9a71\u52a8\u5c31\u80fd\u89e3\u51b3\u4e71\u7801\u7684\u95ee\u9898\uff0c\u4f46\u8fd9\u4e00\u6362\u53c8\u6015\u4f1a\u5f71\u54cd\u5230\u5176\u4ed6\u7684\u5e94\u7528\u3002\u6709\u670b\u53cb\u8bc4\u8bba\u8bf4\uff0c\u5176\u5b9e\u5faa\u73af next() \u5230\u67d0\u5904\u6bd4 absolute() \u5b9a\u4f4d\u8981\u597d\uff0c\u4e4d\u4e00\u770b\uff0c\u6709\u4e9b\u7275\u5f3a\uff0c\u4e0d\u8fc7\u8bd5\u8bd5\u5c31\u77e5\u9053\u4e86\u3002\u4e0b\u9762\u5c31\u6765\u505a\u6837\u4e00\u4e2a\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u4ee3\u7801\u5982\u4e0b\uff1a"},{"title":"\u78b0\u5230\u4e00\u4e2a\u4e0d\u77e5\u5982\u4f55\u89e3\u91ca\u7684 Java \u63a7\u5236\u53f0\u7a0b\u5e8f\u7684\u5185\u5b58\u95ee\u9898","link":"https:\/\/yanbin.blog\/explain-java-console-memory-leak\/","pubDate":"Tue, 22 Jul 2008 00:19:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/explain-java-console-memory-leak\/","description":"\n\u6709\u4e00 Java \u63a7\u5236\u53f0\u7a0b\u5e8f\uff0c\u542f\u52a8\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u4e4b\u540e\u4ece Windows \u4efb\u52a1\u7ba1\u7406\u5668\u91cc\u770b\u5b83\u6240\u5360\u7528\u7684\u5185\u5b58\u7a33\u5b9a\u5728 540M \u5de6\u53f3\u3002<\/p>\n<br\/>\n\u542f\u52a8\u53c2\u6570\u662f\uff1a-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128<br\/><br\/>\n\u4f46\u53ea\u8981\u4f60\u628a\u90a3\u4e2a\u63a7\u5236\u53f0\u7a97\u53e3\u6700\u5c0f\u5316\u540e\uff0c\u89c2\u5bdf\u5230\u7684\u5185\u5b58\u7528\u77ac\u95f4\u4e0b\u964d\u5230 100 \u591aM\uff0c\u6709\u65f6\u5019\u751a\u81f3\u662f\u51e0\u5341M\u3002\u7136\u540e\u4e0d\u7ba1\u662f\u7a97\u53e3\u4fdd\u6301\u6700\u5c0f\u5316\u8fd8\u662f\u6062\u590d\u4e86\uff0c\u5b83\u6240\u5360\u7528\u7684\u5185\u5b58\u53c8\u4ee5\u51e0\u5341M\u51e0\u5341M\u7684\u4e0a\u626c\uff0c\u76f4\u81f3\u5148\u524d\u7684 540 M \u5de6\u53f3\u3002\u6bcf\u6b21\u6700\u5c0f\u5316\u7a97\u53e3\u90fd\u53ef\u4ee5\u89c2\u5bdf\u5230\u8fd9\u79cd\u73b0\u8c61\u3002<br\/><br\/>\n\u63a7\u5236\u53f0\u7a97\u53e3\u7684\u53c2\u6570\uff1a\u5c4f\u5e55\u7f13\u51b2\u533a\u5927\u5c0f\uff1a\u5bbd 120\uff1b\u9ad8 300\u3002\u7a97\u53e3\u5927\u5c0f\uff1a\u5bbd 120\uff1b\u9ad8 40\u3002<br\/><br\/>\n\u4e0d\u77e5\u9053\u5728\u63a7\u5236\u53f0\u7a97\u53e3\u6700\u5c0f\u5316\u90a3\u65f6\uff0cJVM \u505a\u4e86\u4e9b\u4ec0\u4e48\u4e8b\u60c5\u80fd\u8ba9\u5185\u5b58\u9aa4\u964d\u4e0b\u6765\uff0c\u800c\u590d\u53c8\u5347\u56de\u53bb\u3002"},{"title":"Oracle \u9a71\u52a8\u7248\u672c\u5f15\u8d77\u7684\u663e\u793a\u5b57\u6bb5\u5947\u602a\u7f16\u7801\u95ee\u9898","link":"https:\/\/yanbin.blog\/oracle-low-jdbc-version-unknow-chars\/","pubDate":"Thu, 17 Jul 2008 07:03:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/oracle-low-jdbc-version-unknow-chars\/","description":"\n\u5f00\u95e8\u89c1\u5c71\u628a\u4ea7\u751f\u95ee\u9898\u7684\u539f\u56e0\u7684\u89e3\u51b3\u529e\u6cd5\u5217\u51fa\u6765\u3002<\/p>\n<br\/>\n\u6211\u4eec\u4e00\u822c\u83b7\u53d6 Statement \u90fd\u662f\u901a\u8fc7 conn.createStatement() \u65b9\u6cd5\uff0c\u5f88\u5c11\u4f20\u9012\u53c2\u6570\u7ed9\u5b83\u7684\uff0c\u6240\u4ee5\u5176\u5185\u7f6e\u5c5e\u6027\u90fd\u53d6\u9ed8\u8ba4\u503c\u7684\uff0c\u53d6\u8bb0\u5f55\u53ea\u7528 while(rs.next()) \u9010\u4e2a\u53d6\u5373\u53ef\u3002\u7136\u800c\u6709\u4e00\u4e2a\u9700\u6c42(Oracle 8i \u4e4b\u524d\u7684\u7248\u672c\u4e0d\u652f\u6301\u5b50\u67e5\u8be2\u6392\u5e8f\uff0c\u6240\u4ee5\u65e0\u6cd5\u7528 rownum \u53d6\u5206\u9875\u8bb0\u5f55) \u662f\u901a\u8fc7\u5982\u4e0b\u4ee3\u7801\u6765\u5f97\u5230 Statement\uff1a<br\/><br\/>\nStatement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);<br\/><br\/>\n\u7531\u5b83\u83b7\u5f97\u7684\u7ed3\u679c\u96c6\u53ef\u4ee5 rs.absolute(n) \u76f4\u63a5\u8df3\u5230\u7b2c n \u884c\u8bb0\u5f55\u6765\u83b7\u5f97\u503c\uff0c\u4f46\u5c31\u8fd9\u4e2a\u7528\u6cd5\u51fa\u95ee\u9898\u4e86\uff0c\u53d6\u51fa\u6765\u7684\u4e2d\u6587\u51fa\u73b0\u4e71\u7801\u4e86\uff0c\u5982 \"\u65e0\u6548\"\uff0c\u53d8\u6210\u4e86 \"0xE697A0E69588\""},{"title":"JSP \u7684 errorPage \u6307\u4ee4\u5f02\u5e38\u8f6c\u5411\u9519\u8bef\u9875\u7684\u5b9e\u73b0\u673a\u5236\u53ca\u5e94\u7528","link":"https:\/\/yanbin.blog\/jsp-errorpage-mechanism-application\/","pubDate":"Fri, 16 May 2008 11:42:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jsp-errorpage-mechanism-application\/","description":"\n\u5982\u6709 index.jsp \u9875\uff0c\u5f53\u51fa\u73b0\u540e\u670d\u52a1\u5668\u7aef\u5f02\u5f02\u5e38\u65f6\u8981\u8f6c\u5411\u5230 errorPage.jsp\uff0c\u5e76\u5728 errorPage.jsp \u4e2d\u628a\u5bf9\u5e94\u9519\u8bef\u4fe1\u606f\u663e\u793a\u51fa\u6765\u3002\u6211\u4eec\u9700\u8981\u5728\u8fd9\u4e24\u4e2a\u9875\u9762\u5206\u522b\u52a0\u4e0a\u6307\u4ee4 <span style=\"color: #800080;\">errorPage=\"errorPage.jsp\"<\/span> \u548c <span style=\"color: #800080;\">isErrorPage=\"true\"<\/span>\u3002<\/p>\n<br\/>\n<strong>index.jsp<\/strong><br\/><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"o\">&lt;%<\/span><span class=\"nd\">@page<\/span><span class=\"w\"> <\/span><span class=\"n\">errorPage<\/span><span class=\"o\">=<\/span><span class=\"s\">&#34;errorPage.jsp&#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">%&gt;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"o\">&lt;%<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">throw<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;exception from jsp&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"o\">%&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u5229\u7528 Ant \u7684 SQL Task \u6765\u5b9e\u73b0\u81ea\u5df1\u7684 Java \u6267\u884c SQL \u811a\u672c\u6587\u4ef6\u7684\u529f\u80fd","link":"https:\/\/yanbin.blog\/ant-sql-task-exec-sql-scripts\/","pubDate":"Thu, 24 Apr 2008 08:03:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ant-sql-task-exec-sql-scripts\/","description":"\n\u524d\u9762\u8bb0\u8f7d\u8fc7\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-execute-sql-script-file\/\" target=\"_blank\" rel=\"noopener noreferrer\">Java \u6267\u884c SQL \u811a\u672c\u6587\u4ef6<\/a>\uff0c\u8fd9\u91cc\u8fb9\u5b8c\u5168\u662f\u7531\u81ea\u5df1\u5199\u4ee3\u7801\u6765\u5206\u79bb\u51fa\u811a\u672c\u4e2d\u7684\u6bcf\u4e00\u4e2a SQL \u8bed\u53e5\u7684\uff0c\u6709\u4e0d\u5c11\u7f3a\u9677\u3002\u5f53\u65f6\u8fd8\u4e0d\u592a\u6e05\u695a ANT \u672c\u8eab\u63d0\u4f9b\u4e86\u529f\u80fd\u5f88\u5f3a\u7684\u6267\u884c SQL \u8bed\u53e5\u548c\u811a\u672c\u7684 SQL Task \u53ef\u7528\u3002\u4ee5\u4e0b\u4f9d\u6b21\u7b80\u5355\u4ecb\u7ecd\u5982\u4f55\u5728 build.xml \u4e2d\u6267\u884c\u00a0SQL \u8bed\u53e5\u6216\u811a\u672c\uff1bJava \u4ee3\u7801\u4e2d\u5982\u4f55\u8c03\u7528 ant \u7684 SQLExec \u7c7b\u6267\u884c SQL \u811a\u672c\uff0c\u6700\u540e\u8003\u8651\u00a0 ant.jar \u7684\u4e2a\u5934\u8bf4\u5927\u4e5f\u4e0d\u5c0f\uff0c1M \u591a\uff0c\u5982\u679c\u53ea\u7528\u4e8e\u6267\u884c SQL \u811a\u672c\uff0c\u5219\u7edd\u5927\u90e8\u5206\u4ee3\u7801\u5c31\u662f\u5783\u573e\uff0c\u6240\u4ee5\u4ece\u540c\u62bd\u79bb\u51fa\u9700\u8981\u7684\u4e24\u4e2a\u7c7b JDBCTask \u548c SQLExec\uff0c\u5b8c\u5168\u53bb\u9664\u4e86\u5bf9 ant.jar \u5305\u7684\u4f9d\u8d56\u3002<br\/><br\/>\n\u6709\u5173 ant \u7684\u66f4\u8be6\u7ec6\u7684\u8bb0\u5f55\u8bf7\u53c2\u89c1\uff0c<a href=\"http:\/\/ant.apache.org\/manual\/CoreTasks\/sql.html\">http:\/\/ant.apache.org\/manual\/CoreTasks\/sql.html<\/a> \u3002"},{"title":"\u4efb\u52a1\u5217\u8868\u5206\u6d3e\u7ed9\u591a\u4e2a\u7ebf\u7a0b\u7684\u7b56\u7565\u53ca\u65b9\u6cd5(\u542b\u5b8c\u6574\u4ee3\u7801\u548c\u6f14\u793a)","link":"https:\/\/yanbin.blog\/task-dispatch-strategy-demo\/","pubDate":"Tue, 25 Mar 2008 11:27:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/task-dispatch-strategy-demo\/","description":"\n\u591a\u7ebf\u7a0b\u4e0b\u8f7d\u7531\u6765\u5df2\u4e45\uff0c\u5982 FlashGet\u3001NetAnts \u7b49\u5de5\u5177\uff0c\u5b83\u4eec\u90fd\u662f\u4f9d\u61d2\u4e8e HTTP \u534f\u8bae\u7684\u652f\u6301(Range \u5b57\u6bb5\u6307\u5b9a\u8bf7\u6c42\u5185\u5bb9\u8303\u56f4)\uff0c\u9996\u5148\u80fd\u8bfb\u53d6\u51fa\u8bf7\u6c42\u5185\u5bb9 (\u5373\u6b32\u4e0b\u8f7d\u7684\u6587\u4ef6) \u7684\u5927\u5c0f\uff0c\u5212\u5206\u51fa\u82e5\u5e72\u533a\u5757\uff0c\u628a\u533a\u5757\u5206\u6bb5\u5206\u53d1\u7ed9\u6bcf\u4e2a\u7ebf\u7a0b\u53bb\u4e0b\u8f7d\uff0c\u7ebf\u7a0b\u4ece\u672c\u6bb5\u8d77\u59cb\u5904\u4e0b\u8f7d\u6570\u636e\u53ca\u81f3\u6bb5\u5c3e\uff0c\u591a\u4e2a\u7ebf\u7a0b\u4e0b\u8f7d\u7684\u5185\u5bb9\u6700\u7ec8\u4f1a\u5199\u5165\u5230\u540c\u4e00\u4e2a\u6587\u4ef6\u4e2d\u3002<\/p>\n<br\/>\n\u53ea\u7814\u7a76\u6709\u7528\u7684\uff0c\u5de5\u4f5c\u4e2d\u7684\u9700\u6c42\uff1a\u8981\u628a\u591a\u4e2a\u4efb\u52a1\u5206\u6d3e\u7ed9\u591a\u4e2a\u7ebf\u7a0b\u53bb\u6267\u884c\uff0c\u8fd9\u5176\u4e2d\u5c31\u4f1a\u6709\u4e00\u4e2a\u4efb\u52a1\u5217\u8868\u6307\u6d3e\u5230\u7ebf\u7a0b\u7684\u7b56\u7565\u601d\u8003\uff1a\u5df2\u77e5\uff1a1. \u4e00\u4e2a\u5f85\u6267\u884c\u7684\u4efb\u52a1\u5217\u8868\uff0c2. \u6307\u5b9a\u8981\u542f\u52a8\u7684\u7ebf\u7a0b\u6570\uff1b\u95ee\u9898\u662f\uff1a\u6bcf\u4e2a\u7ebf\u7a0b\u5b9e\u9645\u8981\u6267\u884c\u54ea\u4e9b\u4efb\u52a1\u3002<br\/><br\/>\n\u7b56\u7565\u662f\uff1a\u4efb\u52a1\u5217\u8868\u8fde\u7eed\u6309\u7ebf\u7a0b\u6570\u5206\u6bb5\uff0c\u5148\u4fdd\u8bc1\u6bcf\u7ebf\u7a0b\u5e73\u5747\u80fd\u5206\u914d\u5230\u7684\u4efb\u52a1\u6570\uff0c\u4f59\u4e0b\u7684\u4efb\u52a1\u4ece\u524d\u81f3\u540e\u4f9d\u6b21\u9644\u52a0\u5230\u7ebf\u7a0b\u4e2d--\u53ea\u662f\u6570\u91cf\u4e0a\uff0c\u5b9e\u9645\u6bcf\u4e2a\u7ebf\u7a0b\u6267\u884c\u7684\u4efb\u52a1\u90fd\u8fd8\u662f\u8fde\u7eed\u7684\u3002\u5982\u679c\u51fa\u73b0\u90a3\u79cd\u50e7\u591a(\u7ebf\u7a0b) \u7ca5(\u4efb\u52a1) \u5c11\u7684\u60c5\u51b5\uff0c\u5b9e\u9645\u542f\u52a8\u7684\u7ebf\u7a0b\u6570\u5c31\u7b49\u4e8e\u4efb\u52a1\u6570\uff0c\u4e00\u6311\u4e00\u3002\u8fd9\u91cc\u53ea\u5b9e\u73b0\u4e86\u6bcf\u4e2a\u7ebf\u7a0b\u5404\u626b\u81ea\u5bb6\u95e8\u524d\u96ea\uff0c\u52a8\u4f5c\u5feb\u7684\u5b8c\u6210\u540e\u773c\u89c1\u522b\u7684\u7ebf\u7a0b\u518d\u7d2f\u90fd\u662f\u7231\u83ab\u80fd\u52a9\u3002"},{"title":"JAVA\u7a0b\u5e8f\u542f\u52a8\u5355\u4e00\u5b9e\u4f8b\u5999\u62db[\u8f6c]","link":"https:\/\/yanbin.blog\/java-startup-single-instance\/","pubDate":"Mon, 24 Mar 2008 06:54:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-startup-single-instance\/","description":"\n\u6bcf\u65e5E\u8bfb,\u95f4\u9694\u51e0\u5929,\u663e\u7684\u6bcf\u65e5E\u8bfb\u4e0d\u6bcf\u4e86,\u65b0\u95fb\u8fc7\u540e,\u7cbe\u5f69\u7ee7\u7eed!\n<br\/><br\/>\n\u4eca\u513f,\u60f3\u8d77\u6765\u6628\u513f,\u89e3\u51b3\u7684\u4e00\u95ee\u9898,\u8d34\u51fa\u6765\u5927\u5bb6\u5b66\u4e60\u4e0b,\u7531\u4e8e\u5de5\u4f5c\u9700\u8981,\u5b66\u4e60,\u54c8\u54c8~!<br\/><br\/>\n\u624b\u5934\u7684\u4e00\u4e2a\u4efb\u52a1,\u662f\u4e2ajava\u7684SWT\u505a\u7684\u684c\u9762\u5e94\u7528\u7a0b\u5e8f,\u6709\u4e00\u9700\u6c42\u662f,\u7a0b\u5e8f\u53ea\u80fd\u542f\u52a8\u4e00\u4e2a\u5b9e\u4f8b,\u4e8c\u6b21\u542f\u52a8\u4f1a\u63d0\u793a\u542f\u52a8\u5931\u8d25!\u7f51\u4e0a\u8f6c\u4e86\u4e00\u5927\u5708\u51e0\u5929\u4e5f\u6ca1\u627e\u5230\u6bd4\u8f83\u7406\u60f3\u7684\u89e3\u51b3\u65b9\u6cd5,\u5728CSND\u7b49\u4e13\u4e1a\u7a0b\u5e8f\u5458\u7f51\u7ad9\u4e0a\u67e5\u627e\u8fc7,\u4e5f\u6ca1\u6709\u627e\u5230!\u6211\u6b63\u8981\u653e\u5f03\u7684\u65f6\u5019,\u54c8\u54c8,\u88ab\u6211\u627e\u5230\u4e86!<br\/><br\/>\n\u627e\u4e86\u4e00\u5199\u65b9\u6848\uff0c\u603b\u7ed3\u8d77\u6765\u5c31\u662f\uff0c\u7cfb\u7edf\u5355\u4e00\u5b9e\u4f8b\uff0c\u5c31\u662f\u67e5\u770b\u5171\u7528\u8d44\u6e90\uff0c\u5982\u679c\u88ab\u5360\u7528\uff0c\u8bf4\u660e\u5df2\u7ecf\u542f\u52a8\uff01\u6709\u4eba\u8bf4\u7528\u5355\u4f8b\u6a21\u5f0f\uff0c\u90a3\u662f\u6ca1\u6709\u4f5c\u7528\u7684\uff01<br\/><br\/>\n\u7f51\u4e0a\u627e\u5230\u7684\u51e0\u79cd\u89e3\u51b3\u65b9\u6848:"},{"title":"SWT \u4e2d\u5b9e\u73b0\u6700\u5c0f\u5316\u5230\u6258\u76d8\u56fe\u6807\uff0c\u5e76\u53ea\u80fd\u901a\u8fc7\u6258\u76d8\u7684\u5f39\u51fa\u83dc\u5355\u5173\u95ed\u7a0b\u5e8f","link":"https:\/\/yanbin.blog\/swt-systray-close-via-tray\/","pubDate":"Sun, 23 Mar 2008 03:05:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/swt-systray-close-via-tray\/","description":"\n\u6211\u4eec\u6709\u4e9b\u7a0b\u5e8f\u4f1a\u60f3\u8981\u6258\u76d8\u5904\u663e\u793a\u56fe\u6807\uff0c\u6700\u5c0f\u5316\u5230\u7cfb\u7edf\u680f\uff1b\u5173\u95ed\u6309\u94ae\u4e0d\u5173\u95ed\u7a0b\u5e8f\uff0c\u4e5f\u662f\u6700\u5c0f\u5316\u5230\u7cfb\u7edf\u680f\uff1b\u70b9\u51fb\u6258\u76d8\u56fe\u6807\u6fc0\u6d3b\u7a97\u53e3\uff0c\u901a\u8fc7\u6258\u76d8\u56fe\u6807\u7684\u5f39\u51fa\u83dc\u5355\u6765\u9000\u51fa\u7a0b\u5e8f\u3002<\/p>\n<br\/>\n\u672c\u6bb5\u4ee3\u7801\u5c31\u662f\u8981\u5b8c\u6210\u8fd9\u6837\u7684\u529f\u80fd\uff0c\u662f SWT\u00a0 \u6765\u5b9e\u73b0\u7684\u3002<br\/><br\/>\n\u76f4\u63a5\u4ee3\u7801\u7ed9\u51fa\uff0c\u4ee3\u7801\u4e2d\u6709\u8f83\u8be6\u7ec6\u7684\u6ce8\u91ca\uff0c\u8bf4\u660e\u4e86\u672c\u7a0b\u5e8f\u7684\u529f\u80fd\u53ca\u5b9e\u73b0\u3002\u6587\u4e2d\u7684\u4efb\u52a1\u680f\u548c\u7cfb\u7edf\u680f\u5e94\u8be5\u77e5\u9053\u662f\u6307\u54ea\u4e00\u6bb5\u5427\uff0c\u5fae\u8f6f\u5c31\u662f\u8fd9\u4e48\u5b9a\u4e49\u7684\uff0c\u7528 spyxx \u7684 findwindow \u7aa5\u63a2\u4e00\u4e0b\u5c31\u77e5\u9053\u4e86\u3002"},{"title":"\u5728\u4ec5\u5b9e\u73b0\u5230 Servlet 2.3\/JSP 1.2 \u89c4\u8303\u3001JDK\u4e3a1.4 \u7684\u5bb9\u5668\u4e2d\u7528 Struts 2 \u4f1a\u6709\u4ec0\u4e48\u95ee\u9898\uff1f","link":"https:\/\/yanbin.blog\/servlet23-jsp12-jdk14-struts2\/","pubDate":"Mon, 25 Feb 2008 08:31:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/servlet23-jsp12-jdk14-struts2\/","description":"\nStruts\u00a0 \u7684\u5b98\u65b9\u7f51\u7ad9 <a href=\"http:\/\/struts.apache.org\/2.0.11\/index.html\">http:\/\/struts.apache.org\/2.0.11\/index.html<\/a>\u00a0\u5217\u51fa\u4e86 Struts 2 \u7684\u5e73\u53f0\u8981\u6c42\u6709\u4e09\uff1a<\/p>\n<br\/>\n<strong>\u00b7 Servlet API 2.4<\/strong><br \/>\n<strong>\u00b7 JSP API 2.0<\/strong><br \/>\n<strong>\u00b7 Java 5\n<\/strong><br \/>\n<br\/>\n\u4f46\u5982\u679c\u575a\u6301\u8981\u7528 Java 4 \u4e5f\u884c\uff0cStruts 2 \u5728 j4 \u76ee\u5f55\u4e0b\u63d0\u4f9b\u6709\u7528 retrotranslator \u8f6c\u6362\u8fc7\u7684 struts2-core-j4-2.x.x.jar \u548c xwork-j4-2.x.x \u53ef\u7528\u3002<br\/><br\/>\n\u5c31\u662f\u8bf4\u6362\u4e24\u4e2a\u5305\u53ef\u4ee5 \u8ba9 Struts 2 \u7528 Java 4 \u73af\u5883\u4e2d\uff0c\u4f46\u662f\u672a\u63d0\u53ca\u80fd\u4e0d\u80fd\u7528\u4e8e Servlet API 2.3\/JSP API\u00a01.2 \u7684\u73af\u5883\u3002"},{"title":"MyEclipse Blue Edition: \u9488\u5bf9 WebSphere \u7684\u5ec9\u4ef7\u5de5\u5177 [\u7ffb\u8bd1]","link":"https:\/\/yanbin.blog\/myeclipse-blue-edition-websphere\/","pubDate":"Sun, 17 Feb 2008 10:13:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/myeclipse-blue-edition-websphere\/","description":"\n\u4eca\u591c\uff0c\u6253\u5f00 TheServerSide.Com\uff0c\u770b\u5230 MyEclipse \u53c8\u51fa\u65b0\u54c1 MyEclipse Blue Edition\uff0c\u4e13\u4e3a WebSphere \u5f00\u53d1\u8005\u6253\u9020\u7684\u3002WebSphere \u7528\u6237\u4e5f\u7b97\u662f\u6709\u798f\u4e86\uff0c\u60f3\u60f3\u4ee5\u524d\u5728 MyEclipse \u91cc\u8054\u7528 WebSphere Server \u662f\u4e00\u4ef6\u591a\u4e48\u75db\u82e6\u7684\u4e8b\u60c5\u554a\uff0c\u6240\u4ee5\u4e0d\u5f97\u4e0d\u5728\u672c\u5730\u7528 Tomcat \u6d4b\u8bd5\uff0c\u4e00\u642c\u5230\u6b63\u5f0f\u73af\u5883\u96be\u514d\u8981\u53d7\u5230\u517c\u5bb9\u6027\u7684\u6298\u78e8\u3002WSAD \u548c RAD \u63d0\u4f9b\u7684\u529f\u80fd\u81ea\u662f\u4e0d\u5fc5\u8bf4\uff0c\u4f46\u6162\u7684\u96be\u4ee5\u5fcd\u53d7\uff0c\u5feb\u6765\u4f53\u9a8c\u4e00\u4e0b MyEclipse Blue Edition \u5427\u3002<\/p>\n<br\/>\n\u539f\u6587\u7ffb\u8bd1\u5982\u4e0b\uff1a<br\/>\n<hr \/><br\/>\nGenuitec \u4eca\u65e5\u5ba3\u5e03\u53d1\u5e03\u4e00\u6b3e\u540d\u4e3a <a href=\"http:\/\/www.myeclipseide.com\/blue.php\">MyEclipse Blue Edition<\/a> \u7684\u65b0\u4ea7\u54c1\uff0c\u5b83\u9488\u5bf9\u7684\u662f IBM Rational Application Developer (RAD) \u548c WebSphere \u7684\u5f00\u53d1\u3002"},{"title":"Java \u6267\u884c SQL \u811a\u672c\u6587\u4ef6","link":"https:\/\/yanbin.blog\/java-execute-sql-script-file\/","pubDate":"Tue, 22 Jan 2008 01:21:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-execute-sql-script-file\/","description":"\n\u5047\u5b9aJava \u7a0b\u5e8f\u4e2d\u8981\u5b9a\u671f\u6267\u884c SQL \u8bed\u53e5\uff0c\u56e0\u9700\u6c42\u53d8\u66f4\u5e94\u4fee\u6539\u539f\u6709 SQL \u8bed\u53e5\u6216\u8005\u52a0\u4e0a\u66f4\u591a\u7684\u8bed\u53e5\u65f6\uff0c\u4e0d\u5f97\u4e0d\u4fee\u6539\u6e90\u4ee3\u7801\uff0c\u7136\u540e\u518d\u6b21\u7f16\u8bd1\u3002\n\u8981\u662f\u628a SQL \u8bed\u53e5\u5199\u5728\u5355\u72ec\u7684 SQL \u811a\u672c\u6587\u4ef6\u4e2d\uff0c\u7531 Java \u7a0b\u5e8f\u6765\u5b9a\u65f6\u52a0\u8f7d\u6267\u884c\uff0c\u90a3\u4e48\u6bcf\u6b21\u6539\u52a8\u65f6\u4ec5\u4ec5\u4fee\u6539 SQL \u811a\u672c\u6587\u4ef6\u5c31\u884c\u4e86\u3002\n<br\/>\nJava \u6ca1\u6709\u63d0\u4f9b\u73b0\u6210\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u81ea\u5df1\u5199\u4e86\u4e00\u4e2a\u8fd9\u6837\u7684 SQL \u811a\u672c\u6267\u884c\u7c7b SqlFileExecutor\u3002\u652f\u6301\u901a\u7528\u7684 SQL \u811a\u672c\u6587\u4ef6\uff0c\"--\" \u4f5c\u4e3a\u6ce8\u91ca\u524d\u5bfc\u7b26\uff0c\u5206\u53f7 \";\"\n\u5206\u9694\u8bed\u53e5\u3002\u4e0d\u652f\u6301 MySQL \u7684 \/*...*\/ \u5f62\u5f0f\u7684\u6ce8\u91ca\u683c\u5f0f\u3002\u5bf9\u4e8e Windows \u548c Linux\/Unix \u4e0b\u7f16\u8f91\u7684\u811a\u672c\u6587\u4ef6\u90fd\u6d4b\u8bd5\u901a\u8fc7\u3002\n\u8fd9\u4e24\u4e2a\u7cfb\u7edf\u6587\u4ef6\u4e2d\u7684\u6362\u884c\u7b26\u4e0d\u4e00\u6837\uff0cWindows \u662f \"\\r\\n\"\uff0cLinux\/Unix \u662f \"\\n\"\u3002"},{"title":"\u4e3a\u4f55\u4e0d\u76f4\u63a5\u4f7f\u7528 Oracle \u63d0\u4f9b\u7684\u8fde\u63a5\u6c60\u5b9e\u73b0","link":"https:\/\/yanbin.blog\/use-oracle-carried-connection-pool\/","pubDate":"Wed, 16 Jan 2008 14:47:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/use-oracle-carried-connection-pool\/","description":"\n\u6211\u5728 Websphere Application Server (WAS) \u4e0b\u914d\u7f6e JDBC \u63d0\u4f9b\u7a0b\u5e8f\u65f6\uff0c\u9009\u62e9\u4e86 Oracle JDBC Driver \u786e\u5b9a\u4e4b\u540e\uff0c\u770b\u5230\u6700\u540e\u4e00\u4e2a\u9009\u9879\u662f\uff1aoracle.jdbc.pool.OracleConnectionPoolDataSource\u3002<\/p>\n<br\/>\n\u987e\u540d\u601d\u4e49\uff0c\u8fd9\u662f\u4e00\u4e2a DataSource \u5b9e\u73b0\u4e3a\uff0c\u5c31\u50cf DBCP \u7684 BasicDataSource \u4e00\u6837\u3002\u90a3\u4e48\u80fd\u4e0d\u80fd\u4e5f\u50cf BasicDataSource \u90a3\u6837\uff0c\u901a\u8fc7 new BasicDataSource()\uff0c\u7136\u540e\u8bbe\u7f6e\u5404\u4e2a\u5fc5\u987b\u7684\u5c5e\u6027\u5f97\u5230\u4e00\u4e2a\u6570\u636e\u6e90 DataSource \u5462\uff1f\u8fd9\u4e2a OracleConnectionPoolDataSource \u53c8\u662f\u5728\u54ea\u4e2a\u5305\u91cc\u5462\uff1f"},{"title":"\u91cd\u5b9a\u5411System.out\u548cSystem.err\u5230JTextPane,\u5206\u522b\u7528\u9ed1\u8272\u7ea2\u8272\u663e\u793a(\u6539\u8fdb)","link":"https:\/\/yanbin.blog\/system-out-system-err-to-jtextpane-improved\/","pubDate":"Thu, 15 Nov 2007 10:41:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/system-out-system-err-to-jtextpane-improved\/","description":"\n\u5728\u4e0a\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/system-out-system-err-jtextpane\/\">\u91cd\u5b9a\u5411System.out\u548cSystem.err\u5230JTextPane,\u5206\u522b\u7528\u9ed1\u8272\u7ea2\u8272\u663e\u793a<\/a>\n\u00a0\u4e2d\u8bb2\u4e86\u5982\u4f55\u628a System.out \u548c System.err \u91cd\u5b9a\u5411\u5230 JTextPane \u4e0a\uff0c\u5e76\u5206\u4e0d\u540c\u989c\u8272\u663e\u793a\uff0c\u5176\u4e2d\u7528\u5230\u4e86 PipedInputStream\u3001\nPipedOutputStream\u3002\u90a3\u4e2a\u4f8b\u5b50\u8fd8\u662f\u53c2\u8003\u7684 \u300a<a href=\"http:\/\/www.exampledepot.com\/?l=ex\">The Java Developers Almanac 1.4<\/a>\u300b\uff0c\n\u7ffb\u8bd1\u51fa\u6765\u53eb\u505a \u300aJava \u5f00\u53d1\u8005\u5e74\u9274 1.4\u300b\uff0c\u663e\u5f97\u591a\u4e48\u7684\u6743\u5a01\u554a\uff0c\u6211\u5f53\u65f6\u8fd8\u771f\u628a\u5b83\u770b\u6210\u5b98\u65b9\u6700\u4f73\u63a8\u8350\u5b9e\u73b0\u4e86\uff0c\u592a\u8ff7\u4fe1\u4e86\u3002<\/p>\n<br\/>\n\u53ef\u662f\u73b0\u5728\u770b\u6765\uff0c\u524d\u9762\u90a3\u4e2a\u5b9e\u73b0\u4e0d\u4ec5\u4ee3\u7801\u7e41\u7410\uff0c\u800c\u4e14\u662f Bug \u591a\u591a\u3002\u73b0\u5728\u91cd\u65b0\u5bf9\u4e0a\u56de\u7684 ConsolePane \u6765\u4e2a\u65b0\u7684\u66f4\u7b80\u6d01\u9ad8\u6548\u7684\u5b9e\u73b0\u3002\u4ee3\u7801\u5982\u4e0b\uff1a"},{"title":"\u91cd\u5b9a\u5411System.out\u548cSystem.err\u5230JTextPane,\u5206\u522b\u7528\u9ed1\u8272\u7ea2\u8272\u663e\u793a","link":"https:\/\/yanbin.blog\/system-out-system-err-jtextpane\/","pubDate":"Sat, 10 Nov 2007 07:52:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/system-out-system-err-jtextpane\/","description":"\n\u628a System.out \u548c System.err \u91cd\u5b9a\u5411\u5230 JTextArea \u7684\u505a\u6cd5\u5728\u7f51\u4e0a\u80fd\u627e\u5230\u4e0d\u5c11\uff0c\u7531\u4e8e JTextArea \u4e0d\u80fd\u7528\u4e0d\u540c\u7684\u5b57\u4f53\u5206\u522b\u663e\u793a\u5185\u5bb9\u3002\u4f46\u6211\u8fd8\u662f\u5e0c\u671b\u80fd\u8c61 Eclipse \u63a7\u5236\u53f0\u90a3\u6837\uff0c\u6807\u51c6\u8f93\u51fa\u4e3a\u9ed1\u8272\uff0c\u9519\u8bef\u4fe1\u606f\u4e3a\u7ea2\u8272\uff0c\u4e8e\u662f\u9009\u62e9\u4e86 JTextPane \u4f5c\u4e3a\u8f93\u51fa\u76ee\u7684\u5730\u3002\u7ebf\u7a0b\u4e4b\u95f4\u901a\u4fe1\u606f\u7528\u5230\u4e86 PipedInputStream\u00a0\u3001PipedOutputStream \u548c\u3000SwingUtilities.invokeLater(new Runnable()\u3002\u00a0\u00a0<\/p>\n<br\/>\n\u81ea\u5b9a\u4e49\u4e86\u4e00\u4e2a JScrollPane\uff0c\u7c7b\u540d\u4e3a ConsolePane\uff0c\u5199\u6210\u7684\u5355\u4f8b\u7c7b\uff1b\u4f7f\u7528\u65f6\u53ea\u9700\u8981\u5728\u4f60\u7684\u9762\u677f\u4e0a\u52a0\u4e0a ConsolePane\u7ec4\u4ef6\uff0c\u4f8b\u5982\uff1a<span style=\"color: #ff3366;\"><strong>getContentPane().add(ConsolePane.getInstance(), BorderLayout.CENTER);<\/strong><br \/>\n<\/span><br \/>\n\u754c\u9762\u622a\u56fe(\u9ed1\u8272\u548c\u7ea2\u8272\u5206\u522b\u663e\u793a System.out \u548c System.err \u5b9a\u5411\u7684\u8f93\u51fa\u5185\u5bb9)\uff1a"},{"title":"Eclipse\u4e2d\u6267\u884cAnt\u51fa\u73b0Could not find the main class\u7684\u95ee\u9898\u53ca\u89e3","link":"https:\/\/yanbin.blog\/eclipse-ant-could-not-find-the-main-class\/","pubDate":"Thu, 08 Nov 2007 23:01:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/eclipse-ant-could-not-find-the-main-class\/","description":"\n\u8fd9\u79cd\u60c5\u51b5\u901a\u5e38\u662f\u53d1\u751f\u5728\u6362\u4e86\u53e6\u4e00\u4efd Eclipse \u62f7\u8d1d\u4e4b\u540e\u3002\u4e4b\u524d\u4e00\u822c\u90fd\u80fd\u6b63\u5e38\u5728 Eclipse \u4e2d\u6267\u884c Ant \u811a\u672c\uff0c\u5220\u9664\u4e86\u539f\u6765\u7684 Eclipse \u4e4b\u540e\u6362\u4e86\u53e6\u4e00\u4e2a\u62f7\u8d1d\u6216\u8005\u662f\u65b0\u7248\u672c\uff0c\u5728\u5176\u4e2d\u6267\u884c Ant \u811a\u672c\u65f6\u5f39\u51fa\u7a97\u53e3\u51fa\u73b0\u4ee5\u4e0b\u9519\u8bef\uff1a<br\/>\n<br\/>\n---------------------------<br\/>\nJava Virtual Machine Launcher<br\/>\n---------------------------<br\/>\nCould not find the main class. Program will exit.<br\/>\n---------------------------<br\/>\n\u786e\u5b9a\u00a0\u00a0<br\/>\n---------------------------<br\/>\n<br\/>\n\u8fd9\u79cd\u9519\u8bef\u5bf9\u7528\u8fc7 Java \u7684\u4eba\u6765\u8bf4\u8fd8\u662f\u5f88\u660e\u767d\uff0c\u627e\u4e0d\u5230 Ant \u7684\u4e3b\u7c7b\u5417\u3002\u4e0d\u8fc7\u8bf4\u5b9e\u8bdd\u4e5f\u56f0\u6270\u8fc7\u6211\u4e00\u6bb5\u65f6\u95f4\uff0c\u4e5f\u6ca1\u53bb\u6df1\u7a76\u3002\u8bf4\u5f00\u4e86\uff0c\u75c7\u7ed3\u5c31\u662f Eclipse \u4e2d\u7684 ANT_HOME \u6307\u5411\u4e0d\u5bf9\u3002"},{"title":"\u5bf9StrutsConfigHelper\u5de5\u5177\u7684\u5c0f\u5c0f\u5347\u7ea7\uff0d\uff0d\u589e\u52a0\u4ee3\u7801\u7740\u8272\u663e\u793a\u529f\u80fd","link":"https:\/\/yanbin.blog\/strutsconfighelper-improved\/","pubDate":"Tue, 06 Nov 2007 10:03:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/strutsconfighelper-improved\/","description":"\nStrutsConfigHelper \u5c0f\u5de5\u5177\u65b9\u4fbf\u4f60\u5bf9\u4e00\u4e2a\u6216\u591a\u4e2a StrutsConfig \u6587\u4ef6\u6309\u6761\u4ef6\u67e5\u627e\u5404\u8981\u7d20\u3002\n\u5728 <a id=\"viewpost1_TitleUrl\" href=\"https:\/\/yanbin.blog\/strutsconfig-seach-tool\/\">\u300a\u5fd9\u91cc\u627e\u95f2\uff0c\u81ea\u5199\u4e86\u4e00\u4e2aStrutsConfig\u914d\u7f6e\u6587\u4ef6\u6761\u4ef6\u67e5\u627e\u5de5\u5177\u300b<\/a>\u00a0\u4e00\u6587\u7ae0\u6709\u5bf9\u8be5\u5de5\u5177\u7684\u4ecb\u7ecd\u3002<br\/><br\/>\n\u8f6f\u4ef6\u4e3a\u9002\u5b9c\u4e4b\u4f5c\uff0c\u5982\u679c\u5b83\u786e\u5b9e\u5bf9\u4f60\u6beb\u65e0\u7528\u5904\uff0c\u4f60\u5927\u53ef\u5f53\u5b83\u662f\u5783\u573e\uff0c\u4e0d\u56e0\u4f5c\u8005\u4ed8\u51fa\u5f88\u5927\u7684\u82e6\u52b3\uff0c\u800c\u52c9\u5f3a\u53bb\u63a5\u53d7\uff1b\u4e5f\u8bb8\u5b83\u8fd8\u80fd\u7ed9\u4f60\u5e26\u6765\u4e9b\u4fbf\u5229\uff0c\u90a3\u5c31\u4f53\u73b0\u4e86\u5b83\u7684\u4ef7\u503c\u3002"},{"title":"\u5fd9\u91cc\u627e\u95f2\uff0c\u81ea\u5199\u4e86\u4e00\u4e2aStrutsConfig\u914d\u7f6e\u6587\u4ef6\u6761\u4ef6\u67e5\u627e\u5de5\u5177","link":"https:\/\/yanbin.blog\/strutsconfig-seach-tool\/","pubDate":"Tue, 30 Oct 2007 13:28:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/strutsconfig-seach-tool\/","description":"\n\u5de5\u4f5c\u4e2d\u6709\u7ef4\u62a4 Struts \u9879\u76ee\uff0c\u6216\u770b\u522b\u4eba\u9879\u76ee\u4e2d\u4ee3\u7801\u65f6\uff0c\u8981\u628a\u8bbf\u95ee\u9875\u9762\u94fe\u63a5\u4e0e\u76f8\u5e94\u5904\u7406 Action \u7c7b\u53ca FormBean\u7b49\u76f8\u5173\u4fe1\u606f\u5bf9\u5e94\u8d77\u6765\uff0c\u6bcf\u6bcf\u90fd\u662f\u6253\u5f00 Struts \u914d\u7f6e\u6587\u4ef6\uff0cCtrl+F \u8fdb\u884c\u67e5\u627e\uff0c\u4e0d\u6613\u51c6\u786e\u5b9a\u4f4d\uff0c\u5c24\u5176\u662f\u9879\u76ee\u4e2d\u6709\u591a\u4e2a Struts \u914d\u7f6e\u6587\u4ef6\u65f6\u5c31\u5f97\u8fd9\u8fb9\u5012\u6765\u90a3\u8fb9\u8f6c\u53bb\u7684\uff0c\u5b9e\u4e3a\u4e0d\u4fbf\u3002\u4e8e\u662f\u4e4e\u5c31\u4e3a\u81ea\u5df1\u5199\u4e86\u4e00\u4e2a\u53ef\u540c\u65f6\u5728\u591a\u4e2a Struts \u914d\u7f6e\u6587\u4ef6\u4e2d\u6839\u636e\u4e0d\u540c\u6761\u4ef6\u67e5\u627e\u914d\u7f6e\u4fe1\u606f\u7684\u5c0f\u5de5\u5177\uff0c\u8c13\u4e4b\uff1aStruts Config Helper\u3002<\/p>\n<br\/>\n\u8fd9\u6bb5\u65f6\u95f4\u5de5\u4f5c\u4e0a\u6bd4\u8f83\u7684\u5fd9\uff0c\u95f2\u6687\u4e4b\u95f4\uff0c\u4e00\u70b9\u4e00\u6ef4\u7f13\u6162\u7f00\u6387\u800c\u6210\u3002\u4e5f\u4e0d\u77e5\u5bf9\u4e8e\u5404\u4f4d\u540c\u8def\u4eba\u662f\u5426\u6709\u53ef\u501f\u9274\u4e4b\u5904\uff0c\u5f20\u8d34\u51fa\u6765\uff0c\u5e0c\u671b\u5f97\u5230\u5404\u4f4d\u7684\u6307\u6458\uff0c\u591a\u7ed9\u6211\u63d0\u4e9b Bug \u51fa\u6765\uff0c\u4e0d\u80dc\u611f\u6fc0\uff01"},{"title":"\u4e00\u4e2a\u9876\u597d\u7528\u7684 JavaDoc Api \u67e5\u770b\u8f6f\u4ef6 JavaDOCHelper","link":"https:\/\/yanbin.blog\/javadoc-html-view-javadochelper\/","pubDate":"Sun, 07 Oct 2007 15:40:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/javadoc-html-view-javadochelper\/","description":"\n\u4e00\u822c\u6211\u4eec\u67e5\u9605 JDK API \u90fd\u662f\u7528\u7684 CHM \u7248\u7684\u5e2e\u52a9\u6587\u4ef6\uff0c\u8bb0\u5f97\u60f3\u60f3\u521a\u63a5\u89e6 Java \u90a3\u65f6\u8981\u5728\u7f51\u4e0a\u627e\u4e2a CHM \u7248\u7684 JDK \u5e2e\u52a9\u6587\u6863\u90fd\u8981\u8d39\u51e0\u756a\u5468\u6298\uff0c\u751a\u81f3\u8fd8\u7ecf\u5e38\u5728\u7ebf\u67e5\u67d0\u4e2a AP I\u8bf4\u660e\u3002\u73b0\u5728\u597d\u4e86\uff0c\u8fde\u4e2d\u6587\u7684 JDK API \u5e2e\u52a9\u90fd\u80fd\u53ca\u65f6\u51fa\u6765\uff0c\u8981\u627e\u4e2a CHM \u7248\u7684\u5e2e\u52a9\u4e5f\u65b9\u4fbf\u591a\u4e86\u3002<br\/>\n<br\/>\n\u53ef\u662f\u5bf9\u4e8e\u5927\u591a\u6570\u7684 Java\u00a0\u7ec4\u4ef6\u90fd\u53ea\u63d0\u4f9b HTML \u7248\u7684 JavaDoc API \u5e2e\u52a9\uff0c\u67e5\u9605\u8d77\u6765\u5f88\u4e0d\u987a\u624b\u3002\u6ca1\u6709\u5feb\u901f\u7d22\u5f15\u67e5\u627e\u7684\u529f\u80fd\uff0c\u800c\u4e14\u770b\u4e0d\u540c\u7ec4\u4ef6\u7684 API \u5e2e\u52a9\u9700\u8981\u540c\u65f6\u6253\u5f00\u591a\u4e2a\u7a97\u53e3\u3002<br\/>\n<br\/>\n\u4e0b\u9762\u5411\u5927\u5bb6\u4ecb\u7ecd\u4e00\u6b3e\u8f6f\u4ef6\uff0cJavaDOCHelper\uff0c\u5b83\u4e0d\u4ec5\u80fd\u63d0\u4f9b\u50cf CHM \u6587\u4ef6\u90a3\u822c\u5feb\u901f\u7d22\u5f15\u67e5\u627e\uff0c\u800c\u4e14\u63d0\u4f9b\u4e00\u4e2a\u754c\u9762\u91cc\u67e5\u9605\u591a\u4e2a Java Doc API\u3002\u8be5\u8f6f\u4ef6\u672a\u6ce8\u518c\u7248\u672c\uff0c\u53ea\u9650 30 \u6b21\u7684\u67e5\u627e\u529f\u80fd\u7684\u4f7f\u7528\uff08\u4e0d\u662f\u6307\u7d22\u5f15\uff09\uff0c\u73b0\u5df2\u5bf9\u8be5\u8f6f\u4ef6\u5b8c\u6210\u4e86\u7834\u89e3\uff0c\u5e76\u63d0\u4f9b\u66f4\u6362\u5b89\u88c5\u76ee\u5f55\u65f6\u66f4\u65b9\u4fbf\u7684\u63d0\u793a\u529f\u80fd\uff0c\u4ee5\u53ca\u514d\u5b89\u88c5\uff0cEXE \u6587\u4ef6\u65e0\u63a7\u5236\u53f0\u65b9\u5f0f\u542f\u52a8\u3002"},{"title":"Java\u4e2d\u7c7bC\/C++\u7684sizeof()\u64cd\u4f5c\uff0c\u77e5\u6653\u5b9e\u4f8b\u5927\u5c0f","link":"https:\/\/yanbin.blog\/java-sizeof\/","pubDate":"Fri, 28 Sep 2007 10:35:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-sizeof\/","description":"\n\u5728C\/C++\u4e2d\u6709sizeof()\u64cd\u4f5c\uff0c\u53ef\u8f7b\u6613\u83b7\u77e5\u67d0\u4e2a\u7c7b\u578b\u6216\u5b9e\u4f8b\u5360\u7528\u5185\u5b58\u5927\u5c0f\uff0csizeof(int) \u6216\u8005 sizeof(new TestClass)\u3002\u53ef\u662fJava\u4e2d\u53ef\u6ca1\u6709\u8fd9\u4e48\u76f4\u89c2\u7684\u65b9\u6cd5\u53ef\u7528\u3002<br\/>\n<br\/>\n\u56e0\u672c\u4eba\u770b\u8fc7\u4e0d\u5c11\u4eba\u5199\u4ee3\u7801\u603b\u7231\u5199\u6210<br\/>\n<br\/>\nList userList = new ArrayList();\u00a0\u00a0 \/\/\u6ce8\uff1a\u58f0\u660e\u65f6\u5373\u521d\u59cb\u5316\u4e00\u4e2a\u7a7a ArrayList<br\/>\nuserList = userDao.getAllUsers();\u00a0 \/\/\u6ce8\uff1a\u65b9\u6cd5getAllUsers()\u4e2d\u4f1a\u751f\u6210\u4e00\u4e2aArrayList\u7684<br\/>\n<br\/>\n\u4e0a\u9762\u5c31\u9020\u6210\u5e73\u767d\u591a\u4e86\u4e00\u4e2a\u7a7a\u7684 ArrayList(),\u521b\u5efa\u5b8c\u540e\u5373\u523b\u5c31\u63a8\u5411GC\u5904\u7f6e\uff0c\u6211\u5c31\u5728\u60f3\u8fd9\u6837\u4e00\u4e2a\u7a7a\u7684 ArrayList \u4f1a\u5360\u7528\u591a\u5c11\u5185\u5b58\uff0c\u4e8e\u662f\u627e\u6765\u4e86 Optimizeit \u89c2\u5bdf\u540e\u53d1\u73b0\u4e00\u4e2a\u7a7a\u7684 ArrayList \u8981\u5360\u53bb 24b \u5185\u5b58\u3002\u90a3 Java \u4e2d\u6709\u6ca1\u6709\u66f4\u4fbf\u7684\u6377\u7684\u65b9\u6cd5\u5462\uff0c\u4e8e\u662f\u5728\u7f51\u4e0a google \"java sizeof\"\uff0c\u5f15\u51fa\u4e0d\u5c11\u8bdd\u9898\u3002"},{"title":"\u5bf9iTracker\u7684\u5c0f\u4fee\u6b63\uff0c\u4f7f\u4e4b\u6b63\u786e\u663e\u793a\u63cf\u8ff0\u4e2d\u7684\u7a7a\u683c\uff08\u89e3\u51b3\u4ee3\u7801\u9000\u683c\u663e\u793a\uff09","link":"https:\/\/yanbin.blog\/itracker-show-blank\/","pubDate":"Thu, 27 Sep 2007 10:47:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/itracker-show-blank\/","description":"\nITracker \u662f\u57fa\u4e8e J2EE \u7684 issue\/bug \u8ddf\u8e2a\u7cfb\u7edf\uff0c\u652f\u6301\u591a\u7528\u6237\u3001\u591a\u9879\u76ee\u3001\u90ae\u4ef6\u901a\u77e5\u7b49\uff0c\u66f4\u591a\u7279\u5f81\u8bf7\u67e5\u770b<a href=\"http:\/\/www.cowsultants.com\/features.html\">http:\/\/www.cowsultants.com\/features.html<\/a> \u3002\u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u5728\u7ebf <a href=\"http:\/\/www.cowsultants.com:8080\/itracker\">demo<\/a> \u53ef\u4ee5\u8bd5\u7528\uff0c\u7528\u6237\u540d\u548c\u5bc6\u7801\u90fd\u662f guest\u3002<\/p>\n<br\/>\n\u7c7b\u4f3c\u7684\u4ea7\u54c1\u8fd8\u6709 <a href=\"http:\/\/scarab.tigris.org\/\">Scarab<\/a>\u3001<a href=\"http:\/\/opinionplugin.sourceforge.net\/begin.html\">ELIPS<\/a>\u3001<a href=\"http:\/\/sourceforge.net\/projects\/bugtracker\/\">Bugtracker<\/a>\u3001<a href=\"http:\/\/www.gjt.org\/pkg\/bugrat\/\">BugRat<\/a>\u3001<a href=\"http:\/\/abuky.sunsite.dk\/index.html\">Abuky<\/a>\u3001<a href=\"http:\/\/trackit.sourceforge.net\/\">TrackIt<\/a>\u3001<a href=\"https:\/\/jtrac.dev.java.net\/\">jTrac<\/a>\u3001<a href=\"http:\/\/www.bugzilla.org\/\">Bugzilla<\/a>\u3001<a href=\"http:\/\/jtrac.info\/\">JTrac<\/a>\u3001<a href=\"http:\/\/pdune.sourceforge.net\/\">Project Dune<\/a>.<br\/><br\/>\niTracker\u786e\u5b9e\u662f\u4e2a\u597d\u4e1c\u897f\uff0c\u4f46\u5bf9\u4e00\u4e2a\u4e1c\u897f\u8fc7\u719f\u4e86\uff0c\u96be\u514d\u671f\u671b\u503c\u5c31\u66f4\u9ad8\u4e86\u3002\u5982\u679c\u4f60\u7528 iTracker \u4f5c\u8fc7 Code Review \u7684\u8bdd\uff0c\u4f60\u5c31\u4f1a\u53d1\u73b0\uff0c\u4f60\u8d34\u4e0a\u53bb\u7684\u4ee3\u7801\uff0c\u6d4f\u89c8\u663e\u793a\u51fa\u6765\u7684\u662f\u4ee3\u7801\u4e2d\u7684\u7a7a\u683c\u5c11\u4e86\uff0c\u5c24\u5176\u662f\u6ca1\u4e86\u9000\u683c\u89c4\u8303\u663e\u793a\u4e86\u3002\u4f8b\u5982\uff0c\u4f60\u8d34\u7684\u4ee3\u7801\u662f\uff1a"},{"title":"\u5229\u7528JDOM\u628a\u4e24\u4e2aXML\u5408\u5e76\u751f\u5f97\u5230\u4e00\u4e2aDocument\u5bf9\u8c61","link":"https:\/\/yanbin.blog\/jdom-combine-xml-one-document\/","pubDate":"Sun, 23 Sep 2007 03:58:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdom-combine-xml-one-document\/","description":"\n\u901a\u5e38\u4e00\u4e9b\u5e94\u7528\u6846\u67b6\u90fd\u4f1a\u7528 XML \u4f5c\u4e3a\u914d\u7f6e\uff0c\u800c\u4e14\u5f88\u591a\u90fd\u652f\u6301\u591a\u4e2a XML \u6587\u4ef6\uff0c\u4f8b\u5982 Struts \u6846\u67b6\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a struts-config-xxx.xml \u6587\u4ef6\uff0cSpring\n\u4e5f\u5141\u8bb8\u4f60\u7528\u591a\u4e2a applicationContext-xxx.xml \u6587\u4ef6\uff0c\u518d\u6bd4\u5982 DWR \u4e5f\u662f\u53ef\u4ee5\u7531\u591a\u4e2a dwr-xxx.xml \u4f9d\u529f\u80fd\u6216\u5176\u4ed6\u65b9\u5f0f\u5206\u5f00\u6765\u914d\u7f6e\u3002\u6211\u4eec\u77e5\u9053\uff0c\n\u8fd9\u6837\u7684\u591a\u4e2a XML \u6709\u76f8\u540c\u7684\u89c4\u8303\u5b9a\u4e49\uff0c\u90a3\u4e48\u7a0b\u5e8f\u5982\u4f55\u4e00\u5e76\u89e3\u6790\u5b83\u4eec\u5462\uff1f\u6211\u770b\u8fc7 ActionServlet \u662f\u5bf9 struts-config-xxx.xml \u9010\u4e2a\u89e3\u6790\u7684\u3002\n\u6211\u8fd9\u91cc\u4ecb\u7ecd\u7684\u4e00\u79cd\u65b9\u6cd5\u662f\u628a\u90a3\u4e9b\u6709\u7740\u76f8\u540c\u89c4\u8303\u5b9a\u4e49\u7684 XML \u5408\u6210\u4e00\u4e2a Document \u7136\u540e\u5bf9\u8fd9\u4e2a Document \u5bf9\u8c61\u8fdb\u884c\u5904\u7406\uff0c\u5982 XPath \u67e5\u627e\u3001\u8fdb\u884c DOM \u5bf9\u8c61\u64cd\u4f5c\uff0c\n\u5c31\u4e0d\u9700\u8981\u6bcf\u6b21\u5230\u591a\u4e2a Document \u4e2d\u53bb\u67e5\u627e\u4e00\u904d\u3002<\/p>\n<br\/>\n\u4f17\u6240\u5468\u77e5\uff0c\u5bf9 XML \u7684\u64cd\u4f5c\u6709\u4e24\u79cd\u65b9\u5f0f\uff0cDOM\uff1aXML \u6620\u5c04\u5728\u5185\u5b58\u4e2d\u4e00\u9897\u6811\uff1bSAX\uff1a\u57fa\u4e8e\u4e8b\u4ef6\u7684\u65b9\u5f0f\u3002\u5e38\u7528\u7684 XML Java \u89e3\u6790\u7ec4\u4ef6\u6709 DOM4J(Apache\u7684)\u3001JDOM\u3001\u548cJAXP(Sun\u7684)\uff0c\u5b83\u4eec\u90fd\u63d0\u4f9b\u4e86 DOM \u548c SAX \u5b9e\u73b0\u548c Xpath \u67e5\u627e\u3002"},{"title":"\u5229\u7528 JWhich \u638c\u63e1\u7c7b\u8def\u5f84,\u786e\u5b9a\u7c7b\u8def\u5f84\u4e2d\u7684\u4ec0\u4e48\u7c7b\u5c06\u88ab\u8f7d\u5165","link":"https:\/\/yanbin.blog\/jwhich-class-where-to-load\/","pubDate":"Mon, 10 Sep 2007 09:29:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jwhich-class-where-to-load\/","description":"\n\u4e0b\u9762\u662f\u6211 2002 \u5e74\u521a\u5f00\u59cb\u5b66 Java\uff0c\u56e0\u4e0d\u592a\u7406\u89e3 Classpath\uff0c\u5e38\u88ab\u5b83\u56f0\u6270\u65f6\u770b\u7684\u4e00\u7bc7\u6587\u7ae0\uff0c\u62ff\u51fa\u6765\u4e0e\u521d\u5b66\u8005\u5171\u52c9\u3002<\/p>\n<br\/>\n\u4f5c\u8005 Mike Clark<br\/><br\/>\n\u6458\u8981<br \/>\n\u5c3d\u7ba1 Java \u7c7b\u8def\u5f84\u770b\u4e0a\u53bb\u662f\u4e2a\u5f88\u7b80\u5355\u7684\u6982\u5ff5\uff0c\u4f46\u5b83\u4e5f\u7ecf\u5e38\u662f\u56f0\u60d1\u548c\u9ebb\u70e6\u7684\u6e90\u6cc9\u3002\u672c\u6587\u5c06\u5411\u60a8\u5c55\u793a\u4e00\u4e2a\u7b80\u5355\u7684\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u6e05\u695a\u5730\u786e\u5b9a\u7c7b\u88c5\u8f7d\u5668\u4ece\u60a8\u7684\u7c7b\u8def\u5f84\u4e2d\u8f7d\u5165\u4e86\u4ec0\u4e48 Java \u7c7b\u3002\uff081,000 \u5b57\uff09<br \/>\n\u5f00\u53d1\u4eba\u5458\u5728\u5904\u7406 Java \u7c7b\u8def\u5f84\u65f6\u7ecf\u5e38\u4f1a\u9047\u5230\u4e00\u4e9b\u5c34\u5c2c\uff1a\u4ed6\u4eec\u4e0d\u603b\u662f\u5f88\u6e05\u695a\u7c7b\u88c5\u8f7d\u5668\u5c06\u8981\u8f7d\u5165\u4ec0\u4e48\u7c7b\uff0c\u5c24\u5176\u662f\u5728\u5e94\u7528\u7a0b\u5e8f\u7684\u7c7b\u8def\u5f84\u88ab\u5927\u91cf\u7684\u8def\u5f84\u548c\u6587\u4ef6\u5145\u65a5\u7684\u60c5\u51b5\u4e0b\u66f4\u662f\u5982\u6b64\u3002\u5728\u672c\u6587\u4e2d\uff0c\u6211\u5c06\u4ecb\u7ecd\u4e00\u4e2a\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u663e\u793a\u88ab\u8f7d\u5165\u7684\u7c7b\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84\u3002"},{"title":"\u5728 Java \u4e2d\u64cd\u4f5c Windows \u6ce8\u518c\u8868","link":"https:\/\/yanbin.blog\/java-access-windows-registry\/","pubDate":"Sun, 02 Sep 2007 08:41:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-access-windows-registry\/","description":"\n\u60f3\u505a\u4e2a\u4e1c\u897f\uff0c\u8981\u83b7IE\u7684\u4ee3\u7406\u8bbe\u7f6e\uff0c\u770b\u7f51\u4e0a\u4ecb\u7ecd\u57fa\u672c\u90fd\u662f\u8bfb\u53d6\u6ce8\u518c\u8868\u7684\u65b9\u5f0f\uff0c\u6ca1\u63d0\u5230\u8bf4\u501f\u52a9\u4e8e\u7279\u5b9a\u7684 Win32 API\u3002\u800c JDK \u63d0\u4f9b\u64cd\u4f5c Windows \u7684 API \u4e5f\u5c31\u662f Preferences\uff0c\u56e0\u4e3a\u8fd9\u4e2a API \u4e5f\u662f\u8de8\u5e73\u53f0\u7684\uff0c\u6240\u529f\u80fd\u6bd4\u8f83\u5f31\uff0c\u5728 Win32 \u4e0b\u53ea\u80fd\u7528\u6765\u64cd\u4f5c HKCU\\Software\\JavaSoft \u548c HKLM\\Software\\JavaSoft \u4e0b\u53ca\u5b50\u8282\u70b9\u7684\u6570\u636e\u3002<\/p>\n<br\/>\n\u81ea\u7531\u8bbf\u95ee\u6ce8\u518c\u8868\u5176\u4ed6\u952e\u7684\u503c\u5149\u7528 Java \u662f\u505a\u4e0d\u5230\u7684\uff0c\u5fc5\u7136\u65b9\u6848\u5c31\u662f JNI\uff0c\u4e00\u5f00\u59cb\u4e5f\u81ea\u5df1\u6765\u5b9e\u73b0\u8fd9\u4e2a JNI \u52a8\u6001\u5e93\uff0c\u540e\u6765\u61d2\u4e86\u4e00\u4e0b\uff0c\u60f3\u7740\u7f51\u4e0a\u5e94\u8be5\u7528\u73b0\u6210\u7684\u5b9e\u73b0\uff0cGoogle \u4e86\u4e00\u4e0b\uff0c\u679c\u7136\u4e0d\u51fa\u6240\u671b\uff0c\u5c31\u662f <a href=\"http:\/\/www.trustice.com\/java\/jnireg\/index.shtml\">http:\/\/www.trustice.com\/java\/jnireg\/index.shtml<\/a> \u4e0b\u7684 <a href=\"http:\/\/www.gjt.org\/download\/time\/java\/jnireg\/registry-3.1.3.zip\">registry-3.1.3.zip<\/a>(\u5305\u542b\u6e90\u4ee3\u7801)\u3002\u53ef\u4ee5\u5229\u7528\u5b83\u8bbf\u95ee\u3001\u4fee\u6539\u3001\u5bfc\u51fa\u6ce8\u518c\u8868\u9879\u5230\u6587\u4ef6\u7b49\u3002\u89e3\u5f00 registry-3.1.3.zip\uff0c\u5728 bin \u76ee\u5f55\u4e2d\u53ef\u4ee5\u770b\u5230\u4e24\u4e2a\u6587\u4ef6 ICE_JNIRegistry.dll \u548c registry.jar\uff0c\u52a8\u6001\u5e93\u5c31\u662f\u672c\u5730\u4ee3\u7801\u5b9e\u73b0\u3002<br\/>"},{"title":"java\u7248\u672c\u7684escape\u548cunescape\u51fd\u6570","link":"https:\/\/yanbin.blog\/java-escape-unescape\/","pubDate":"Thu, 23 Aug 2007 00:21:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-escape-unescape\/","description":"\n\u6709\u65f6\u5019\u6211\u4eec\u5728\u5904\u7406\u9875\u9762\u63d0\u4ea4\u8fc7\u6765\u7684\u4e2d\u6587\u4ea7\u751f\u4e71\u7801\u4e0d\u5bb9\u6613\u89e3\u51b3\u65f6\uff0c\u6bd4\u5982\u9875\u9762\u9009\u62e9\u4e86\u522b\u7684\u7f16\u7801\uff0c\u800c AJAX \u662f\u7528\u7684 UTF-8 \u5b57\u7b26\u96c6\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u8981\u53d1\u9001\u5230\u670d\u52a1\u5668\u7684\u4e2d\u6587\u7528 Javascript \u7684 escape \u51fd\u6570\u8fdb\u884c\u7f16\u7801\uff0c\u7136\u800c Java \u4e2d\u53c8\u6ca1\u6709\u76f8\u5e94\u7684 unescape \u51fd\u6570\u3002<\/p>\n<br\/>\n\u800c\u4e14 Java \u4e2d\u7684 java.net.URLDecoder\/java.net.URLEncoder \u4e5f\u5bf9\u5e94\u4e0d\u4e0a javascript \u7684 encodeURI\/decodeURI \u548c encodeURIComponent\/decodeURIComponent \u51fd\u6570\u3002<br\/><br\/>\n\u6240\u4ee5\u6211\u53bb\u7f51\u4e0a\u627e\u6765\u4e86\u4e00\u6bb5\u80fd\u591f\u4e0e Javascript \u7684 escape\/unescape \u51fd\u6570\u7684\u4ee3\u7801\u3002"},{"title":"jsp:include page=\"\" \u548c include file=\"\" \u7684\u533a\u522b","link":"https:\/\/yanbin.blog\/jsp-include-page-include-file\/","pubDate":"Fri, 10 Aug 2007 05:16:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jsp-include-page-include-file\/","description":"\n<p>\u4e0b\u9762\u7528\u4e09\u4e2a\u5b9e\u9a8c\uff0c\u66f4\u6e05\u6dc5\u7684\u7406\u89e3 &lt;jsp:include page=\"\"\/&gt; \u548c &lt;%@ include file=\"\" %&gt; \u7684\u533a\u522b\u3002<br \/><br\/>\n&lt;jsp:include page=\"\"\/&gt; \u5305\u542b\u88ab include \u6587\u4ef6\u7684\u8f93\u51fa<br \/>\n&lt;%@ include file=\"\" %&gt; \u5305\u542b\u88ab include \u6587\u4ef6\u7684\u4ee3\u7801<\/p>\n<br\/>\n<strong>a.jsp<\/strong> \u5185\u5bb9\uff1a<br\/><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"o\">&lt;<\/span><span class=\"n\">jsp<\/span><span class=\"p\">:<\/span><span class=\"n\">include<\/span><span class=\"w\"> <\/span><span class=\"n\">page<\/span><span class=\"o\">=<\/span><span class=\"s\">&#34;b.jsp&#34;<\/span><span class=\"w\"> <\/span><span class=\"o\">\/&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n<strong>b.jsp<\/strong> \u5185\u5bb9\uff1a(\u7a7a)<br\/><br\/>\n<strong>_a.class<\/strong> a.jsp\u7f16\u8bd1\u6210\u7c7b\u7684\u5185\u5bb9:"},{"title":"Linux\/Unix\u4e0b\u8bfb\u53d6lib\u76ee\u5f55\u4e0b\u6240\u6709\u5305\u751f\u6210classpath\u7684Shell","link":"https:\/\/yanbin.blog\/linux-unix-lib-classpath-shell\/","pubDate":"Wed, 25 Jul 2007 08:14:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/linux-unix-lib-classpath-shell\/","description":"\n\u505a\u4e86\u4e00\u4e2a Java \u7a0b\u5e8f\u653e\u5728 Solaris \u4e0b\u8fd0\u884c\uff0c\u7528\u5230\u8bb8\u591a\u7684\u7b2c\u4e09\u65b9\u5305\uff0c\u6709 *.zip \u7684\u548c *.ja r\u7684\uff0c\u653e\u5728 lib \u76ee\u5f55\u4e0b\uff0c\u7136\u540e\u5199\u4e86\u4e00\u4e2a shell \u811a\u672c\u6765\u8fd0\u884c\u90a3\u4e2a java \u7a0b\u5e8f\uff0c\u90a3\u5c31\u8981\u5728 classpath \u4e2d\u5305\u542b\u6240\u6709\u5728 lib \u4e2d\u7684\u7b2c\u4e09\u65b9\u5305\u3002<br\/>\n<br\/>\n\u539f\u6765\u7684\u505a\u6cd5\u662f\u5728 classpath\u4e2d\u628alib\u76ee\u5f55\u4e2d\u4e00\u4e2a\u4e2a\u7684\u5305\u6587\u4ef6\u540d\u7528\u5192\u53f7\u8fde\u7f00\u8d77\u6765\uff0c\u6bd4\u5982<br\/>\nclasspath=.:lib\/a.jar:lib\/b.jar:lib\/c.jar:lib\/d.zip<br\/>\njava -classpath $classpath com.unmi.Main"},{"title":"\u8f83\u4e3a\u5b8c\u7f8e\u7684\u4e00\u79cd\u6807\u9898\u7f29\u7565\u663e\u793a\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/title-fixed-width\/","pubDate":"Wed, 04 Jul 2007 07:08:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/title-fixed-width\/","description":"\n\u901a\u5e38\u5728\u7f51\u9875\u91cc\u90fd\u6709\u4e00\u79cd\u8fd9\u6837\u7684\u9700\u6c42\uff0c\u4e3a\u4e86\u754c\u9762\u6574\u6d01\uff0c\u5728\u663e\u793a\u6807\u9898\u65f6\u9700\u8981\u628a\u957f\u6807\u9898\u4ee5\u90e8\u5206\u52a0\u7701\u7565\u53f7\u8fde\u7f00\u663e\u793a\uff0c\u5c31\u6bd4\u5982\u4e2d\u56fd\u535a\u5ba2\u7f51\u663e\u793a\u65e5\u5fd7\u6807\u9898--\u4e0b\u9762\u90a3\u6837<\/p>\n<br\/>\n\u00b7\u5728VC6\u4e2d\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u89e3\u6790...(2007-06-24)<br \/>\n\u00b7VC\u4e2d\u4f7f\u7528CInternet...(2007-06-23)<br \/>\n\u00b7\u5f00\u6e90\u5d4c\u5165\u5f0f\u6570\u636e\u5e93 SQLit...(2007-06-23)\u00a0<br\/><br\/>\n\u95ee\u9898\u4e00\u662f\u524d\u9762\u90a3\u90e8\u5206\u5b57\u7b26\u4e32\u600e\u4e48\u6765\u786e\u5b9a\uff0c\u4e0a\u9762\u5f88\u660e\u663e\u793a\u7684\u770b\u5f97\u51fa\u6765\uff0c\u56e0\u4e3a\u6807\u9898\u4e2d\u6df7\u6742\u7740\u4e2d\u82f1\u6587\uff0c\u4ecd\u7136\u6ca1\u6709\u8fbe\u5230\u521d\u8877\u3002"},{"title":"\u638c\u63e1\u4e00\u79cdJava\u6a21\u677f\u6280\u672f \u2013 Velocity","link":"https:\/\/yanbin.blog\/master-java-template-velocity\/","pubDate":"Mon, 04 Jun 2007 09:53:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/master-java-template-velocity\/","description":"\n\u539f\u6765\u7684\u9879\u76ee\u4e2d\u57fa\u672c\u90fd\u662f\u7528 JSP+Tag\u00a0 \u6765\u5c55\u793a\u5185\u5bb9\uff0c\u6709\u65f6\u4e5f\u6709 Jasper Report \u505a\u62a5\u8868\uff0c\u62a5\u8868\u4e5f\u7b97\u662f\u4e00\u79cd\u6a21\u677f\u6280\u672f\uff0c\u53ea\u662f\u6709\u4e9b\u91cd\u91cf\u7ea7\u3002\u770b\u8fc7 Spring \u7684\u4e66\u7c4d\uff0c\u90fd\u4f1a\u5bf9 Velocity \u548c FreeMaker \u6709\u4ecb\u7ecd\uff0c\u5e26\u52a8\u4e86\u6211\u5bf9\u5148\u524d\u770b\u8fc7\u7684 *.vm \u6587\u4ef6\u7684\u7814\u7a76\u63d0\u4e0a\u4e86\u65e5\u7a0b\uff0c\u4e86\u89e3\u4e4b\u540e\uff0c\u5df2\u89c9\u76f8\u89c1\u6068\u665a\u3002<\/p>\n<br\/>\n\u4e0b\u9762\u8bb2\u5229\u7528 Velocity \u600e\u4e48\u66f4\u597d\u89e3\u51b3\u76ee\u524d\u9879\u76ee\u7684\u4e00\u4e2a\u7b80\u5355\u95ee\u9898\uff1a\u7cfb\u7edf\u5728\u8fdb\u884c\u652f\u4ed8\u4e86\u652f\u4ed8\u540e\uff0c\u81ea\u5df1\u6309\u8bbe\u5b9a\u7684\u4fe1\u606f\u6a21\u677f\u53d1\u9001\u4e00\u6761\u77ed\u4fe1\u7ed9\u8d23\u4efb\u4eba\u3002\u4fe1\u606f\u6a21\u677f\u662f\uff1a<br\/><br\/>\n<span style=\"color: #0000ff;\">{\u5355\u636e\u8d23\u4efb\u4eba}\uff1a\u60a8\u7684 {\u5355\u636e\u53f7} \u53f7{\u5355\u636e\u7c7b\u578b}\u5728 {\u64cd\u4f5c\u65e5\u671f} \u65e5\u5df2\u652f\u4ed8<\/span>"},{"title":"\u8bd5\u56fe\u5728\u4e0d\u4fee\u6539Log4J\u6e90\u7801\u60c5\u51b5\u4e0b,\u7528\u9759\u6001\u65b9\u6cd5\u6253\u5370\u6b63\u786e\u65e5\u5fd7\u4fe1\u606f\u5931\u8d25","link":"https:\/\/yanbin.blog\/log4j-static-method-log\/","pubDate":"Tue, 22 May 2007 23:16:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/log4j-static-method-log\/","description":"\n\u5728\u5f00\u6e90\u7684\u9879\u76ee\u4e2d\u4f7f\u7528 Log4j\u4e00\u822c \u90fd\u662f\u5728\u7c7b\u4e2d\u6dfb\u52a0\u4e00\u9759\u6001\u53d8\u91cf,\u5982<br \/>\n\u00a0protected static Log log = LogFactory.getLog(RequestProcessor.class); \/\/\u901a\u7528\u65e5\u5fd7\u7ec4\u4ef6<br \/>\n\u6216<br \/>\n\u00a0protected static Logger log = Logger.getLogger(RequestProcessor.class); \/\/\u76f4\u63a5\u7533\u660e\u4e3aLog4j\u7684logger<\/p>\n<br\/>\n\u539f\u6765\u6709\u4e00\u4e2a\u9879\u76ee\u662f\u505a\u4e86\u4e00\u4e2a\u81ea\u5b9a\u4e49\u4e86 MyLogger \u7c7b, \u5176\u4e2d\u7684 debug, info \u7b49\u5230\u65b9\u6cd5\u76f4\u63a5\u5c31\u662f\u8c03\u7528 log4j \u7684 logger \u7684\u5bf9\u5e94\u65b9\u6cd5. \u522b\u7684\u4ee3\u7801\u4e2d\u8c03\u7528 MyLogger \u7684\u9759\u6001\u65b9\u6cd5\u6253\u5370\u65e5\u5fd7\u65f6, \u4f9d\u636elog4j.properties\u7684\u914d\u7f6e\u663e\u793a %l\u00a0 \u5b9a\u4f4d\u4fe1\u606f\u5c31\u59cb\u7ec8\u662f MyLogger<br\/><br\/>\n\u5982\uff1a 2007-05-23 12:18:46,828 [DEBUG] com.unmi.MyLogger.debug(MyLogger.java:12) Hello MyLogger"},{"title":"\u4e00\u4e2aJUnit\u6d4b\u8bd5\u7528\u4f8b\u6bd4\u8f83\u6807\u51c6\u6a21\u677f(JBuilder\u6240\u7528)","link":"https:\/\/yanbin.blog\/junit-sample-from-jbuilder\/","pubDate":"Wed, 07 Feb 2007 19:12:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/junit-sample-from-jbuilder\/","description":"\n<p>\u8fd9\u662f\u5f53\u5e74\u7528 JBuilder \u7684\u65f6\u5019\uff0c\u521b\u5efa\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5efa\u7acb\u7684\u4ee3\u7801\u5e03\u5c40\u3002"},{"title":"\u7528 apache commons-email \u8f7b\u677e\u53d1\u9001\u65e0\u4e71\u7801\u90ae\u4ef6","link":"https:\/\/yanbin.blog\/apache-commons-email-send-mail\/","pubDate":"Wed, 06 Dec 2006 23:48:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/apache-commons-email-send-mail\/","description":"\n\u539f\u6765\u9879\u76ee\u4e2d\u90fd\u662f\u81ea\u5df1\u62ff\u5230 mail.jar \u548c activation.jar \u4e24\u4e2a\u5305\u7f16\u5199\u53d1\u9001Email\u7684\u4ee3\u7801\uff0c\u867d\u7136\u4e0d\u96be\uff0c\u4f46\u4e5f\u6709\u4e9b\u9ebb\u70e6\u3002<\/p>\n<br\/>\n\u73b0\u5728\u597d\u4e86\uff0c\u5728 apache \u7ad9\u70b9\u6709\u4e00\u4e2a jarkata\/commons\/email \u5b50\u9879\u76ee\uff0c\u4e5f\u4e3a\u6211\u4eec\u5b9e\u73b0\u4e86\u53d1\u9001 Email \u7684\u529f\u80fd\uff0c\u5728 <a href=\"http:\/\/jakarta.apache.org\/commons\/email\/\">http:\/\/jakarta.apache.org\/commons\/email\/<\/a>\u00a0\u628a\u5305 commons-email-1.0.jar \u4e0b\u6765\uff0c\u81ea\u5df1\u8981\u5199\u7684\u4ee3\u7801\u5c31\u5341\u5206\u5c11\u4e86\uff0c\u5e76\u4e14\u975e\u5e38\u660e\u4e86\u3002<br\/><br\/>\n\u8fd9\u4e2a\u5305\u7684\u5927\u5c0f\u53ea\u670923K\uff0c\u4e5f\u5c31\u662f9\u4e2a\u7c7b\u800c\u5df2\uff0c\u5374\u80fd\u8ba9\u60a8\u7701\u4e0d\u5c11\u4e8b\u3002"},{"title":"Java Web\u5e94\u7528\u56e0tld\u6587\u4ef6\u635f\u574f\u51fa\u73b0\u7684\u9519\u8bef","link":"https:\/\/yanbin.blog\/java-webapp-tld-damage\/","pubDate":"Tue, 14 Nov 2006 03:40:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-webapp-tld-damage\/","description":"\n\u90e8\u7f72\u4e00\u4e2a Web \u5e94\u7528\u5230 WebSphere Application Server\u3000\u4e2d\uff0c\u6d4f\u89c8 index.jsp \u9875\u9762\u65f6\u800c\u6b63\u5e38\uff0c\u65f6\u800c\u51fa\u73b0500\u9519\u8bef\uff0c\u67e5\u770b\u670d\u52a1\u5668\u8f93\u51fa\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u4ee5\u4e0b\u9519\u8bef\uff0c<\/p>\n<br\/>\n<span style=\"color: #ff0033;\">E SRVE0026E: [Servlet Error]-[This absolute uri &amp;#40;http:\/\/jakarta.apache.org\/struts\/tags-logic&amp;#41; cannot be resolved in either web.xml or the jar files deployed with this application]: org.apache.jasper.JasperException: This absolute uri (http:\/\/jakarta.apache.org\/struts\/tags-logic) cannot be resolved in either web.xml or the jar files deployed with this application"},{"title":"\u4e3a\u4f55Java\u7684\u6709\u5305\u540d\u7684\u7c7b\u4e0d\u80fd\u5f15\u7528\u9ed8\u8ba4\u5305\u4e2d\u7684\u7c7b","link":"https:\/\/yanbin.blog\/java-cannot-import-default-package\/","pubDate":"Wed, 23 Aug 2006 11:26:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-cannot-import-default-package\/","description":"\n\u6709\u4e24\u4e2ajava\u7c7b\uff0c\u6e90\u4ee3\u7801\u5982\u4e0b\uff1a<br\/><br\/>\n<table style=\"margin:auto; width: 750px; border-collapse: collapse;\" border=\"1\" cellspacing=\"2\" cellpadding=\"2\" bordercolor=\"#e7f7fe\">\n<tbody>\n<tr valign=\"top\">\n<td width=\"50%\">\u00a0\/\/\u6ca1\u6307\u5b9a\u5305\u540d\uff0c\u4e5f\u5c31\u662f\u5728\u9ed8\u8ba4\u5305\u4e2dpublic class B {<br\/>\n\u00a0 public void print(){<br\/>\n\u00a0\u00a0\u00a0 System.out.println(\"Printed By B Class\");<br\/>\n\u00a0 }<br\/>\n}<\/td>\n<td width=\"50%\">\u00a0package com.unmi;<br\/>\nimport B; \/\/\u5f15\u7528\u9ed8\u8ba4\u5305\u4e2d\u7684B\u7c7b<br\/>\npublic class A {<br\/>\n\u00a0 public static void main(String[] args) {<br\/>\n\u00a0\u00a0\u00a0 B b = new B(); \/\/\u5728A\u4e2d\u60f3\u8981\u5f15\u7528\u9ed8\u8ba4\u5305\u4e2d\u7684B\u7c7b<br\/>\n\u00a0 }<br\/>\n}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<br\/>\n\u5148\u4e0d\u8bf4\u5728IDE\u4e2d\u5982\u4f55\u7f16\u8bd1\u5b83\u4eec\u4ee5\u53ca\u4f1a\u63d0\u793a\u4ec0\u4e48\u8bed\u6cd5\u9519\u8bef\uff0c\u53ea\u662f\u7528\u547d\u4ee4javac\u6765\u7f16\u8bd1\u5b83\u4eec\uff0c\u5148\u662f\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u76ee\u5f55\u4e0b\uff0c\u6ce8\u610f\u7684\u662f\uff0c\u867d\u7136A.java\u6709package unmi.com;\u58f0\u660e\uff0c\u6211\u4eec\u8fd8\u662f\u5148\u628a\u5b83\u653e\u5728\u4e0bB.java\u540c\u4e00\u76ee\u5f55\uff0c\u5e0c\u671b\u7531javac\u547d\u4ee4\u6765\u751f\u6210\u76f8\u5bf9\u5e94\u7684\u5305\u76ee\u5f55\u3002"},{"title":"Log4J \u8f93\u51fa\u65e5\u5fd7\u65f6\u662f\u5982\u4f55\u83b7\u77e5\u5f53\u524d\u65b9\u6cd5\u3001\u884c\u53f7\u7684","link":"https:\/\/yanbin.blog\/log4j-get-line-number-method\/","pubDate":"Sun, 25 Jun 2006 05:43:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/log4j-get-line-number-method\/","description":"\n\u8bb0\u5f97\u6700\u65e9\u5728\u9879\u76ee\u4e2d\u7528Log4j\u7684\u65f6\u5019\uff0c\u4e5f\u662f\u89c9\u5f97\u5728\u6bcf\u4e00\u4e2a\u8981\u8bb0\u8f7d\u65e5\u5fd7\u7684\u7c7b\u4e2d\u6216\u8005\u67d0\u4e2a\u4e0a\u5c42\u7c7b\u4e2d\u8981\u58f0\u660e\u4e00\u4e2aLogger\u5c5e\u6027\u633a\u9ebb\u70e6\u7684<\/p>\n<br\/>\n\u6ce8(2018-06-30)\uff1a\u672c\u6587\u6240\u5c55\u793a\u7684 Log4J \u5982\u4f55\u5b9a\u4eec\u4f4d\u7f6e\u4fe1\u606f\u53ef\u53c2\u8003 Log4J 1.2.13 \u7684\u6e90\u4ee3\u7801\uff0c\u65b0\u4ee3\u7801\u53ef\u80fd\u6709\u51fa\u5165\u3002<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">protected<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"n\">Log<\/span><span class=\"w\"> <\/span><span class=\"n\">log<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">LogFactory<\/span><span class=\"p\">.<\/span><span class=\"na\">getLog<\/span><span class=\"p\">(<\/span><span class=\"n\">Test<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6216\u8005<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">protected<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"n\">Logger<\/span><span class=\"w\"> <\/span><span class=\"n\">log<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Logger<\/span><span class=\"p\">.<\/span><span class=\"na\">getLogger<\/span><span class=\"p\">(<\/span><span class=\"n\">Test<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u4e8e\u662f\u5c31\u5199\u4e86\u4e00\u4e2a\u81ea\u5df1\u7684Logger\u7c7bUnmiLogger\uff0c\u4e5f\u5c31\u662f\u628aLog4j\u7684Logger\u5305\u88c5\u4e00\u4e0b\uff0c\u76f4\u63a5\u8c03\u7528Logger\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u6cd5\uff0cinfo\u3001debug\u3001warn\u7b49\uff0c\u53ea\u4e0d\u8fc7\u5728UnmiLogger\u4e2d\u628a\u65e5\u5fd7\u8f93\u51fa\u65b9\u6cd5\u90fd\u6539\u4e3a\u9759\u6001\u7684\uff0c\u8ba9\u5728\u522b\u7684\u4ee3\u7801\u4e2d\u65b9\u4fbf\u4f7f\u7528\u3002"},{"title":"\u6536\u96c6\u7684\u4e00\u4e9b\u6709\u5173\u4e2d\u6587\u5206\u8bcd\u7684\u8d44\u6e90","link":"https:\/\/yanbin.blog\/chinese-analyzer-resources\/","pubDate":"Sat, 24 Jun 2006 07:27:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/chinese-analyzer-resources\/","description":"\n<span id=\"showcontent\">\u00a01. <a href=\"http:\/\/drupal.org\/node\/53886\">Chinese Word Splitter(\u4e2d\u6587\u5206\u8bcd)<\/a>\u00a0 (*)<br\/>\n\u00a02. <a href=\"http:\/\/www.lietu.com\/doc\/index.htm\">\u730e\u5154--\u4e2d\u6587\u5206\u8bcd\u6280\u672f\u6587\u6863<\/a>\u00a0(*)<br\/>\n\u00a03. <a href=\"http:\/\/www.jesoft.cn\/posts\/list\/5.page\">Lucene\u4e2d\u6587\u5206\u8bcd\u7ec4\u4ef6 JE-Analysis 1.3.1<\/a>\u00a0(*)<br\/>\n\u00a04. <a href=\"http:\/\/www.ieee.org.cn\/dispbbs.asp?boardID=2&amp;ID=25555\">\u51e0\u4e2a\u514d\u8d39\u7684\u4e2d\u6587\u5206\u8bcd\u6a21\u5757<\/a><br\/>\n\u00a05. <a href=\"http:\/\/www.nlp.org.cn\/project\/project.php?proj_id=6\">\u8ba1\u7b97\u6240\u6c49\u8bed\u8bcd\u6cd5\u5206\u6790\u7cfb\u7edf ICTCLAS<\/a>\u00a0(*)<br\/>\n\u00a06. <a href=\"http:\/\/www.xml.org.cn\/printpage.asp?BoardID=2&amp;id=11502\">fenci\uff0cJava \u7684 ICTCLAS<br\/>\n<\/a>\u00a07. AutoSplit\uff0c\u53e6\u4e00\u4e2a Java \u7684 ICTCLAS<br\/>\n\u00a08. <a href=\"http:\/\/www.donews.net\/accesine\">\u5c0f\u53ee\u549a\u4e2d\u6587\u5206\u8bcd\u3000\u4ecb\u7ecd\u9875\u9762<\/a>"},{"title":"\u8fd0\u884c Think In Java\u4e2d\u7684 RMI \u793a\u4f8b\u53ef\u80fd\u4ea7\u751f\u7684\u51e0\u79cd\u5f02\u5e38\u53ca\u89e3\u51b3","link":"https:\/\/yanbin.blog\/think-in-java-rmi-exception\/","pubDate":"Sat, 24 Jun 2006 04:38:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/think-in-java-rmi-exception\/","description":"\n\u5728Think In Java\u91cc\u6709\u4e00\u4e2a\u793a\u4f8b RMI \u7684\u4ee3\u7801 PerfectTime, \u53ef\u662f\u5176\u4e2d\u5e76\u6ca1\u6709\u628a\u6709\u4e9b\u6267\u884c\u7ec6\u8282\u8bf4\u660e\u4e86\uff0c\u4e5f\u5c31\u53ef\u4ee5\u9020\u6210\u65b0\u624b\u8fd0\u884c\u5b83\u4f1a\u51fa\u67d0\u4e9b\u5f02\u5e38\u800c\u4e0d\u77e5\u6240\u63aa\u3002\u4e0b\u9762\u5c06\u5217\u51fa\u53ef\u80fd\u4ea7\u751f\u7684\u5f02\u5e38\uff0c\u5e76\u8bf4\u660e\u89e3\u51b3\u529e\u6cd5\uff0c\u5982\u8bfb\u8005\u5728\u6267\u884c\u5f53\u4e2d\u8fd8\u9047\u5230\u5176\u4ed6\u672a\u5217\u51fa\u7684\u5f02\u5e38\uff0c\u53ef\u7559\u8a00\u544a\u77e5\uff0c\u543e\u5c06\u5c3d\u529b\u800c\u4e3a\u3002<br\/>\n<br\/>\n\u9996\u5148\u628a\u4ee3\u7801PerfectTime\u548cDisplayPerfectTime \u4e2d\u7684<span style=\"color: #004488;\">\/\/colossus:2005\/PerfectTime<\/span>\u6539\u4e3a<span style=\"color: #004488;\">\/\/localhost:2005\/PerfectTime<\/span> ,\u56e0\u4e3acolossus\u4e3a\u673a\u5668\u540d\uff0c\u6240\u4ee5\u6539\u4e3alocalhost\u6307\u5411\u672c\u673a\uff0c\u4e0d\u7136\u627e\u4e0d\u5230\u4e3b\u673acolossus\u7684\u3002<br\/>\n<br\/>\n\u5df2\u7ecf\u7528\u547d\u4ee4 RMIC \u751f\u6210PerfectTime_Stub.class\uff0c\u5e76\u4e14\u6267\u884c\u4e86\u547d\u4ee4 rmiregistry 2005"},{"title":"JAVA RMI \u5feb\u901f\u5165\u95e8\u5b9e\u4f8b","link":"https:\/\/yanbin.blog\/java-rmi-get-started\/","pubDate":"Sat, 24 Jun 2006 01:29:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-rmi-get-started\/","description":"\n\u672c\u5b9e\u4f8b\u4e3a\u53c2\u8003\u591a\u7bc7\u6587\u7ae0\u5199\u5c31\u800c\u6210\uff0c\u7f51\u4e0a\u53ca\u4e66\u4e0a\u5404\u7c7b\u6587\u7ae0\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528RMI\u6709\u591a\u79cd\u5b9e\u4f8b\u53ef\u53c2\u8003\uff0c\u8b6c\u5982\u6709\uff1a\n<br\/>\n1. \u7528\u547d\u4ee4rmiregistry\u542f\u52a8RMI\u6ce8\u518c\u670d\u52a1\u7684<br \/>\n2. \u540c\u65f6\u521b\u5efa\u5b58\u6839(stub)\u548c\u9aa8\u67b6(skeleton)\u7684<br \/>\n3. \u53ea\u521b\u5efa\u5b58\u6839\u7c7b\u7684(jdk1.2\u4ee5\u540e\u7248\u672c)<br \/>\n4. \u901a\u8fc7RemoteRef\u548crmi:\/\/\u534f\u8bae\u5b57\u4e32\u65b9\u5f0f\u7684<br \/>\n5. \u6bd4\u8f83\u5c11\u8bb2\u5230\u7684\u7528LocateRegistry\u76f4\u63a5\u5728\u4ee3\u7801\u4e0a\u542f\u52a8RMI\u6ce8\u518c\u670d\u52a1\u7684\u3002<br\/><br\/>\n\u4ee5\u4e0a\u63cf\u8ff0\u5e76\u975e\u660e\u663e\u5206\u7c7b\uff0c\u6bd4\u5982\uff0c\u4f60\u603b\u662f\u53ef\u4ee5\u9009\u62e9\u7528rmiregistry\u6216\u8005\u4ee3\u7801LocateRegistry\u542f\u52a8RMI\u6ce8\u518c\u670d\u52a1<br\/><br\/>\n\u4e0b\u9762\u6211\u5c06\u4ecb\u7ecd\u4e00\u4e2a\u5b8c\u6574\u7684\u5b9e\u4f8b\uff0c\u8ba9\u521d\u5b66\u8005\u80fd\u5feb\u901f\u4f53\u9a8cRMI\u7684\u529f\u7528\u3002<br\/><br\/>\n\u5206\u4e3a\u4ee5\u4e0b\u56db\u4e2a\u6b65\u9aa4"},{"title":"\u4f60\u5e94\u8be5\u77e5\u9053\u768410\u4ef6\u5173\u4e8eJava 6\u7684\u4e8b\u60c5 [\u8f6c]","link":"https:\/\/yanbin.blog\/maybe-unknown-java6-10-thing\/","pubDate":"Thu, 22 Jun 2006 13:26:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/maybe-unknown-java6-10-thing\/","description":"\n<a href=\"http:\/\/java.sun.com\/developer\/technicalArticles\/J2SE\/Desktop\/mustang\/beta2.html\">http:\/\/java.sun.com\/developer\/technicalArticles\/J2SE\/Desktop\/mustang\/beta2.html<\/a> \u4e00\u6587\u4e2d\u63cf\u8ff0\u4e86\u4f60\u5e94\u8be5\u77e5\u9053\u768410\u4ef6\u5173\u4e8eJava 6\u7684\u4e8b\u60c5\uff0c\u4e0b\u9762\u603b\u7ed3\u5982\u4e0b<br\/>\n<br\/>\n<strong>1.Web Services.<\/strong> \u4f18\u5148\u652f\u6301\u7f16\u5199 XML web service \u5ba2\u6237\u7aef\u7a0b\u5e8f\u3002\u4f60\u53ef\u4ee5\u7528\u8fc7\u7b80\u5355\u7684annotaion\u5c06\u4f60\u7684API\u53d1\u5e03\u6210.NET\u4ea4\u4e92\u7684web services. Mustang \u6dfb\u52a0\u4e86\u65b0\u7684\u89e3\u6790\u548c XML \u5728 Java object-mapping APIs\u4e2d, \u4e4b\u524d\u53ea\u5728Java EE\u5e73\u53f0\u5b9e\u73b0\u6216\u8005Java Web Services Pack\u4e2d\u63d0\u4f9b.<br\/>\n<br\/>\n<strong>2.Scripting.<\/strong> \u73b0\u5728\u4f60\u53ef\u4ee5\u5728Java\u6e90\u4ee3\u7801\u4e2d\u6df7\u5165JavaScript\u4e86\uff0c\u8fd9\u5bf9\u5f00\u53d1\u539f\u578b\u5f88\u6709\u6709\u7528\uff0c\u4f60\u4e5f\u53ef\u4ee5\u63d2\u5165\u81ea\u5df1\u7684\u811a\u672c\u5f15\u64ce\u3002"},{"title":"\u4f7f\u7528Lucene\u7684\u4e24\u6bb5\u7cbe\u8981\u4ee3\u7801","link":"https:\/\/yanbin.blog\/lucene-two-code\/","pubDate":"Mon, 19 Jun 2006 21:16:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/lucene-two-code\/","description":"\nLucene\u7b80\u4ecb\uff1a<br \/>\nLucene\u662f\u4e00\u4e2a\u57fa\u4e8eJava\u7684\u5168\u6587\u7d22\u5f15\u5de5\u5177\u5305\u3002Lucene\u7684\u53d1\u5c55\u5386\u7a0b\uff1a\u65e9\u5148\u53d1\u5e03\u5728\u4f5c\u8005\u81ea\u5df1\u7684<a href=\"http:\/\/www.lucene.com\">www.lucene.com<\/a>\uff0c\u540e\u6765\u53d1\u5e03\u5728SourceForge\uff0c2001\u5e74\u5e74\u5e95\u6210\u4e3aAPACHE\u57fa\u91d1\u4f1ajakarta\u7684\u4e00\u4e2a\u5b50\u9879\u76ee\uff1a<a href=\"http:\/\/jakarta.apache.org\/lucene\/\">http:\/\/jakarta.apache.org\/lucene\/<\/a>.<br \/>\nJive,Eyebrows,Cocoon,Eclipse\u4e2d\u90fd\u4f7f\u7528\u4e86Lucene<br \/>\n\u5168\u6587\u68c0\u7d22\u548c\u6570\u636e\u5e93\u5e94\u7528\u6700\u5927\u7684\u4e0d\u540c\u5728\u4e8e\uff1a\u8ba9\u6700\u76f8\u5173\u7684\u5934100\u6761\u7ed3\u679c\u6ee1\u8db398%\u4ee5\u4e0a\u7528\u6237\u7684\u9700\u6c42<\/p>\n<br\/>\n\u7d22\u5f15\u8fc7\u7a0b\u4e2d\u53ef\u4ee5\u770b\u5230\uff1a<br \/>\n\u00a0\u00a0\u00a0 * \u8bed\u8a00\u5206\u6790\u5668\u63d0\u4f9b\u4e86\u62bd\u8c61\u7684\u63a5\u53e3\uff0c\u56e0\u6b64\u8bed\u8a00\u5206\u6790(Analyser)\u662f\u53ef\u4ee5\u5b9a\u5236\u7684\uff0c\u867d\u7136lucene\u7f3a\u7701\u63d0\u4f9b\u4e862\u4e2a\u6bd4\u8f83\u901a\u7528\u7684\u5206\u6790\u5668 SimpleAnalyser\u548cStandardAnalyser\uff0c\u8fd92\u4e2a\u5206\u6790\u5668\u7f3a\u7701\u90fd\u4e0d\u652f\u6301\u4e2d\u6587\uff0c\u6240\u4ee5\u8981\u52a0\u5165\u5bf9\u4e2d\u6587\u8bed\u8a00\u7684\u5207\u5206\u89c4\u5219\uff0c\u9700\u8981\u4fee\u6539\u8fd92\u4e2a\u5206\u6790\u5668\u3002\u6216\u8005\u5efa\u7acb\u81ea\u5df1\u7684\u8bed\u8a00\u5206\u6790\u5668"},{"title":"\u62fe\u8c08\"\u7528\u6700\u6709\u6548\u7387\u7684\u65b9\u6cd5\u7b97\u51fa2\u4e58\u4ee58\u7b49\u65bc\u51e0?\"","link":"https:\/\/yanbin.blog\/2x8-why-discuss\/","pubDate":"Sun, 18 Jun 2006 10:13:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/2x8-why-discuss\/","description":"\n\u8fd9\u662f\u7f51\u4e0a\u6d41\u4f20\u7684\"<a href=\"http:\/\/forum.gaya.cn\/read.php?fid=12&amp;tid=508\">\u53d8\u6001\u7ea7JAVA\u7a0b\u5e8f\u5458\u9762\u8bd532\u95ee<\/a>\"\u7684\u5176\u4e2d\u4e00\u9898\uff08\u4e8c\u5341\u516b\u9898\uff09\uff0c\u7136\u540e\u4e0b\u9762\u7ed9\u51fa\u6765\u7684\u7b54\u6848\u662f<br\/>\n<br\/>\n\u7b2c\u4e8c\u5341\u516b\uff0c\u7f16\u7a0b\u9898: \u7528\u6700\u6709\u6548\u7387\u7684\u65b9\u6cd5\u7b97\u51fa2\u4e58\u4ee58\u7b49\u65bc\u51e0?<br\/>\n\u6709C\u80cc\u666f\u7684\u7a0b\u5e8f\u5458\u7279\u522b\u559c\u6b22\u95ee\u8fd9\u79cd\u95ee\u9898\u3002<br\/>\n<br\/>\n2 &lt;&lt; 3<br\/>\n<br\/>\n\u7c97\u770b\u4f3c\u4e4e\u5f88\u5728\u7406\uff0c\u5927\u81f4\u60f3\u67652&lt;&lt;3\u4f1a\u662f\u79fb\u4f4d\u64cd\u4f5c\uff0c\u5728Java\u7684\u5b57\u8282\u7801\u4e2d\u79fb\u4f4d\u6307\u4ee4\u662fishl\uff08\u53f3\u79fb\uff09\uff0c\u800c\u5728CPU\u4e0a\u7684\u786c\u4ef6\u6307\u4ee4\u53ef\u80fd\u5c31\u4f1a\u662fshl\uff08\u7b97\u672f\u53f3\u79fb\u6307\u4ee4\uff09\u3002\u5176\u5b9e\u4e0d\u7136\uff0c\u5982\u679c\u719f\u6089\u6c47\u7f16\u8bed\u8a00\uff0c\u8fd8\u8003\u8651\u8fc7\u7f16\u8bd1\u4f18\u5316\uff0c2&lt;&lt;3\u6839\u672c\u4e0d\u4f1a\u4f7f\u7528\u79fb\u4f4d\u64cd\u4f5c\uff0c\u800c\u662f\u5728\u7f16\u8bd1\u65f6\u5c31\u4f18\u5316\u8ba1\u7b97\u51fa16\u6765\u4e86\u3002<br\/>\n<br\/>\n\u4f46\u5982\u679c\u662f\u5199\u6210\u8fd9\u6837\u7684\u65b9\u5f0f\uff08int i = 2; int j = i&lt;&lt;2;\uff09\uff0c\u53c8\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u5927\u5bb6\u53ef\u4ee5\u4ece\u4ee3\u7801\u4e0d\u540c\u5199\u6cd5\u751f\u6210\u7684Java\u64cd\u4f5c\u6307\u4ee4\u6216\u6c47\u7f16\u6307\u4ee4\u770b\u51fa\u4e2a\u7aef\u502a\u3002"},{"title":"\u4f7f\u7528JNative,\u5728Java\u4e2d\u4f20\u9012\u4e00\u4e2aC\/C++\u7ed3\u6784\u53c2\u6570\u5230\u52a8\u6001\u5e93\u4e2d","link":"https:\/\/yanbin.blog\/jnative-java-pass-struct\/","pubDate":"Thu, 18 May 2006 10:38:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jnative-java-pass-struct\/","description":"\n<p>\u7528C++\u5199\u7684\u52a8\u6001\u5e93\u7684\u5bfc\u51fa\u65b9\u6cd5\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-cpp\" data-lang=\"cpp\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"k\">struct<\/span> <span class=\"nc\">TestStruct<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">a<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">b<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"k\">extern<\/span> <span class=\"s\">&#34;C&#34;<\/span> <span class=\"kr\">__declspec<\/span><span class=\"p\">(<\/span><span class=\"n\">dllexport<\/span><span class=\"p\">)<\/span> <span class=\"n\">TestStruct<\/span><span class=\"o\">*<\/span> <span class=\"n\">ShowStruct<\/span><span class=\"p\">(<\/span><span class=\"n\">TestStruct<\/span><span class=\"o\">*<\/span> <span class=\"n\">testStruct<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"> <span class=\"n\">cout<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"s\">&#34;\u5728\u52a8\u6001\u5e93\u4e2d\u6253\u5370\uff1a\u4f20\u5165\u52a8\u6001\u5e93\u4e2d\u7684\u7ed3\u6784\u6210\u5458a\u7684\u503c\u4e3a:&#34;<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"n\">testStruct<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">a<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"n\">endl<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"> <span class=\"c1\">\/\/\u6539\u53d8\u4f20\u5165\u7ed3\u6784\u6210\u5458a\u7684\u503c\u4e3a100\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"> <span class=\"n\">testStruct<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">a<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">100<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">testStruct<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"Java\u8c03\u7528\u52a8\u6001\u5e93\u6700\u7b80\u4fbf\u65b9\u6cd5\u548c\u6700\u597d\u7528\u7684\u7ec4\u4ef6","link":"https:\/\/yanbin.blog\/java-jnative-dll-concise\/","pubDate":"Wed, 17 May 2006 13:09:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-jnative-dll-concise\/","description":"\n\u8bb0\u5f97\u4ee5\u524d Java \u8981\u8c03\u7528C\/C++\u5199\u5f97\u52a8\u6001\u5e93\u90fd\u662f\u7528\u7684 JNI \u65b9\u5f0f\uff0c\u8fd8\u9700\u8981\u81ea\u5df1\u5199\u4e0d\u5c11 C\/C++ \u4ee3\u7801\u3002\u6bd4\u5982\u8bf4\u8981\u5728Java\u4e2d\u8c03\u7528\u5df2\u6709\u7684\u52a8\u6001\u5e93\uff0c\u5982 Windows \u7684 user32.dll \u7684\u65b9\u6cd5 MessageBoxA\uff0c\u5177\u4f53\u6b65\u9aa4\u662f Java \u4e2d\u58f0\u660e\u4e00\u4e2a native \u65b9\u6cd5\uff0c\u7136\u540e\u7528 javah \u547d\u4ee4\u751f\u6210JNI\u6837\u5f0f\u7684\u5934\u6587\u4ef6\uff0c\u518d\u81ea\u5df1\u5b9e\u73b0\u5934\u6587\u4ef6\u4e2d\u58f0\u660e\u7684\u65b9\u6cd5\uff0c\u5728\u5b9e\u73b0\u65b9\u6cd5\u4e2d\u88c5\u8f7d\u52a8\u6001\u5e93 user32.dll\uff0c\u8c03\u7528 MessageBoxA \u65b9\u6cd5\uff0c\u9700\u8981\u628a\u81ea\u5df1\u5199\u7684\u8fd9\u90e8\u5206 C\/C++ \u4ee3\u7801\u5c01\u88c5\u6210\u4e00\u4e2a\u52a8\u6001\u5e93\uff0c\u5982Sample.dll\uff0c\u6700\u540e\u5728 java\u00a0 \u4e2d\u88c5\u8f7d Sample.dll\uff0c\u7136\u540e\u6267\u884c\u5176\u4e2d\u6240\u58f0\u660e\u7684\u672c\u5730\u65b9\u6cd5\u3002<br\/>\n<br\/>\n\u53ef\u89c1\uff0c\u7528\u8001\u5b9e\u7684JNI\u65b9\u5f0f\uff0c\u6211\u4eec\u5728\u8c03\u7528\u4e00\u4e2a\u5df2\u77e5\u52a8\u6001\u5e93\u7684\u65f6\u5019\u8fd8\u9700\u8981\u989d\u5916\u751f\u6210\u4e00\u4e2a\u7b26\u5408JNI\u89c4\u5219\u7684\u52a8\u6001\u5e93\u4f5c\u4e3a\u6865\u6881\uff0c\u663e\u5f97\u6709\u70b9\u591a\u4f59\u4e86\u3002"},{"title":"\u5e38\u7528log4j\u914d\u7f6e","link":"https:\/\/yanbin.blog\/log4j-common-config\/","pubDate":"Thu, 23 Mar 2006 10:35:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/log4j-common-config\/","description":"\n\u5e38\u7528log4j\u914d\u7f6e\uff0c\u4e00\u822c\u53ef\u4ee5\u91c7\u7528\u4e24\u79cd\u65b9\u5f0f\uff0c.properties\u548c.xml,\u4e0b\u9762\u4e3e\u4e24\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a\n<br\/><br\/>\n\u6700\u7b80\u5355\u7684\u914d\u7f6e\u662f\u53ea\u8981\u53d6\u4e0b\u9762\u7684log4j.properties\u6587\u4ef6\u4e2d\u5e26\u4e0b\u5212\u7ebf\u7684\u56db\u884c\u5c31\u884c\uff0c\u5b83\u5b8c\u6210\u65e5\u5fd7\u8f93\u51fa\u5230\u63a7\u5236\u53f0\u3002<br\/><br\/>\n<strong>\u4e00\u3001log4j.properties<\/strong>"},{"title":"\u5173\u4e8e Log4j \u6bd4\u8f83\u5168\u9762\u7684\u914d\u7f6e","link":"https:\/\/yanbin.blog\/log4j-full-config\/","pubDate":"Thu, 23 Mar 2006 10:16:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/log4j-full-config\/","description":"\nLOG4J\u7684\u914d\u7f6e\u4e4b\u7b80\u5355\u4f7f\u5b83\u904d\u53ca\u4e8e\u8d8a\u6765\u8d8a\u591a\u7684\u5e94\u7528\u4e2d\u4e86\uff1aLog4J\u914d\u7f6e\u6587\u4ef6\u5b9e\u73b0\u4e86\u8f93\u51fa\u5230\u63a7\u5236\u53f0\u3001\u6587\u4ef6\u3001\u56de\u6eda\u6587\u4ef6\u3001\u53d1\u9001\u65e5\u5fd7\u90ae\u4ef6\u3001\u8f93\u51fa\u5230\u6570\u636e\u5e93\u65e5\u5fd7\u8868\u3001\u81ea\u5b9a\u4e49\u6807\u7b7e\u7b49\u5168\u5957\u529f\u80fd\u3002\u62e9\u5176\u4e00\u4e8c\u4f7f\u7528\u5c31\u591f\u7528\u4e86"},{"title":"\u4e0d\u81ea\u89c9\u53c8\u559c\u6b22\u4e0a\u4e86NetBeans IDE5.0(Build 200601251500)","link":"https:\/\/yanbin.blog\/like-netbeans-ide\/","pubDate":"Tue, 07 Mar 2006 11:05:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/like-netbeans-ide\/","description":"\n\u66fe\u7ecf\u662fEclipse\u7684\u62e5\u8db8,\u4eca\u5929\u665a\u4e0a\u5728\u7f51\u4e0aDown\u4e86\u4e00\u4e2aNetBean 5.0\uff0c\u5b89\u88c5\u5230\u7535\u8111\u4e0a\uff0c\u6253\u5f00\u8bd5\u7528\u4e86\u4e00\u4e0b\uff0c\u786e\u5b9e\u6bd4\u4ee5\u524d\u7248\u672c\u5feb\u5f88\u591a\uff0c\u800c\u4e14\u529f\u80fd\u4e5f\u975e\u5e38\u7684\u4e30\u5bcc\uff0c\u76f4\u63a5\u652f\u6301EJB\u5f00\u53d1\uff0cAJAX\uff0cJSF1.1\uff0cStruts\u90fd\u52301.2.7\u4e86\uff0c\u8fd8\u8981\u770b\u770bStruts\u4f4e\u7248\u672c\u662f\u5982\u4f55\u652f\u6301\u7684\uff0cWebService\u7684\u5f00\u53d1\uff1b\u8fd8\u6709\u628a\u6e90\u6587\u4ef6\u8f93\u51fa\u4e3aHTML\u683c\u5f0f\u7684\u529f\u80fd\uff0c\u5bfc\u51fa\u8981\u5c55\u793a\u7684\u4ee3\u7801\u5f88\u6709\u7528\u7684\u3002<br\/>\n<br\/>\nNetBean\u4e5f\u662f\u514d\u8d39\u7684\uff0c\u867d\u8bf4Eclipse\u4e5f\u662f\u514d\u8d39\u7684\uff0c\u4f46Eclipse\u8fd8\u5f97\u501a\u4ed7\u7740\u76d7\u7248\u7684MyEclipse\u624d\u80fd\u505a\u5b9e\u9645\u7684\u5f00\u53d1\uff1bNetBean\u4e5f\u6709\u63d2\u4ef6\u554a\u3002\u770b\u6765\u4e00\u88ab\u5ffd\u7565\u7684NetBean\u9700\u8981\u597d\u597d\u53bb\u53d1\u6398\uff0c\u4ee5\u540e\u5728\u672c\u673a\u5b66\u4e60\u3001\u6d4b\u8bd5\u3001\u9a8c\u8bc1\u4ee3\u7801\u7684\u8bdd\u6211\u5c31\u5728NetBean\u4e0b\u8fdb\u884c\u4e86\u3002"},{"title":"\u4f7f\u7528Java\u7684\u53cd\u5c04\u8c03\u7528\u65b9\u6cd5\u5e94\u6ce8\u610f\u7684\u5f02\u5e38\u5904\u7406","link":"https:\/\/yanbin.blog\/java-reflect-exception-handle\/","pubDate":"Tue, 07 Mar 2006 10:07:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-reflect-exception-handle\/","description":"\n\u5148\u770b\u4e0b\u9762\u7684\u4ee3\u7801\uff0c\u770b\u770b\u7a0b\u5e8f\u6267\u884c\u4f1a\u662f\u4ec0\u4e48\u6837\u7684\u7ed3\u679c\uff1a\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.lang.reflect.Method<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">ExceptionTest<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">try<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">foo1<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"k\">catch<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">MyException<\/span><span class=\"w\"> <\/span><span class=\"n\">me<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Exception Type: MyException&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"k\">catch<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">Exception<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Exception Type: Exception&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo1<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Method<\/span><span class=\"w\"> <\/span><span class=\"n\">method<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">ExceptionTest<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">.<\/span><span class=\"na\">getDeclaredMethod<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;foo2&#34;<\/span><span class=\"p\">,<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Class<\/span><span class=\"o\">[]<\/span><span class=\"p\">{});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u6ce8\u610f\u8c03\u7528foo2\u65f6\uff0cfoo2\u65b9\u6cd5\u4f1a\u629b\u51faMyException\u5f02\u5e38<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">method<\/span><span class=\"p\">.<\/span><span class=\"na\">invoke<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Object<\/span><span class=\"o\">[]<\/span><span class=\"p\">{});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo2<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"kd\">throws<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">25<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">throw<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">MyException<\/span><span class=\"p\">();<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/foo2\u65b9\u6cd5\u76f4\u63a5\u629b\u51fa\u5f02\u5e38<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">26<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">27<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">28<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">29<\/span><span class=\"cl\"><span class=\"c1\">\/\/\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u5f02\u5e38<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">30<\/span><span class=\"cl\"><span class=\"kd\">class<\/span> <span class=\"nc\">MyException<\/span><span class=\"w\"> <\/span><span class=\"kd\">extends<\/span><span class=\"w\"> <\/span><span class=\"n\">Exception<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">31<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">32<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"\u7eafJava\u7a0b\u5e8f\u8bfb\u53d6DBF\u6587\u4ef6\u578b\u6570\u636e\u5e93","link":"https:\/\/yanbin.blog\/pure-java-access-dbf\/","pubDate":"Fri, 03 Mar 2006 11:03:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/pure-java-access-dbf\/","description":"\n\u8fd8\u8bb0\u5f97\u90a3\u4e2a\u53e4\u8001\u7684Foxbase\u548cFoxpro\u4ea7\u751f\u7684\u6570\u636e\u5e93\u5417\uff1f\u4e0eaccess\uff08MDB\uff09\u7c7b\u4f3c\u7684\u6587\u4ef6\u578b\u6570\u636e\u5e93\uff0c\u53ef\u662f\u6709\u4e9b\u5730\u65b9\u6709\u4eba\u8fd8\u5728\u7528\u5b83\u3002DBF\u6570\u636e\u5e93\u4e00\u822c\u90fd\u662f\u5728Foxbase\u6216Foxpro\u4e2d\u6216\u7531\u5b83\u4eec\u751f\u6210\u7684\u5e94\u7528\u7a0b\u5e8f\u6765\u8bbf\u95ee\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5efa\u7acbODBC\u7684\u65b9\u5f0f\u6765\u8bbf\u95ee\u3002<\/p>\n<br\/>\nJava\u8981\u8bbf\u95ee\u4ec0\u4e48\u6570\u636e\u5e93\u7b2c\u4e00\u4e2a\u5ff5\u5934\u5c31\u4f1a\u662f\u6709\u6ca1\u6709\u76f8\u5e94\u7684\u9a71\u52a8\u554a\uff0c\u6709\u9a71\u52a8\u90a3\u597d\u529e\uff0c\u82e5\u662f\u6ca1\u6709\u9a71\u52a8\u90a3\u80fd\u4e0d\u80fd\u901a\u8fc7\u914d\u7f6eODBC\uff0c\u7528JDBC-ODBC\u6865\u6765\u8bbf\u95ee\u5462\uff1f\u5f53\u7136Java\u8bbf\u95eeDBF\u6587\u4ef6\u662f\u53ef\u4ee5\u901a\u8fc7JDBC\uff0dODBC\u7684\u65b9\u5f0f\uff0c\u4f46\u8fd9\u6837\u7684\u8bdd\u662f\u4e0d\u662f\u7eafJava\u5b9e\u73b0\u8fd8\u8bf4\uff0c\u5012\u662f\u5f97\u4e3a\u8981\u8bbf\u95ee\u7684DBF\u6587\u4ef6\u5efa\u4e00\u4e2a\u6570\u636e\u6e90\u9ebb\u70e6\uff0c\u5c24\u5176\u662f\u7a0b\u5e8f\u79fb\u690d\u65f6\u3002"},{"title":"Oracle\u4e2d\u7684Java\u5b58\u50a8\u8fc7\u7a0b\u7684\u64cd\u4f5c\u6743\u9650","link":"https:\/\/yanbin.blog\/oracle-java-permissions\/","pubDate":"Mon, 16 Jan 2006 00:47:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/oracle-java-permissions\/","description":"\n\u5f53\u6211\u4eec\u5728Oracle\u4e2d\u7528Java\u5199\u7684\u5b58\u50a8\u8fc7\u7a0b\u65b9\u6cd5\u4e2d\uff0c\u5982\u679c\u8bbf\u95ee\u4e86\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\u3001\u8fde\u63a5\u4e86\u7f51\u7edc\u3001\u6216\u8005\u8fd0\u884c\u7cfb\u7edf\u547d\u4ee4\uff0c\u5c31\u5fc5\u987b\u4e3a\u6267\u884c\u8be5\u8fc7\u7a0b\u7684\u6a21\u5f0f\u8d4b\u4e88\u76f8\u5e94\u7684\u6743\u9650\u3002\u4e0d\u7136\u6267\u884c\u8be5\u5b58\u50a8\u8fc7\u7a0b\u5c31\u4f1a\u62a5\u65e0\u8be5\u64cd\u4f5c\u6743\u9650\u7684\u5f02\u5e38\u3002<\/p>\n<br\/>\n\u672c\u6587\u6240\u9762\u5bf9\u7684\u662f\u54ea\u4e9b\u4f1a\u7528Java\u5199\u5b58\u50a8\u8fc7\u7a0b\u7684\u670b\u53cb\uff0c\u53ef\u80fd\u4f60\u4eec\u5728\u7528Java\u5199Oracle\u7684\u5b58\u50a8\u8fc7\u7a0b\u4e5f\u9047\u5230\u8fc7\u7c7b\u4f3c\u95ee\u9898\u3002\u5e0c\u671b\u5bf9\u4ed6\u4eec\u80fd\u6709\u6240\u5e2e\u52a9\u3002\u5173\u4e8e\u5982\u4f55\u7528Java\u5199Oracle\u7684\u5b58\u50a8\u8fc7\u7a0b\u8bf7\u53c2\u8003\u6211\u524d\u9762\u7684\u4e00\u7bc7\u6587\u7ae0\uff1a<a href=\"https:\/\/yanbin.blog\/oracle8i-develop-java-procedure\/\">Oracle8i\u4e2d\u4f7f\u7528Java\u8bed\u8a00\u6765\u5f00\u53d1\u5b58\u50a8\u8fc7\u7a0b<\/a>\uff0c\u5176\u4e2d\u6709\u76f8\u5e94\u7684\u4ee3\u7801\u3002"},{"title":"Oracle8i\u4e2d\u4f7f\u7528Java\u8bed\u8a00\u6765\u5f00\u53d1\u5b58\u50a8\u8fc7\u7a0b","link":"https:\/\/yanbin.blog\/oracle8i-develop-java-procedure\/","pubDate":"Sun, 15 Jan 2006 22:12:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/oracle8i-develop-java-procedure\/","description":"\n\u5728Oracle8i\u4e4b\u524d\uff0c\u5f00\u53d1\u4eba\u5458\u53ea\u80fd\u4f7f\u7528PL\/SQL\u6765\u5f00\u53d1\u5b58\u50a8\u8fc7\u7a0b\u3002\u800c\u5728Oracle8i\u4e4b\u4e2d\uff0c\u4e0d\u4ec5\u53ef\u4ee5\u4f7f\u7528\u539f\u6709\u7684PL\/SQL\u5f00\u53d1\u5b58\u50a8\u8fc7\u7a0b\uff0c\u800c\u4e14\u4e5f\u53ef\u4ee5\u4f7f\u7528Java\u8bed\u8a00\u6765\u5f00\u53d1\u5b58\u50a8\u8fc7\u7a0b\u3002\u672c\u7bc7\u6587\u7ae0\u5c06\u7b80\u5355\u4ecb\u7ecd\u5173\u4e8e\u8fd9\u65b9\u9762\u7684\u77e5\u8bc6\uff0c\u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9\uff1a(\u7070\u8272\u663e\u793a\u7684\u90e8\u5206\u5728\u6b64\u5c06\u4e0d\u4f5c\u8be6\u7ec6\u4ecb\u7ecd)<\/p>\n<br\/>\n\u672c\u6587\u662f\u6211\u53c2\u8003\u7f51\u4e0a\u8d44\u6599\uff0c\u6574\u7406\u51fa\u6765\u7684\u4e00\u4efd\uff0c\u6587\u4e2d\u6240\u6709\u4ee3\u7801\u8bed\u53e5\u5747\u771f\u5b9e\u53ef\u7528\uff0c\u56e0\u53ea\u662f\u4f5c\u6d4b\u8bd5\uff0c\u6240\u4ee5\u4ee3\u7801\u672a\u8868\u73b0\u5b9e\u9645\u4e1a\u52a1\u64cd\u4f5c\u3002<br\/><br\/>\n<a href=\"#1\">\u4e00. \u5b58\u50a8\u8fc7\u7a0b\u7b80\u4ecb<\/a><br \/>"},{"title":"\u7531StringBuffer\u548cStringBuilder\u7684\u533a\u522b\u800c\u884d\u751f\u7684","link":"https:\/\/yanbin.blog\/stringbuffer-and-stringbuilder\/","pubDate":"Wed, 11 Jan 2006 10:31:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/stringbuffer-and-stringbuilder\/","description":"\n\u8ba4\u8bc6StringBuilder\u5927\u6982\u662f\u5728\u4e00\u5e74\u524d\u7684\u516b\u4e5d\u6708\u4efd\u91cc\uff0c\u8fd8\u662f\u5728JDK1.5\u4ece\u672a\u6b63\u5f0f\u53d1\u5e03\u59cb\uff0c\u4e00\u76f4\u90fd\u662f\u5173\u6ce8\u7684\u5b83\u7684\u51e0\u5927\u663e\u8457\u7279\u6027--\u6cdb\u578b\u3001\u9759\u6001\u5f15\u5165\u3001\u88c5\u62c6\u7bb1\u548c\u4e0d\u5b9a\u53c2\u7b49\uff0c\u67d0\u4e9b\u6bd4\u8f83\u7ec6\u5fae\u7684\u5dee\u522b\u5374\u6ca1\u6ce8\u610f\u5230\u3002<\/p>\n<br\/>\n\u00a0\u00a0\u00a0 \u5927\u5bb6\u90fd\u77e5\u9053\u5904\u7406\u5b57\u7b26\u4e32\u8fde\u63a5\u65f6StringBuffer\u6bd4String\u6548\u7387\u9ad8\uff0c\u56e0\u4e3a\u4ece\u7f16\u8bd1\u7684\u5b57\u8282\u7801\u4e2d\u4e5f\u53ef\u4ee5\u770b\u5230String\u7684\u76f8\u52a0\u4e5f\u662f\u8981\u8f6c\u6362\u4e3aStringBuffer\u6765\u8fdb\u884c\u7684\u3002<br\/><br\/>\n\u00a0\u00a0\u00a0 \u6bd4\u5982\u5bf9\u4e8e\u8fd9\u51e0\u53e5\u4ee3\u7801\u00a0\u00a0<span style=\"color: #ff0000;\">\u2460<\/span>String s = <span style=\"color: #0066ff;\">\"Hello\"<\/span>;\u00a0\u00a0<span style=\"color: #ff0000;\">\u2461<\/span>s=s+<span style=\"color: #0066ff;\">\" Java\"<\/span>;\u00a0\u00a0<span style=\"color: #ff0000;\">\u2462<\/span>s=s+<span style=\"color: #0066ff;\">\" World!\"<\/span>;\u00a0\u53cd\u7f16\u8bd1\u4e4b\u540e\u4ece\u5b57\u8282\u7801\u53ef\u4ee5\u770b\u51fa\u865a\u62df\u673a\u5b9e\u9645\u662f\u5982\u4f55\u5904\u7406\u7684\uff08\u5177\u4f53\u5b57\u8282\u7801\u8fd9\u91cc\u5c31\u7565\u53bb\u4e86\uff0c\u5bf9\u4e8e\u8be6\u7ec6\u5b57\u8282\u7801\u7684\u5206\u6790\u6211\u60f3\u5982\u679c\u9700\u8981\u7684\u65f6\u5019\u4ee5\u540e\u4f1a\u5355\u72ec\u5199\u4e00\u7bc7\u6765\u4ecb\u7ecd\uff09\uff1a<br \/>"},{"title":"\u5982\u4f55\u67e5\u627eJBoss\u6240\u53d1\u5e03\u7684JNDI\u8d44\u6e90","link":"https:\/\/yanbin.blog\/jboss-locate-jndi-resource\/","pubDate":"Mon, 09 Jan 2006 10:22:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jboss-locate-jndi-resource\/","description":"\nJ2EE\u5bb9\u5668\u5206\u4e3aServlet\u5bb9\u5668\u548cEJB\u5bb9\u5668\uff0c\u4f8b\u5982Tomcat\u5c31\u662f\u4e00\u4e2aServlet\u5bb9\u5668\uff0cWebLogic\uff0cWebSphere Application Server\uff0cJBoss\u5c31\u662fEJB\u5bb9\u5668\u3002\u4ed6\u4eec\u90fd\u63d0\u4f9bJNDI\u7684\u652f\u6301\uff0c\u4f60\u53ef\u4ee5\u628a\u4efb\u4f55\u8d44\u6e90\uff08\u5982DataSource\u3001JMS\u3001Queue\u3001Mail\u751a\u81f3\u662fURL\u8d44\u6e90\uff09\u90fd\u7ed1\u5b9a\u5230JNDI\u4e0a\u4e0b\u6587\u4e2d\uff0c\u8fd9\u6837\u53ef\u4ee5\u964d\u4f4e\u7ec4\u4ef6\u95f4\u7684\u8026\u5408\u6027\u3002<\/p>\n<br\/>\n\u901a\u5e38\u7684Servlet\u5bb9\u5668\uff08\u5982Tomcat\u3001Resin\uff09\u4e2d\u7684JNDI\u8d44\u6e90\u53ea\u80fd\u88ab\u5bb9\u5668\u4e2d\u7684\u7a0b\u5e8f\u67e5\u5230\u3001\u4f7f\u7528\uff0c\u800c\u4e0d\u80fd\u5728\u5bb9\u5668\u5916\u5f15\u7528\uff0c\u4e5f\u5c31\u662f\u53ea\u80fd\u88ab\u5bb9\u5668\u6240\u4ee5\u8fdb\u7a0b\u6240\u7528\uff1b\u800cEJB\u5bb9\u5668\u4e2d\u7684JNDI\u8d44\u6e90\u5374\u53ef\u4ee5\u5728\u5bb9\u5668\u5916\uff0c\u6216\u8005\u662f\u53e6\u4e00\u53f0\u673a\u5668\u4e0a\u7684\u7a0b\u5e8f\u67e5\u627e\u5230\u5e76\u900f\u660e\u4f7f\u7528\uff0c\u56e0\u4e3aEJB\u672c\u6765\u5c31\u662f\u8981\u4e3a\u5206\u5e03\u5f0f\u670d\u52a1\u7684\u3002EJB\u5bb9\u5668\u4e2d\u7684JNDI\u8d44\u6e90\u53ef\u4ee5\u901a\u8fc7JNP\u3001RMI\u3001IIOP\u3001T3\u6216\u6587\u4ef6\u5f15\u7528\u7684\u65b9\u5f0f\u53d1\u5e03\u51fa\u53bb\u3002"},{"title":"\u4e00\u4e2a\u5207\u5b9e\u53ef\u7528\u7684CheckStyle\u7684build.xml\u6587\u4ef6","link":"https:\/\/yanbin.blog\/checkstyle-build-xml\/","pubDate":"Wed, 04 Jan 2006 09:13:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/checkstyle-build-xml\/","description":"\n\u7f51\u4e0a\u627e\u4e86\u597d\u4e9b\u4e2a\u5173\u4e8eCheckStyle\u7684\u6587\u7ae0\u90fd\u662f\u6284\u6284\u6284\u4e00\u5927\u901a\uff0c\u5374\u6ca1\u6709\u4e00\u4e2abuild.xml\u7740\u5b9e\u53ef\u8fd0\u884c,<br \/>\n\u5728\u8fd9\u91cc\u6211\u4e5f\u662f\u53c2\u8003\u7740\u4e00\u7f16\uff0c\u6539\u6539\u6210\u80fd\u6210\u529f\u8fd0\u884c\u5e76\u80fd\u751f\u6210\u6b63\u786e\u62a5\u544a\uff0c\u53d1\u9001 Email \u7684build.xml\u6587\u4ef6<\/p>\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"ni\">&amp;lt;<\/span>?xml version=&#34;1.0&#34; encoding=&#34;gb2312&#34;?&gt;\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"c\">&lt;!-- ANT make file checkstype --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"c\">&lt;!-- See &lt;a href=&#34;http:\/\/jakarta.apache.org\/ant&#34; data-mce-href=&#34;http:\/\/jakarta.apache.org\/ant&#34;&gt;http:\/\/jakarta.apache.org\/ant&lt;\/a&gt; for info about ANT --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"c\">&lt;!-- \u7f51\u4e0a\u4e0b\u6765\u7684CheckStyle\u89e3\u538b\u5728d:\/javalib\/CheckStyle\/checkstyle-4.1\u4e2d --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"nt\">&lt;project<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle&#34;<\/span> <span class=\"na\">default=<\/span><span class=\"s\">&#34;checkstyle&#34;<\/span> <span class=\"na\">basedir=<\/span><span class=\"s\">&#34;d:\/javalib\/CheckStyle\/checkstyle-4.1&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- CheckStyle\u914d\u7f6e,\u8fd9\u91cc\u4f60\u66ff\u6362\u6210\u4f60\u5b9e\u9645\u7684\u73af\u5883 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;project.docs.dir&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${basedir}\/contrib&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u6e90\u4ee3\u7801\u7684\u76ee\u5f55\u662fe:\/eclipseworkspace\/talupdate\/src --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;project.src.dir&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;e:\/eclipseworkspace\/talupdate\/src&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u5efa\u7acb\u4e86build\u76ee\u5f55\u5728\u5176\u4e2d\u751f\u6210\u62a5\u544a --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;project.checkstyleReport.dir&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${basedir}\/build&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle.jar&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${basedir}\/checkstyle-all-4.1.jar&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u4f7f\u7528SUN\u7684\u4ee3\u7801\u89c4\u8303\uff0c\u53ef\u66ff\u6362\u6210\u516c\u53f8\u81ea\u5df1\u7684\u89c4\u8303 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle.config&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${basedir}\/sun_checks.xml&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle.report.style&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${project.docs.dir}\/checkstyle-noframes.xsl&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle.result&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${project.checkstyleReport.dir}\/checkstyle_result.xml&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle.report&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${project.checkstyleReport.dir}\/checkstyle_report.html&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">25<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u5b9a\u4e49\u53d1\u9001\u90ae\u4ef6\u5217\u8868 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">26<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;mail.list&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;(User1)user1@xxx.com,(User2)user2@xxx.com&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">27<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">28<\/span><span class=\"cl\"> <span class=\"nt\">&lt;target<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;init&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">29<\/span><span class=\"cl\"> <span class=\"nt\">&lt;tstamp\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">30<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/target&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">31<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">32<\/span><span class=\"cl\"> <span class=\"c\">&lt;!--CheckStyle\u811a\u6b65--&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">33<\/span><span class=\"cl\"> <span class=\"nt\">&lt;taskdef<\/span> <span class=\"na\">resource=<\/span><span class=\"s\">&#34;checkstyletask.properties&#34;<\/span> <span class=\"na\">classpath=<\/span><span class=\"s\">&#34;${checkstyle.jar}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">34<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">35<\/span><span class=\"cl\"> <span class=\"nt\">&lt;target<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle&#34;<\/span> <span class=\"na\">depends=<\/span><span class=\"s\">&#34;init&#34;<\/span> <span class=\"na\">description=<\/span><span class=\"s\">&#34;\u5bf9java\u6e90\u4ee3\u7801\u8fdb\u884c\u68c0\u67e5\u5e76\u4ea7\u751f\u68c0\u67e5\u62a5\u544a. &#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">36<\/span><span class=\"cl\"> <span class=\"nt\">&lt;checkstyle<\/span> <span class=\"na\">config=<\/span><span class=\"s\">&#34;${checkstyle.config}&#34;<\/span> <span class=\"na\">failOnViolation=<\/span><span class=\"s\">&#34;false&#34;<\/span> <span class=\"na\">failureProperty=<\/span><span class=\"s\">&#34;checkstyle.failure&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">37<\/span><span class=\"cl\"> <span class=\"nt\">&lt;formatter<\/span> <span class=\"na\">type=<\/span><span class=\"s\">&#34;xml&#34;<\/span> <span class=\"na\">tofile=<\/span><span class=\"s\">&#34;${checkstyle.result}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">38<\/span><span class=\"cl\"> <span class=\"nt\">&lt;fileset<\/span> <span class=\"na\">dir=<\/span><span class=\"s\">&#34;${project.src.dir}&#34;<\/span> <span class=\"na\">includes=<\/span><span class=\"s\">&#34;**\/*.java&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">39<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/checkstyle&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">40<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">41<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u751f\u6210\u62a5\u544a,\u5176\u683c\u5f0f\u53d6\u51b3\u4e8e${checkstyle.report.style} --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">42<\/span><span class=\"cl\"> <span class=\"nt\">&lt;style<\/span> <span class=\"na\">in=<\/span><span class=\"s\">&#34;${checkstyle.result}&#34;<\/span> <span class=\"na\">out=<\/span><span class=\"s\">&#34;${checkstyle.report}&#34;<\/span> <span class=\"na\">style=<\/span><span class=\"s\">&#34;${checkstyle.report.style}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">43<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/target&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">44<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">45<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u5f53\u6709\u4e0d\u89c4\u8303\u7684\u60c5\u51b5\u53d1\u751f\u65f6\u5c06\u68c0\u67e5\u7ed3\u679c\u53d1\u9001\u5230 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">46<\/span><span class=\"cl\"> <span class=\"nt\">&lt;target<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;checkstyle-nightly&#34;<\/span> <span class=\"na\">depends=<\/span><span class=\"s\">&#34;checkstyle&#34;<\/span> <span class=\"na\">if=<\/span><span class=\"s\">&#34;checkstyle.failure&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">47<\/span><span class=\"cl\"> <span class=\"na\">description=<\/span><span class=\"s\">&#34;Sends email if checkstyle detected code conventions violations.&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">48<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">49<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u5982\u679c\u90ae\u4ef6\u670d\u52a1\u5668\u9700\u8981\u9a8c\u8bc1\uff0c\u5219\u52a0\u4e0a user \u548c password \u5c5e\u6027 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">50<\/span><span class=\"cl\"> <span class=\"nt\">&lt;mail<\/span> <span class=\"na\">from=<\/span><span class=\"s\">&#34;(Admin)admin@xxx.com&#34;<\/span> <span class=\"na\">tolist=<\/span><span class=\"s\">&#34;${mail.list}&#34;<\/span> <span class=\"na\">mailhost=<\/span><span class=\"s\">&#34;mail.xxx.com&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">51<\/span><span class=\"cl\"> <span class=\"na\">subject=<\/span><span class=\"s\">&#34; checkstyle result from project reports&#34;<\/span> <span class=\"na\">files=<\/span><span class=\"s\">&#34;${checkstyle.report}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">52<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/target&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">53<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/project&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n&lt;\u7ee7\u7eed\u8865\u5145\u5185\u5bb9&gt;"},{"title":"\u4f7f\u7528EMMA\u751f\u6210\u4ee3\u7801\u6d4b\u8bd5\u8986\u76d6\u7387\u62a5\u544a\u7b80\u5355\u5e94\u7528","link":"https:\/\/yanbin.blog\/emma-code-coverage-report\/","pubDate":"Wed, 04 Jan 2006 08:41:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/emma-code-coverage-report\/","description":"\nJava\u6d4b\u8bd5\u4ee3\u7801\u8986\u76d6\u7387\u5de5\u5177\u6709Clover, Jcoverage\u548cEmma\u7b49,\u5176\u4e2d\u53ea\u6709Emma\u624d\u7b97\u662f\u5f7b\u5e95\u514d\u8d39\u5f00\u6e90\u7684\uff0c\u7528\u8d77\u6765\u4e5f\u6bd4\u8f83\u65b9\u4fbf\u3002<br \/>\n\u800cJcoverage\u4f7f\u7528\u8d77\u6765\u5c31\u6709\u4e9b\u7e41\u7410\uff0c\u5fc5\u987b\u4e00\u6b65\u6b65\u6309\u7167\u89c4\u5b9a\u7684\u65b9\u5f0f\u8d70\uff0c\u6b65\u9aa4\u4e3a\u00a0<span style=\"color: #0000ff;\">debug\u65b9\u5f0fcompile-&gt;instrument-&gt;test-&gt;coverage<\/span>\u3002<\/p>\n<br\/>\n\u4e0b\u9762\u5c06\u7b80\u5355\u4ecb\u7ecdemma\u7684\u4f7f\u7528\uff0c\u4ee5\u4e0b\u65b9\u6cd5\u544a\u8bc9\u4f60\u5982\u4ee5\u4ee5\u547d\u4ee4\u7684\u65b9\u5f0f\u6765\u751f\u6210\u4ee3\u7801\u6d4b\u8bd5\u8986\u76d6\u7387\uff0c\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u5199\u6210 Ant \u4efb\u52a1\u7684\u65b9\u5f0f\uff0c\u8fd9\u5c31\u8981\u6c42\u81ea\u5df1\u5199\u51e0\u4e2a Ant \u7528\u7684Task\u7c7b\uff0c\u5176\u5b9e\u4e5f\u4e0d\u96be\u3002<br\/><br\/>\nemma\u7684\u4e0b\u8f7d\u5730\u5740\u662f\uff1a<a href=\"http:\/\/emma.sourceforge.net\/downloads.html\">http:\/\/emma.sourceforge.net\/downloads.html<\/a>"},{"title":"\u7528Ant\u8fdb\u884c\u5355\u5143\u6d4b\u8bd5\u5e76\u751f\u6210\u6d4b\u8bd5\u62a5\u544a","link":"https:\/\/yanbin.blog\/ant-junit-report\/","pubDate":"Tue, 03 Jan 2006 23:33:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ant-junit-report\/","description":"\n\u5173\u952eAnt\u7684build\u6587\u4ef6\u5982\u4e0b(\u5df2\u52a0\u4e0a\u6bd4\u8f83\u8be6\u7ec6\u7684\u8bf4\u660e)<\/p>\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"cp\">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"nt\">&lt;project<\/span> <span class=\"na\">basedir=<\/span><span class=\"s\">&#34;.&#34;<\/span> <span class=\"na\">default=<\/span><span class=\"s\">&#34;main&#34;<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;excute TestCase and build test report&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u6d4b\u8bd5\u62a5\u544a\u5b58\u653e\u76ee\u5f55 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"> <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;build.reports.dir&#34;<\/span> <span class=\"na\">value=<\/span><span class=\"s\">&#34;${basedir}\/report&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"> <span class=\"nt\">&lt;target<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;main&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u5220\u9664\u6d4b\u8bd5\u62a5\u544a\u6570\u636e\uff0c\u91cd\u65b0\u751f\u6210 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"> <span class=\"nt\">&lt;delete&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"> <span class=\"nt\">&lt;fileset<\/span> <span class=\"na\">dir=<\/span><span class=\"s\">&#34;${basedir}\/report&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"> <span class=\"nt\">&lt;include<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;*.*&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/fileset&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/delete&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"> <span class=\"nt\">&lt;junit<\/span> <span class=\"na\">fork=<\/span><span class=\"s\">&#34;yes&#34;<\/span> <span class=\"na\">printsummary=<\/span><span class=\"s\">&#34;true&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u751f\u6210\u7684class\u76ee\u5f55\u4ee5\u53ca\u6267\u884cTestCase\u6240\u4f9d\u8d56\u7684\u5e93\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"c\"> \u65e0\u8bba\u662f\u7528&lt;test&gt;\u8fd8\u662f&lt;batchtest&gt;\u90fd\u8981\u8fd9\u4e2a\u914d\u7f6e --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"> <span class=\"nt\">&lt;classpath<\/span> <span class=\"na\">location=<\/span><span class=\"s\">&#34;${basedir}\/bin&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u751f\u6210\u62a5\u544a\u6570\u636e\u7684\u683c\u5f0f\uff0c\u53ef\u80fd\u591a\u4e2a\uff0c\u652f\u6301xml\/brief\/plain --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"> <span class=\"nt\">&lt;formatter<\/span> <span class=\"na\">type=<\/span><span class=\"s\">&#34;xml&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"> <span class=\"nt\">&lt;formatter<\/span> <span class=\"na\">type=<\/span><span class=\"s\">&#34;brief&#34;<\/span> <span class=\"na\">usefile=<\/span><span class=\"s\">&#34;false&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u53ef\u4ee5\u7528&lt;test&gt;\u4e5f\u53ef\u4ee5\u7528&lt;batchtest&gt;,\u4f46\u4e24\u79cd\u7684\u8bbe\u7f6e\u6709\u4e00\u4e9b\u533a\u522b\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"c\"> \u4ee5\u4e0b&lt;test&gt;\u548c&lt;batchtest&gt;\u4e09\u79cd\u5f62\u5f0f\u7528\u67d0\u4e00\u79cd\u5c31\u53ef\u4ee5\u7684 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- name\u6307\u5b9aClass\u7684\u540d\u79f0\uff0c\u5982CatTest\u6216com.unmi.CatTest --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"> <span class=\"nt\">&lt;test<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;CatTest&#34;<\/span> <span class=\"na\">todir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u6ce8\u610f\u5176\u4e2d&lt;fileset&gt;\u7684dir\u5c5e\u6027\u53ca&lt;include&gt;\u7684name\u5c5e\u6027\u6307\u4ee3\u7684\u610f\u4e49 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\"> <span class=\"nt\">&lt;batchtest<\/span> <span class=\"na\">todir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">25<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- dir\u5c5e\u6027\u6307\u5b9aTestCase\u7c7b\u7684\u6e90\u4ee3\u7801\u7684\u8def\u5f84 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">26<\/span><span class=\"cl\"> <span class=\"nt\">&lt;fileset<\/span> <span class=\"na\">dir=<\/span><span class=\"s\">&#34;${basedir}\/src&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">27<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- name\u5c5e\u6027\u6307\u5b9aTestCase\u6e90\u6587\u4ef6\u89c4\u5219 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">28<\/span><span class=\"cl\"> <span class=\"nt\">&lt;include<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;**\/*Test.java&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">29<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/fileset&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">30<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/batchtest&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">31<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u4e0a\u9762\u7684&lt;batchtest&gt;\u8fd8\u53ef\u4ee5\u5199\u6210\u5982\u4e0b\u5f62\u5f0f\uff0c&lt;fileset&gt;\u6309\u6307\u5b9a\u4e3aclass\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">32<\/span><span class=\"cl\"><span class=\"c\"> \u6ce8\u610f\u5176\u4e2d&lt;fileset&gt;\u7684dir\u5c5e\u6027\u53ca&lt;include&gt;\u7684name\u5c5e\u6027\u6307\u4ee3\u7684\u610f\u4e49 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">33<\/span><span class=\"cl\"> <span class=\"nt\">&lt;batchtest<\/span> <span class=\"na\">todir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">34<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- dir\u5c5e\u6027\u6307\u5b9aTestCase\u7c7b\u7684\u8def\u5f84 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">35<\/span><span class=\"cl\"> <span class=\"nt\">&lt;fileset<\/span> <span class=\"na\">dir=<\/span><span class=\"s\">&#34;${basedir}\/bin&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">36<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- name\u5c5e\u6027\u6307\u5b9aTestCase\u7c7b\u6587\u4ef6\u89c4\u5219 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">37<\/span><span class=\"cl\"> <span class=\"nt\">&lt;include<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;**\/*Test.class&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">38<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/fileset&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">39<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/batchtest&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">40<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/junit&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">41<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u7528\u6267\u884c\u4ee5\u4e0aTestCase\u751f\u6210\u7684\u62a5\u544a\u6570\u636e\u751f\u6210\u6d4b\u8bd5\u62a5\u544a --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">42<\/span><span class=\"cl\"> <span class=\"nt\">&lt;junitreport<\/span> <span class=\"na\">todir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">43<\/span><span class=\"cl\"> <span class=\"nt\">&lt;fileset<\/span> <span class=\"na\">dir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">44<\/span><span class=\"cl\"> <span class=\"nt\">&lt;include<\/span> <span class=\"na\">name=<\/span><span class=\"s\">&#34;TEST-*.xml&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">45<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/fileset&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">46<\/span><span class=\"cl\"> <span class=\"c\">&lt;!-- \u6307\u5b9a\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u683c\u5f0fframes\/noframes,\u548c\u62a5\u544a\u5b58\u653e\u76ee\u5f55 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">47<\/span><span class=\"cl\"> <span class=\"nt\">&lt;report<\/span> <span class=\"na\">format=<\/span><span class=\"s\">&#34;frames&#34;<\/span> <span class=\"na\">todir=<\/span><span class=\"s\">&#34;${build.reports.dir}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">48<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/junitreport&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">49<\/span><span class=\"cl\"> <span class=\"nt\">&lt;\/target&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">50<\/span><span class=\"cl\"><span class=\"nt\">&lt;\/project&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u4e0b\u9762\u4ee5\u540e\u4e5f\u4f1a\u52a0\u4e0a\u6d4b\u8bd5\u62a5\u544a\u7684\u8d34\u56fe\u7684\u3002"},{"title":"\u7528JCoverage\u751f\u6210\u6d4b\u8bd5\u8986\u76d6\u7387\u62a5\u544a(\u4e8c build\u6587\u4ef6)","link":"https:\/\/yanbin.blog\/jcoverage-report-build-file\/","pubDate":"Tue, 03 Jan 2006 10:45:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jcoverage-report-build-file\/","description":"\n\u4e0b\u9762\u7684\u90a3\u4e00\u5927\u6bb5build.xml\u6587\u4ef6\u5185\u5bb9\u4e3b\u8981\u4e5f\u662f\u53c2\u8003\u4e0b\u8f7d\u8fc7\u6765\u7684JCoverage\u4e2d\u7684\u4e00\u4e2a\u4f8b\u5b50\u4e2d\u7684build\u6587\u4ef6\uff0c\u53ea\u662f\u7a0d\u7a0d\u4f5c\u4e86\u70b9\u4fee\u6539\uff0c\u7528\u4e0b\u9762\u8fd9\u4e2abuild\u6587\u4ef6\u524d\uff0c\u9700\u8981\u628aJCoverage\u7528\u5230\u7684 jar (\u4e0b\u8f7d\u7684JCoverage\u4e2d\u90fd\u6709) \u5305\u62f7\u5230\u5de5\u7a0b\u76ee\u5f55\u4e0blib\u5b50\u76ee\u5f55\u4e2d\uff0c\u8bf7\u6ce8\u610f\u7406\u89e3\u5176\u4e2d\u7684\u6ce8\u89e3\uff0c\u4ee5\u540e\u5fc5\u8981\u65f6\u4f1a\u52a0\u4e0a\u66f4\u8be6\u7ec6\u7684\u4e2d\u6587\u6ce8\u91ca\u3002"},{"title":"\u7528JCoverage\u751f\u6210\u6d4b\u8bd5\u8986\u76d6\u7387\u62a5\u544a(\u4e00 \u4ecb\u7ecd)","link":"https:\/\/yanbin.blog\/jcoverage-report-introduction\/","pubDate":"Tue, 03 Jan 2006 09:45:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jcoverage-report-introduction\/","description":"\nJCoverage\u4e0d\u662f\u514d\u8d39\u7684(\u5bf9\u5546\u4e1a\u4e0d\u662f\u514d\u8d39,\u5bf9open source\u662f\u514d\u8d39\u7684\n<br\/><br\/>\nJCoverage\u4e3b\u9875:<a href=\"http:\/\/www.jcoverage.com\">http:\/\/www.jcoverage.com<\/a>\u00a0<br\/><br\/>\nJCoverage\u7684\u5141\u8bb8\u9700\u8981JUnit\u548cLog4j\u3001bcel\u3001jakarta-oro\u3001getopt\u7c7b\u5e93,\u8fd9\u4e9b\u7c7b\u5e93\u5728\u4e0b\u8f7d\u7684JCoverage\u4e2d\u90fd\u5305\u542b\u4e86,JCoverage\u4e3b\u8981\u4e5f\u662f\u548cAnt\u7ed3\u5408\u5728\u4e00\u8d77\u4f7f\u7528,\u00a0<br\/><br\/>\n\u6ce8\u610f\u4e8b\u9879:\u00a0<br\/><br\/>\n1 : \u521d\u59cb\u5316\u662f\u6700\u597d\u5220\u9664\u5f53\u524d\u76ee\u5f55\u4e0b\u7684jcoverage.ser\u6587\u4ef6,\u8fd9\u4e2a\u6587\u4ef6\u5c31\u662f\u6d4b\u8bd5\u7684\u7ed3\u679c,\u5982\u679c\u5176\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u627e\u5230\u8fd9\u4e2a\u6587\u4ef6\u5c06\u4e0d\u4f1a\u8fdb\u884c\u6d4b\u8bd5,\u6216\u8005\u91cd\u65b0\u6d4b\u8bd5\u00a0<br\/><br\/>\n2 : \u5728\u8fdb\u884cinstrument\u65f6,\u4e00\u5b9a\u8981\u4fdd\u8bc1\u5176class\u662fdebug\u6a21\u5f0f\u4e0b\u7f16\u8bd1\u7684,\u5426\u5219\u5c06\u4e0d\u80fd\u6ce8\u5165jcoverage\u6307\u4ee4\u5230\u88ab\u6d4b\u8bd5\u7c7b\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e2d,\u5efa\u8bae\u4ece\u65b0\u7528debug\u6a21\u5f0f\u7f16\u8bd1\u4e00\u4e2a\u5728\u5f53\u524d\u76ee\u5f55"},{"title":"\u4f7f\u7528Ant\u8fdb\u884cssh\u548cscp\u64cd\u4f5c","link":"https:\/\/yanbin.blog\/ant-ssh-scp\/","pubDate":"Tue, 03 Jan 2006 02:41:00 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/ant-ssh-scp\/","description":"\n\u73b0\u5728\u6211\u4eec\u5b89\u88c5Linux\u7684\u65f6\u5019\u901a\u5e38\u8003\u8651\u5230\u5b89\u5168\u56e0\u7d20\uff08\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff09\u662f\u4e0d\u6253\u5f00telnet\u670d\u52a1\u7684\uff0c\u800cssh\u670d\u52a1\u662f\u6709\u7684\uff0cant\u5f88\u65e9\u5c31\u652f\u6301telnet\uff0c\u4f46\u8981\u6c42\u6211\u4eec\u5728Linux\u4e0b\u8981\u5b89\u88c5telnet-server,\u5e76\u8981\u542f\u7528\u8be5\u670d\u52a1\u3002<\/p>\n<br\/>\n\u8fd8\u597d\u81eaAnt1.60\u5f00\u59cb\u652f\u6301\u4e86SSH \u53caSCP \u64cd\u4f5c\u4e86\uff0c\u65e9\u5728Ant\u4e4b\u524d\u82e5\u8981\u652f\u6301SSH\u3001SCP\u3001SFTP\u7b49\u4efb\u52a1\u5c31\u5fc5\u987b\u4e0b\u8f7dj2ssh\u7684j2ssh-ant.jar\u548cj2ssh-core.jar\uff08\u5728<a href=\"http:\/\/www.sourceforge.net\">http:\/\/www.sourceforge.net<\/a>\u7684j2ssh\u4e0b\u6709\u4e0b\u8f7d\uff09\u3002\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528Ant\u63d0\u4f9b\u7684Sshexec\u548cscp\u4efb\u52a1\uff0c\u7531$ANT_HOME\/lib\/ant-jsch.jar\u63d0\u4f9b\u652f\u6301\uff0c\u4f46\u662f\u540c\u6837\u4f60\u4e5f\u8981\u5728<a href=\"http:\/\/www.jcraft.com\/jsch\/index.html\">http:\/\/www.jcraft.com\/jsch\/index.html<\/a>\u4e0b\u8f7d\u4e00\u4e2a\u4f9d\u8d56\u5305jsch-0.1.24.jar(\u6587\u4ef6\u540d\u56e0\u7248\u672c\u800c\u4e0d\u540c)\uff0cjsch\u540c\u6837\u4e5f\u662f<a href=\"http:\/\/www.sourceforge.net\">http:\/\/www.sourceforge.net<\/a>\u4e0b\u7684\u4e00\u4e2a\u9879\u76ee\u3002<br\/><br\/>\n\u4f60\u9700\u8981\u628a\u4e0b\u8f7d\u7684jsch-0.1.24\u62f7\u8d1d\u5230$ANT_HOME\/lib\u4e0b\uff0c\u5982\u679c\u662fEclipse\u4e0b\u7684Ant\u73af\u5883\u5fc5\u987b\u5728Window-&gt;Preferences-&gt;Ant-&gt;Runtime-&gt;Classpath\u4e2d\u52a0\u5165jsch-0.1.24\u3002"}]}}