{
  "version": "https://jsonfeed.org/version/1", 
  "title": "Java", 
  "description": "Sun \u516c\u53f8\u53d1\u660e\uff0c\u88ab\u5e7f\u6cdb\u4f7f\u7528\u7684\u4e00\u95e8\u7f16\u7a0b\u8bed\u8a00\u3002", 
  "home_page_url": "https://www.v2ex.com/go/java", 
  "feed_url": "https://www.v2ex.com/feed/java.json", 
  "icon": "https://cdn.v2ex.com/navatar/03af/dbd6/63_large.png?m=1644490200", 
  "favicon": "https://cdn.v2ex.com/navatar/03af/dbd6/63_normal.png?m=1644490200", 
  "items": [
    {
      "author": {
        "url": "https://www.v2ex.com/member/allyn", 
        "name": "allyn", 
        "avatar": "https://cdn.v2ex.com/avatar/60ba/ce47/229916_large.png?m=1494318727"
      }, 
      "url": "https://www.v2ex.com/t/1203944", 
      "date_modified": "2026-04-07T03:01:55+00:00", 
      "content_html": "<p>\u7531\u4e8e ai agent \u7684\u7f18\u6545\uff0c\u9879\u76ee\u4e0d\u5f97\u4e0d\u8fc1\u79fb\u5230 wsl \u5185\u90e8\uff0c\u4f46\u662f\u8fc1\u79fb\u5230 wsl \u540e\u95ee\u9898\u5b9e\u5728\u592a\u591a\u4e86\uff0c\u89e3\u51b3\u4e00\u4e2a\u53c8\u6765\u4e00\u4e2a\uff0c\u5bfc\u81f4\u4e0d\u592a\u6709\u4fe1\u5fc3\u4f7f\u7528\uff0c\u6709\u6ca1\u6709\u597d\u70b9\u7684\u89e3\u51b3\u65b9\u6848\uff1f</p>\n<p>\u95ee\u9898 1\uff1a\n\u4f7f\u7528 intellij idea \u542f\u52a8 java \u7a0b\u5e8f\u7aef\u53e3\u5360\u7528\u95ee\u9898\uff08 jmx \uff09\uff0c\u5728 wsl \u4e2d\u6ca1\u6709\u627e\u5230\u5230 jmx \u5360\u7528\u7684\u7aef\u53e3\uff0c\u4f46\u662f\u53c8\u8bf4\u5360\u7528\u4e86\uff0c\u4e0d\u77e5\u9053\u4ec0\u4e48\u539f\u56e0\uff0c\u76f4\u63a5\u66b4\u529b\u5173\u95ed jmx \uff0c\u89e3\u51b3\u529e\u6cd5\uff1a\u5173\u95ed jmx</p>\n<p>\u95ee\u9898 2\uff1a\n\u5728 wsl \u4e2d\u542f\u52a8\u672c\u5730\u7aef\u53e3\u542f\u52a8 8888 \uff0clocalhost \u80fd\u8bbf\u95ee\uff0c\u5c40\u57df\u7f51\u4e0d\u80fd\u8bbf\u95ee\uff0c\u539f\u56e0\u662f wsl \u9632\u706b\u5899\u95ee\u9898\uff0c\u89e3\u51b3\u529e\u6cd5\uff1a\u4f7f\u7528 powershell \u7ba1\u7406\u5458\u6267\u884c\u547d\u4ee4</p>\n<pre><code>Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow\n</code></pre>\n<p>\u95ee\u9898 3\uff1a\n\u7a0b\u5e8f\u7ec8\u4e8e\u542f\u52a8\u8d77\u6765\u4e86\uff0c\u7ed3\u679c\u65e0\u6cd5\u4f7f\u7528 java debug \u52a8\u6001\u66f4\u6539\u4ee3\u7801\uff0c\u4e5f\u65e0\u6cd5\u8fdb\u5165\u65ad\u70b9\uff0cjrebel \u4e5f\u65e0\u6cd5\u4f7f\u7528\u3002\n\u539f\u56e0\u53ef\u80fd\u662f\uff1a</p>\n<pre><code>java.lang.IllegalAccessException: Class com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader can not access a member of class org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition with modifiers \"public\"\n\tat sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)\n\tat java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)\n\tat java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)\n\tat java.lang.reflect.Method.invoke(Method.java:491)\n\tat com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getAnnotationMetadataClassName(SpringBeanDefinitionLoader.java:182)\n\tat com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getBeanClassName(SpringBeanDefinitionLoader.java:121)\n\tat com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getAllBeanDefinitions(SpringBeanDefinitionLoader.java:40)\n\tat org.springframework.context.event.ContextRefreshedEvent.&lt;init&gt;(ContextRefreshedEvent.java:37)\n\tat org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)\n\tat org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)\n\tat org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)\n\tat org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)\n\tat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:338)\n</code></pre>\n<p>\u8fd9\u4e2a\u5230\u76ee\u524d\u4e3a\u6b62\u8fd8\u6ca1\u6709\u89e3\u51b3\u3002</p>\n<p>\u7efc\u4e0a\u6240\u8ff0\uff0cwsl \u5f00\u53d1 java \u7a0b\u5e8f\u5b9e\u5728\u662f\u592a\u96be\u4e86\uff0c\u89e3\u51b3\u4e00\u4e2a\u53c8\u6765\u4e00\u4e2a\uff0c\u4e0a\u9762\u7684\u95ee\u9898\u5927\u5bb6\u6709\u4ec0\u4e48\u89e3\u51b3\u65b9\u6cd5\u5417\uff1f</p>\n", 
      "date_published": "2026-04-07T02:59:30+00:00", 
      "title": "\u5173\u4e8e\u5728 wsl \u4e2d\u4f7f\u7528 idea \u8fdb\u884c Java \u5f00\u53d1\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1203944"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Yum097", 
        "name": "Yum097", 
        "avatar": "https://cdn.v2ex.com/gravatar/9c0915b2c98451d329559d2caa965e0e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1202334", 
      "title": "\u6c42\u52a9\uff0c Fortify \u6f0f\u626b\u95ee\u9898\u89e3\u51b3", 
      "id": "https://www.v2ex.com/t/1202334", 
      "date_published": "2026-03-30T13:35:44+00:00", 
      "content_html": "<p>\u6700\u8fd1\u771f\u662f\u88ab\u7532\u65b9\u7684\u6f0f\u6d1e\u626b\u63cf\u6574\u574f\u4e86\uff0c\u8981\u6c42 0 \u98ce\u9669\nHeader Manipulation \u3001Path Manipulation \u3001Often Misused: File Upload \u8fd9\u4e9b\u95ee\u9898\u6574\u6539\u4e86\u4e94\u516d\u8f6e\u4e86\uff0c\u4f9d\u65e7\u4e0d\u901a\u8fc7\uff0c\u6709\u5565\u6bd4\u8f83\u597d\u7684\u65b9\u6848\u5417</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/CloudSen", 
        "name": "CloudSen", 
        "avatar": "https://cdn.v2ex.com/avatar/861d/e780/426838_large.png?m=1715405179"
      }, 
      "url": "https://www.v2ex.com/t/1201597", 
      "title": "\u5fae\u4fe1 ClawBot \u548c\u4f01\u5fae AIBot \u7684 Java SDK", 
      "id": "https://www.v2ex.com/t/1201597", 
      "date_published": "2026-03-27T06:24:48+00:00", 
      "content_html": "<p>\u56e0\u4e3a\u4e2a\u4eba\u7528\u7684\u662f Java \u7684\u81ea\u7814 agent \uff0c\u5b98\u65b9\u53c8\u6ca1\u63d0\u4f9b java \u76f8\u5173\u7684 sdk \u3002\u56e0\u6b64\u987a\u624b\u6839\u636e\u5b98\u65b9 npm \u5305\u548c\u6587\u6863\u5c01\u88c5\u4e86\u4e00\u4e0b\uff0c\u6b22\u8fce\u4f7f\u7528\u3002<br/>\n\u4e8c\u5408\u4e00\u7684 SDK\uff1a  </p>\n<ol>\n<li>\u57fa\u4e8e WebSocket \u957f\u8fde\u63a5\u534f\u8bae\u7684\u4f01\u4e1a\u5fae\u4fe1 AI Bot Java SDK  </li>\n<li>\u57fa\u4e8e\u4e8c\u7ef4\u7801\u767b\u5f55\u3001\u957f\u8f6e\u8be2\u3001CDN \u534f\u8bae\u5c01\u88c5\u7684\u5fae\u4fe1 ClawBOT Java SDK</li>\n</ol>\n<p>\u5177\u4f53\u89c1\uff1a<br/>\n<a href=\"https://github.com/CloudSen/wx-aibot-java-sdk\" rel=\"nofollow\">https://github.com/CloudSen/wx-aibot-java-sdk</a><br/>\n\u6216<br/>\n<a href=\"https://gitee.com/CloudSen/wx-aibot-java-sdk\" rel=\"nofollow\">https://gitee.com/CloudSen/wx-aibot-java-sdk</a></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yuhangch", 
        "name": "yuhangch", 
        "avatar": "https://cdn.v2ex.com/avatar/0cc7/3790/467934_large.png?m=1771896123"
      }, 
      "url": "https://www.v2ex.com/t/1201569", 
      "date_modified": "2026-03-27T04:53:42+00:00", 
      "content_html": "<p>.net &gt;&gt; java/ webpack &gt;&gt; vite(\u987a\u5e26\u7740)</p>\n<p>\u5927\u65b9\u5411\u662f springboot/\u4eba\u5927\u91d1\u4ed3(postgresql)</p>\n<p>\u4e3b\u8981\u662f\u4e1a\u52a1\u5c42\u9762\uff1a</p>\n<p>ORM/\u6743\u9650\u63a7\u5236/\u8f7b\u91cf OA/\u591a\u79df\u6237\uff08\u53ef\u80fd\u8fd8\u6d89\u53ca\u4e1a\u52a1\u5b9a\u5236\uff09 \u90fd\u6709\u4ec0\u4e48\u9009\u9879\uff1f</p>\n<p>\u4e4b\u524d\u4e86\u89e3\u8fc7 renren \uff0c\u770b\u8fc7\u4ee3\u7801\u611f\u89c9\u8d28\u91cf\u4e00\u822c\uff0c\u800c\u4e14\u662f MySQL native \u7684\uff0c\u6709\u70b9\u8d1f\u62c5</p>\n<p>2026 \u5e74\u5f53\u4e0b\uff0c\u8fd8\u9700\u4e0d\u9700\u8981\u627e\u6b64\u7c7b\u6846\u67b6\uff0c\u8fd8\u662f\u76f4\u63a5 Vibe coding \uff1f</p>\n<p>\u5982\u679c\u662f vibe coding \uff0c\u4e5f\u8981\u6709\u4e2a\u53c2\u8003\u7684\u67b6\u6784\uff0c\u6211\u6c34\u5e73\u6709\u9650\u95ee\u95ee\u5927\u5bb6</p>\n<p>\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014</p>\n<p>\u5173\u4e8e\u524d\u7aef\uff0c\u76ee\u524d\u5fc3\u4eea TDesign \uff0c\u6709\u6ca1\u6709\u751f\u4ea7\u6df1\u5ea6\u7528\u8fc7\u7684 V \u53cb\uff0c\u6709\u6ca1\u6709\u5751\uff1f</p>\n", 
      "date_published": "2026-03-27T04:52:54+00:00", 
      "title": "\u8001\u4e1a\u52a1\u4fe1\u521b\u91cd\u6784\u9009\u578b\u5927\u5bb6\u6709\u5565\u5efa\u8bae", 
      "id": "https://www.v2ex.com/t/1201569"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Comyn", 
        "name": "Comyn", 
        "avatar": "https://cdn.v2ex.com/avatar/91b2/7ea7/374049_large.png?m=1758198905"
      }, 
      "url": "https://www.v2ex.com/t/1200009", 
      "title": "ai \u7f16\u7a0b\u7684\u60c5\u51b5\u5728\u4f60\u4eec\u4f7f\u7528\u4ec0\u4e48 IDE", 
      "id": "https://www.v2ex.com/t/1200009", 
      "date_published": "2026-03-21T06:45:35+00:00", 
      "content_html": "<p>idea \u592a\u91cd\u4e86</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/jarryli", 
        "name": "jarryli", 
        "avatar": "https://cdn.v2ex.com/gravatar/d81c6f7c4f9170a5c78a9813d8174c50?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1199318", 
      "title": "\u4e0b\u9762\u8fd9\u6bb5 Java \u591a\u6001\u7684\u4ee3\u7801\uff0c\u5982\u4f55\u624d\u80fd\u6539\u4e3a Go\u3001 Python \u3001JS\u3001C++\u7248\u672c?", 
      "id": "https://www.v2ex.com/t/1199318", 
      "date_published": "2026-03-18T11:07:44+00:00", 
      "content_html": "<p>\u9762\u5411\u5bf9\u8c61\u5305\u62ec\u5c01\u88c5\u3001\u7ee7\u627f\u3001\u7ec4\u5408\u3001\u591a\u6001\uff0c\u5176\u4e2d\u6700\u4e0d\u597d\u7406\u89e3\uff0c\u4e5f\u6700\u5f3a\u608d\u7684\u5c31\u662f\u591a\u6001\u3002\u53ef\u4ee5\u8bf4\u638c\u63e1\u4e86\u591a\u6001\u5c31\u638c\u63e1\u4e86\u9762\u5411\u5bf9\u8c61\u4ee5\u53ca\u8bbe\u8ba1\u6a21\u5f0f\u7684\u7cbe\u9ad3\u3002</p>\n<p>\u4f46\u662f java \u91cc\u9762\u7684\u591a\u6001\u5b9e\u73b0\u592a\u8fc7\u4e8e\u4e25\u82db\uff0c\u4ee5\u81f4\u4e8e\u5176\u4ed6\u8bed\u8a00\u90fd\u65e0\u6cd5\u5b8c\u5168\u6a21\u62df\u3002\u8bf7\u770b\u4e0b\u9762\u7684\u4ee3\u7801\uff0c\u7528\u5176\u4ed6\u8bed\u8a00\u5b9e\u73b0\u7684\u65f6\u5019\u603b\u96be\u4ee5\u8fbe\u5230\u7c7b\u4f3c\u6548\u679c\u3002</p>\n<pre><code class=\"language-java\">/*\n\u591a\u6001\uff1a\u5373\u540c\u4e00\u4e2a\u884c\u4e3a\u5177\u6709\u591a\u4e2a\u4e0d\u540c\u8868\u73b0\u5f62\u5f0f\u6216\u5f62\u6001\u7684\u80fd\u529b\u3002\n\u8868\u73b0\u5f62\u5f0f\u4e3a\uff0c\u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u73b0\u7c7b\u5b9e\u73b0\u63a5\u53e3\u65b9\u6cd5\uff0c\u5b50\u7c7b\u91cd\u5199\u62bd\u8c61\u7c7b\u65b9\u6cd5\u7b49\u3002\n\u591a\u6001\u4e09\u4e2a\u5fc5\u8981\u6761\u4ef6\uff1a\u7ee7\u627f\u3001\u91cd\u5199\u3001\u7236\u7c7b\u5f15\u7528\u6307\u5411\u5b50\u7c7b\u5bf9\u8c61\u3002\u591a\u6001\u6709\u6548\u6d88\u9664\u7c7b\u578b\u4e4b\u95f4\u7684\u8026\u5408\uff0c\u5e76\u63d0\u4f9b\u7075\u6d3b\u7684\u53ef\u6269\u5c55\u65b9\u6848\u3002\n\u672c\u4f8b\u5b50\u7b80\u5355\u6e05\u6670\u660e\u4e86\u7684 Java \u591a\u6001\uff0c\u80fd\u770b\u61c2\u8fd9\u4e2a\u4f8b\u5b50\u5c31\u61c2\u4e86\u4ec0\u4e48\u662f\u591a\u6001\u3002\n*/\n\n// \u7236\u7c7b A\nclass A {\n    public String show(D object) {\n        return (\"A and D\");\n    }\n\n    public String show(A object) {\n        return (\"A and A\");\n    }\n\n    // \u9ed8\u8ba4\u6ce8\u91ca\u6389\u3002\u53ef\u5f00\u5173\u6ce8\u91ca\u6d4b\u8bd5\u4e0b\n    // public String show(B object) {\n    // return (\"A and B\");\n    // }\n}\n\n// \u5b50\u7c7b B\nclass B extends A {\n    public String show(B object) {\n        return (\"B and B\");\n    }\n\n    public String show(A object) {\n        return (\"B and A\");\n    }\n}\n\n// \u5b59\u5b50\u7c7b C\nclass C extends B {\n}\n\n// \u5b59\u5b50\u7c7b D\nclass D extends B {\n}\n\n// \u6d4b\u8bd5\u9a8c\u8bc1\npublic class PolymorphismSimple {\n    public static void main(String[] args) {\n        // \u7236\u7c7b\u58f0\u660e\u81ea\u5df1\n        A a = new A();\n        // \u7236\u7c7b\u58f0\u660e\u5b50\u7c7b\n        A ab = new B();\n        // \u5b50\u7c7b\u58f0\u660e\u81ea\u5df1\n        B b = new B();\n        C c = new C();\n        D d = new D();\n\n        // 1) A and A \u3002b \u7684\u7c7b\u578b\u662f B \uff0c\u4e5f\u662f B \u7684\u5b9e\u4f8b\uff0cA \u91cc\u6ca1\u6709 show(B)\u65b9\u6cd5\uff0c\u4f46\u6709 show(A)\u65b9\u6cd5\u3002B \u7684\u7236\u7c7b\u662f A \uff0c\u56e0\u6b64\u5b9a\u4f4d\u5230 A.show(A)\u3002\n        System.out.println(\"1) \" + a.show(b));\n\n        // 2) A and A \u3002c \u7684\u7c7b\u578b\u662f C \uff0c\u4e5f\u662f C \u7684\u5b9e\u4f8b\uff0cC \u7ee7\u627f B \uff0cB \u7ee7\u627f A \u3002A \u91cc\u6ca1\u6709 show(C)\u65b9\u6cd5\uff0c\u4e5f\u6ca1\u6709 show(B)\u65b9\u6cd5\uff0c\u6700\u540e\u6307\u5411 A.show(A)\u3002\n        System.out.println(\"2) \" + a.show(c));\n\n        // 3) A and D, d \u7684\u7c7b\u578b\u662f D \uff0c\u4e5f\u662f D \u7684\u5b9e\u4f8b\uff0cD \u7ee7\u627f B \uff0cB \u7ee7\u627f A \u3002A \u91cc\u6709 show(D)\u65b9\u6cd5\uff0c\u76f4\u63a5\u5b9a\u4f4d\u5230 A.show(D)\u3002\n        System.out.println(\"3) \" + a.show(d));\n\n        // 4) B and A, ab \u662f B \u7684\u5b9e\u4f8b\uff0c\u4f46\u7528 A \u58f0\u660e\uff0c\u5373\u5411\u4e0a\u8f6c\u578b\u5f97\u5230\u7684\u7c7b\u578b\u662f A \uff0c\u8fd0\u884c\u65f6\u624d\u80fd\u786e\u5b9a\u5177\u4f53\u8be5\u8c03\u7528\u54ea\u4e2a\u65b9\u6cd5\u3002\n        // ab \u662f B \u7684\u5b9e\u4f8b\u5bf9\u8c61\uff0c\u4f46\u5f15\u7528\u7c7b\u578b\u662f A \u3002\u7c7b\u578b\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\uff0c\u56e0\u6b64\u4ece\u7c7b\u578b\u5f00\u59cb\u5b9a\u4f4d\u65b9\u6cd5\u3002\n        // A \u7c7b\u4e2d\u6ca1\u6709 show(B)\u65b9\u6cd5\uff0c\u4f46\u6709 show(A)\u65b9\u6cd5\uff0c\u56e0\u4e3a A \u662f B \u7684\u7236\u7c7b\uff0cab \u4e5f\u662f A \u7684\u5b9e\u4f8b\uff0c\u4e8e\u662f\u5b9a\u4f4d\u5230 A.show(A)\u65b9\u6cd5\u3002\n        // \u7531\u4e8e B \u662f A \u7684\u5b50\u7c7b\uff0c\u4e14 B \u91cd\u5199\u4e86 A \u7684 show(A)\uff0cA \u7684\u65b9\u6cd5\u88ab\u8986\u76d6\u4e86\uff0c\u4e8e\u662f\u5b9a\u4f4d\u5230 B.show(A)\uff0c\u8fd9\u5c31\u662f\u52a8\u6001\u7ed1\u5b9a\u3002\n        // \u867d\u7136 B \u4e2d\u6709 show(B)\u65b9\u6cd5\uff0c\u4f46\u662f\u56e0\u4e3a ab \u7684\u7c7b\u578b\u662f A \uff0c\u7f16\u8bd1\u65f6\u6839\u636e\u7c7b\u578b\u5b9a\u4f4d\u5230 A \u7684\u65b9\u6cd5\uff0c\u800c\u4e0d\u662f B \u3002\n\n        // \u4ee5\u4e0b\u51e0\u79cd\u53ef\u5f00\u5173\u6253\u5f00/\u6ce8\u91ca\u4ee3\u7801\u6d4b\u8bd5\u4e0b\u3002\n        // -\n        // \u82e5 A \u91cc\u6709 show(A)\u548c show(B)\uff0cB \u91cc\u6709 show(B)\u6709 show(A)\uff0c\u5219\u7f16\u8bd1\u65f6\u5173\u8054\u5230 A.show(B)\uff0c\u56e0 B \u8986\u76d6\u4e86 A.show(B)\uff0c\u52a8\u6001\u7ed1\u5b9a\u5230 B.show(B)\u3002\n        // -\n        // \u82e5 A \u91cc\u6709 show(A)\u548c show(B)\uff0cB \u91cc\u65e0 show(B)\u6709 show(A)\uff0c\u5219\u7f16\u8bd1\u65f6\u5173\u8054\u5230 A.show(B)\uff0c\u56e0 B \u65e0\u8986\u76d6\uff0c\u5219\u76f4\u63a5\u8c03\u7528 A.show(B)\u3002\n        // -\n        // \u82e5 A \u91cc\u6709 show(A)\u65e0 show(B)\uff0cB \u91cc\u65e0 show(B)\u6709 show(A)\uff0c\u5219\u7f16\u8bd1\u65f6\u5173\u8054\u5230 A.show(A)\uff0c\u56e0 B \u8986\u76d6\u4e86 A.show(A)\uff0c\u52a8\u6001\u7ed1\u5b9a\u5230 B.show(A)\u3002\n        // -\n        // \u82e5 A \u91cc\u6709 show(A)\u65e0 show(B)\uff0cB \u91cc\u65e0 show(A)\u6709 show(B)\uff0c\u5219\u7f16\u8bd1\u65f6\u5173\u8054\u5230 A.show(A)\uff0c\u56e0 B \u65e0\u8986\u76d6\uff0c\u5219\u76f4\u63a5\u8c03\u7528 A.show(A)\u3002\n        // \u67e5\u627e\u987a\u5e8f\u4e3a\uff1a\u7f16\u8bd1\u65f6\u6839\u636e\u5f15\u7528\u7c7b\u578b\u786e\u5b9a\u6240\u5c5e\u7c7b -&gt; \u6839\u636e\u91cd\u8f7d\u53c2\u6570\u7c7b\u578b\u5b9a\u4f4d\uff08\u7c7b\u578b\u6309\u5b50-&gt;\u7236-&gt;\u7956\u9010\u7ea7\u5f80\u4e0a\u67e5\u627e\uff09\u5230\u7c7b\u7684\u5177\u4f53\u65b9\u6cd5\uff08\u5305\u62ec\u7ee7\u627f\u7684\u65b9\u6cd5\uff09 -&gt;\n        // \u8fd0\u884c\u65f6\u5b9e\u4f8b\u5bf9\u8c61\u8986\u76d6\uff08\u8986\u76d6\u53ea\u6709\u5b50-&gt;\u7236\u4e00\u5c42\uff09\u4e86\u5f15\u7528\u7c7b\u578b\u7684\u540c\u540d\u65b9\u6cd5 -&gt; \u5b9a\u4f4d\u5230\u5b9e\u4f8b\u5bf9\u8c61\u7684\u65b9\u6cd5\u3002\n        System.out.println(\"4) \" + ab.show(b));\n\n        // 5) B and A \u3002ab \u662f B \u7684\u5b9e\u4f8b\uff0c\u7c7b\u578b\u662f A \u3002\u4ece A \u7c7b\u6ca1\u627e\u5230 show(C)\u65b9\u6cd5\uff0c\u4e5f\u6ca1\u627e\u5230 A.show(B)\u65b9\u6cd5\uff0c\u627e\u5230 A.show(A)\u65b9\u6cd5\u3002A.show(A)\u88ab B.show(A)\u8986\u76d6\uff0c\u56e0\u6b64\u8c03\u7528 B.show(A)\u3002\n        System.out.println(\"5) \" + ab.show(c));\n\n        // 6) A and D \u3002A \u91cc\u9762\u6709 show(D)\u7684\u65b9\u6cd5\uff0c\u76f4\u63a5\u5b9a\u4f4d\u5230\u3002\n        System.out.println(\"6) \" + ab.show(d));\n\n        // 7) B and B \u3002B \u91cc\u9762\u6709 show(B)\u7684\u65b9\u6cd5\uff0c\u76f4\u63a5\u5b9a\u4f4d\u5230\u3002\n        System.out.println(\"7) \" + b.show(b));\n\n        // 8) B and B \u3002B \u6ca1\u6709 show(c)\u65b9\u6cd5\uff0c\u4f46\u6709 show(B)\u65b9\u6cd5\u3002C \u7ee7\u627f\u81ea B \uff0c\u7236\u7c7b\u578b\u662f B \uff0c\u56e0\u6b64\u8c03\u7528 B.show(B)\u3002\n        System.out.println(\"8) \" + b.show(c));\n\n        // 9) A and D \u3002B \u4e2d\u6ca1\u6709 show(D)\u65b9\u6cd5\uff0cB \u7ee7\u627f A \uff0cA \u91cc\u6709 show(D), \u6545\u8c03\u7528 A.show(D)\u65b9\u6cd5\u3002\n        System.out.println(\"9) \" + b.show(d));\n\n        // 10) B and A \u3002\u7236\u7c7b\u58f0\u660e\u5b50\u7c7b\uff0c\u5b58\u5728\u5411\u4e0a\u8f6c\u578b\u3002A \u91cc\u6709 show(A)\uff0c\u88ab B.show(A)\u8986\u76d6\u4e86\uff0c\u56e0\u6b64\u5b9a\u4f4d\u5230 B.show(A)\u3002\n        System.out.println(\"10) \" + ab.show(a));\n\n    }\n}\n\n/**\n * \u6d4b\u8bd5\u7ed3\u679c\n * 1) A and A\n * 2) A and A\n * 3) A and D\n * 4) B and A\n * 5) B and A\n * 6) A and D\n * 7) B and B\n * 8) B and B\n * 9) A and D\n * 10) B and A\n */\n</code></pre>\n<p>\u5176\u4ed6\u8bed\u8a00\u6a21\u62df\u5b9e\u73b0\uff1a <a href=\"https://github.com/microwind/design-patterns/tree/main/programming-paradigm/object-oriented-programming/polymorphism\" rel=\"nofollow\">https://github.com/microwind/design-patterns/tree/main/programming-paradigm/object-oriented-programming/polymorphism</a></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Ayanokouji", 
        "name": "Ayanokouji", 
        "avatar": "https://cdn.v2ex.com/avatar/9075/dfdb/499495_large.png?m=1773811031"
      }, 
      "url": "https://www.v2ex.com/t/1199077", 
      "title": "JDK 26 \u53d1\u5e03\uff0c\u975e lts \u7248\u672c", 
      "id": "https://www.v2ex.com/t/1199077", 
      "date_published": "2026-03-18T00:32:56+00:00", 
      "content_html": "\u77e5\u9053 Applet \u8fd9\u4e1c\u897f\u7684\u5df2\u7ecf\u90fd\u8001\u4e86\u5427<br /><br /><a target=\"_blank\" href=\"https://jdk.java.net\" rel=\"nofollow noopener\">https://jdk.java.net</a><br /><a target=\"_blank\" href=\"https://openjdk.org/projects/jdk/26/\" rel=\"nofollow noopener\">https://openjdk.org/projects/jdk/26/</a><br /><br />Features<br /><br />500:\tPrepare to Make Final Mean Final<br />504:\tRemove the Applet API<br />516:\tAhead-of-Time Object Caching with Any GC<br />517:\tHTTP/3 for the HTTP Client API<br />522:\tG1 GC: Improve Throughput by Reducing Synchronization<br />524:\tPEM Encodings of Cryptographic Objects (Second Preview)<br />525:\tStructured Concurrency (Sixth Preview)<br />526:\tLazy Constants (Second Preview)<br />529:\tVector API (Eleventh Incubator)<br />530:\tPrimitive Types in Patterns, instanceof, and switch (Fourth Preview)<br /><br /><br />ps\uff1a\u672c\u5e16\u4e0d\u6b22\u8fce\u73a9 jdk8 \u6897\u7684\uff0c\u4f60\u7231\u5b66\u4e0d\u5b66\uff0c\u7231\u7528\u4e0d\u7528"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/f0rb", 
        "name": "f0rb", 
        "avatar": "https://cdn.v2ex.com/gravatar/5327037325f18648036ec7f257afd825?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1195941", 
      "date_modified": "2026-03-05T02:09:39+00:00", 
      "content_html": "<p>SpringDataJPA \u652f\u6301\u901a\u8fc7 findBy \u65b9\u6cd5\u6784\u5efa\u67e5\u8be2\u8bed\u53e5\uff0c\u7136\u800c findBy \u65b9\u6cd5\u6784\u5efa\u7684\u67e5\u8be2\u6761\u4ef6\u662f\u56fa\u5b9a\u7684\uff0c\u4e0d\u652f\u6301\u5ffd\u7565\u503c\u4e3a null \u7684\u53c2\u6570\u5bf9\u5e94\u7684\u67e5\u8be2\u6761\u4ef6\uff0c\u8fd9\u5bfc\u81f4\u6211\u4eec\u9700\u8981\u4e3a\u6bcf\u4e00\u7ec4\u53c2\u6570\u7ec4\u5408\u5b9a\u4e49\u4e00\u4e2a findBy \u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre><code class=\"language-java\">findByAuthor\nfindByAuthorAndPublishedYearGreaterThan\nfindByAuthorAndPublishedYearLessThan\nfindByAuthorAndPublishedYearGreaterThanAndPublishedYearLessThan\n</code></pre>\n<p>\u5f53\u6761\u4ef6\u53d8\u591a\u65f6\uff0c\u65b9\u6cd5\u540d\u4f1a\u53d8\u957f\uff0c\u53c2\u6570\u4e5f\u4f1a\u53d8\u591a\uff0c\u5e76\u89e6\u53d1\u201c\u957f\u53c2\u6570\u201d\u574f\u5473\u9053\u3002\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\u7684\u91cd\u6784\u65b9\u6cd5\u662f\u201c\u5f15\u5165\u53c2\u6570\u5bf9\u8c61\u201d\uff0c\u5373\u628a\u6240\u6709\u7684\u53c2\u6570\u5b9a\u4e49\u5728\u4e00\u4e2a\u5bf9\u8c61\u91cc\u3002\u540c\u65f6\uff0c\u6211\u4eec\u628a findBy \u7684\u65b9\u6cd5\u540d\u4e2d\u5bf9\u5e94\u67e5\u8be2\u6761\u4ef6\u7684\u90e8\u5206\u4f5c\u4e3a\u8fd9\u4e2a\u5bf9\u8c61\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u6211\u4eec\u4fbf\u80fd\u4e3a\u6bcf\u4e2a\u5b57\u6bb5\u6784\u5efa\u4e00\u4e2a\u67e5\u8be2\u6761\u4ef6\uff0c\u5e76\u4e14\u6839\u636e\u5bf9\u8c61\u7684\u8d4b\u503c\u60c5\u51b5\uff0c\u52a8\u6001\u5730\u7ec4\u5408\u975e\u7a7a\u5b57\u6bb5\u5bf9\u5e94\u7684\u67e5\u8be2\u6761\u4ef6\u7ec4\u5408\u4e3a\u67e5\u8be2\u5b50\u53e5\u3002</p>\n<pre><code class=\"language-java\">public class BookQuery {\n    String author;\n    Integer publishedYearGreaterThan;\n    Integer publishedYearLessThan;\n    //...\n}\n</code></pre>\n<p>\u57fa\u4e8e\u6b64\u5bf9\u8c61\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6240\u6709\u7684 findBy \u65b9\u6cd5\u5408\u5e76\u4e3a\u4e00\u4e2a\u6cdb\u578b\u65b9\u6cd5\uff0c\u4ece\u800c\u7b80\u5316\u67e5\u8be2\u63a5\u53e3\u7684\u8bbe\u8ba1\u3002</p>\n<pre><code class=\"language-java\">public class CrudRepository&lt;E, I, Q&gt; {\n    List&lt;E&gt; findBy(Q query);\n    //...\n}\n</code></pre>\n<p>\u63d0\u51fa\u67e5\u8be2\u5bf9\u8c61\u8fd9\u4e00\u6982\u5ff5\uff0c\u5e76\u5229\u7528\u5b83\u6765\u89e3\u51b3\u52a8\u6001\u67e5\u8be2\u95ee\u9898\uff0c\u6b63\u662f DoytoQuery \u7684\u6838\u5fc3\u529f\u80fd\u3002</p>\n", 
      "date_published": "2026-03-05T02:05:20+00:00", 
      "title": "DoytoQuery vs SpringDataJPA", 
      "id": "https://www.v2ex.com/t/1195941"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/banzige", 
        "name": "banzige", 
        "avatar": "https://cdn.v2ex.com/avatar/26be/6870/676152_large.png?m=1708241972"
      }, 
      "url": "https://www.v2ex.com/t/1195318", 
      "date_modified": "2026-03-03T03:22:34+00:00", 
      "content_html": "<p>\u56e2\u961f\u51c6\u5907\u5c06\u51e0\u4e2a\u5386\u53f2\u9879\u76ee\u9010\u6b65\u90fd\u8fc1\u79fb\u5230 Java \u6280\u672f\u6808\u6765\uff0c\u51c6\u5907\u4f7f\u7528\u4e00\u4e9b\u811a\u624b\u67b6\u9879\u76ee\u6765\u505a\u3002\n\u5404\u4f4d\u5927\u4f6c\u6709\u6ca1\u6709\u63a8\u8350\u7684\u597d\u7684\u9879\u76ee\uff0c\u6216\u8005\u597d\u7528\u7684\u5e93\u6216\u6a21\u5757\u4e5f\u884c\u3002</p>\n", 
      "date_published": "2026-03-02T16:25:53+00:00", 
      "title": "\u6c42\u63a8\u8350\u6bd4\u8f83\u4f18\u79c0\u7684 springboot \u811a\u624b\u67b6\u9879\u76ee", 
      "id": "https://www.v2ex.com/t/1195318"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Waterchestnut", 
        "name": "Waterchestnut", 
        "avatar": "https://cdn.v2ex.com/avatar/e8e5/addd/139399_large.png?m=1715260685"
      }, 
      "url": "https://www.v2ex.com/t/1193117", 
      "date_modified": "2026-02-17T13:48:40+00:00", 
      "content_html": "\u6700\u8fd1\u4e00\u4e2a\u6708\u5c1d\u8bd5\u7528 vscode \u5f00\u53d1 java \uff0c\u53d1\u73b0 idea \u91cc\u81ea\u5df1\u5e38\u7528\u7684 copy reference \u529f\u80fd\u6ca1\u6709\uff0c\u5c31\u81ea\u5df1\u9020\u4e86\u8f6e\u5b50\uff0c\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u52a0\u4e0a\u4e86\u81ea\u5df1\u9700\u8981\u5176\u4ed6\u529f\u80fd\uff0c\u6bd4\u5982\u652f\u6301\u590d\u5236\u5f15\u7528\u8def\u5f84\u3001REST \u63a5\u53e3\u8def\u5f84\u3001Arthas \u547d\u4ee4\u751f\u6210\u53ca JSON \u7ed3\u6784 mock \u7b49\u529f\u80fd\uff0c\u8d81\u653e\u5047\u7528 claude \u64b8\u7684\uff0c\u6bd4\u8f83\u7c97\u7cd9\uff0c\u4e3b\u8981\u662f\u6ee1\u8db3\u81ea\u5df1 vscode \u5f00\u53d1 java \u7684\u9700\u6c42\uff0c\u76ee\u6807\u662f\u6700\u7ec8\u4f7f\u7528 vscode \u5f00\u53d1 java \uff0c\u73b0\u5728\u662f vscode \u548c idea \u5e76\u884c\uff0c\u6682\u65f6\u6ca1\u6709\u7684\u529f\u80fd\u53ea\u597d diy \u4e86\uff0c\u5206\u4eab\u540c\u6837 vscode \u7684 javer \u8bd5\u7528\u4e0b\u3002<br />\u63d2\u4ef6\u5730\u5740\uff1a <a target=\"_blank\" href=\"https://marketplace.visualstudio.com/items?itemName=qinlinglong.advanced-copy-for-java\" rel=\"nofollow noopener\">https://marketplace.visualstudio.com/items?itemName=qinlinglong.advanced-copy-for-java</a><br />\u4ed3\u5e93\u5730\u5740\uff1a <a target=\"_blank\" href=\"https://github.com/qinlinglong/advanced-copy\" rel=\"nofollow noopener\">https://github.com/qinlinglong/advanced-copy</a>", 
      "date_published": "2026-02-17T13:47:43+00:00", 
      "title": "vscode \u91cc\u81ea\u7528 Java \u5f00\u53d1\u63d2\u4ef6:\u652f\u6301\u590d\u5236\u5f15\u7528\u8def\u5f84\u3001rest \u63a5\u53e3\u8def\u5f84\u3001Arthas \u547d\u4ee4\u7b49\u529f\u80fd", 
      "id": "https://www.v2ex.com/t/1193117"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/HeyHudy", 
        "name": "HeyHudy", 
        "avatar": "https://cdn.v2ex.com/avatar/81c7/dc5a/530655_large.png?m=1664282378"
      }, 
      "url": "https://www.v2ex.com/t/1192599", 
      "title": "\u81ea\u8350 Java \u591a\u7ebf\u7a0b\u795e\u5668\u2014\u2014ThreadForge \uff0c\u8ba9\u591a\u7ebf\u7a0b\u4ece\u6b64\u7b80\u5355", 
      "id": "https://www.v2ex.com/t/1192599", 
      "date_published": "2026-02-13T01:02:23+00:00", 
      "content_html": "<blockquote>\n<p>\u65b0\u6625\u4e34\u8fd1\uff0c\u5148\u4f4f\u5404\u4f4d V \u53cb\u65b0\u5e74\u5feb\u4e50\uff5e</p>\n</blockquote>\n<h2>\u4ece\u573a\u666f\u5207\u5165</h2>\n<p>\u4f20\u7edf\u7684 <code>ExecutorService</code>\u3001<code>Future</code>\u3001<code>CompletableFuture</code> \u975e\u5e38\u5f3a\u5927\uff0c\u4f46\u5199\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff1a</p>\n<ul>\n<li>\u7ebf\u7a0b\u6c60\u8981\u624b\u52a8\u521b\u5efa\u548c\u5173\u95ed</li>\n<li>\u8d85\u65f6\u903b\u8f91\u6bcf\u4e2a\u4efb\u52a1\u90fd\u8981\u5199\u4e00\u904d</li>\n<li>\u5931\u8d25\u4e86\u8981\u4e0d\u8981\u53d6\u6d88\u5176\u4ed6\u4efb\u52a1\uff1f\u5f97\u81ea\u5df1\u5224\u65ad</li>\n<li>\u5f02\u5e38\u600e\u4e48\u4f20\u64ad\uff1f\u8981\u4e48\u541e\u6389\uff0c\u8981\u4e48\u624b\u52a8\u5305\u88c5</li>\n<li>\u60f3\u77e5\u9053\u4efb\u52a1\u8dd1\u4e86\u591a\u4e45\uff1f\u81ea\u5df1\u6253\u65e5\u5fd7</li>\n</ul>\n<p>\u6211\u4e00\u76f4\u5728\u601d\u8003\u600e\u4e48\u80fd\u8ba9 Javaer \u7528\u591a\u7ebf\u7a0b\u7684\u65f6\u5019\u80fd\u7b80\u5355\u70b9\uff0c\u5c11\u70b9\u5f2f\u5f2f\u7ed5\u7ed5\uff0c\u4e8e\u662f\u8bde\u751f\u4e86 ThreadForge \u3002</p>\n<h2>ThreadForge\uff1a\u628a\u590d\u6742\u5ea6\u6536\u655b\u5230\u4e00\u4e2a\u53ef\u63a8\u7406\u7684\u6a21\u578b\u91cc</h2>\n<p>ThreadForge \u7684\u8bbe\u8ba1\u54f2\u5b66\u5f88\u7b80\u5355\uff1a<strong>\u5148\u964d\u4f4e\u8ba4\u77e5\u6210\u672c\uff0c\u518d\u8ffd\u6c42\u6027\u80fd\u3002</strong></p>\n<p>\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u6210\u4e00\u4e2a<strong>\u7ed3\u6784\u5316\u5e76\u53d1\u6846\u67b6</strong>\u2014\u2014\u8ba9\u4f60\u7528\u5199\u540c\u6b65\u4ee3\u7801\u7684\u601d\u7ef4\u5199\u5e76\u53d1\u4ee3\u7801\uff0c\u540c\u65f6\u81ea\u52a8\u5904\u7406\u90a3\u4e9b\u5bb9\u6613\u9057\u6f0f\u7684\u8fb9\u754c\u60c5\u51b5\u3002</p>\n<p>\u4e5f\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u6210\u5bf9\u4e8e Java \u5185\u7f6e\u5e76\u53d1\u5de5\u5177\u7684\u4e8c\u6b21\u5305\u88c5\uff0c\u76ee\u6807\u662f\u8ba9 Java \u5e76\u53d1\u66f4\u7b80\u5355\u3001\u66f4\u6e05\u6670\u3002</p>\n<h3>\u4ec0\u4e48\u662f\u7ed3\u6784\u5316\uff1f</h3>\n<p>\u770b\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u4f8b\u5b50\uff1a</p>\n<pre><code class=\"language-java\">try (ThreadScope scope = ThreadScope.open()) {\n    Task&lt;String&gt; user = scope.submit(\"load-user\", () -&gt; fetchUser());\n    Task&lt;Integer&gt; orders = scope.submit(\"load-orders\", () -&gt; fetchOrders());\n    \n    scope.await(user, orders);\n    \n    // \u5230\u8fd9\u91cc,\u4e24\u4e2a\u4efb\u52a1\u80af\u5b9a\u90fd\u7ed3\u675f\u4e86\uff08\u6210\u529f\u3001\u5931\u8d25\u6216\u8d85\u65f6\uff09\n    String result = user.await() + \":\" + orders.await();\n}\n// scope \u5173\u95ed\u65f6,\u6240\u6709\u4efb\u52a1\u81ea\u52a8\u53d6\u6d88\u3001\u8d44\u6e90\u81ea\u52a8\u6e05\u7406\n</code></pre>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u6709\u51e0\u4e2a\u5173\u952e\u70b9\uff1a</p>\n<ol>\n<li><strong>\u6240\u6709\u4efb\u52a1\u90fd\u7ed1\u5b9a\u5728 <code>ThreadScope</code> \u5185</strong>\uff0c\u751f\u547d\u5468\u671f\u6709\u8fb9\u754c\uff0c\u4e0d\u4f1a\u6cc4\u6f0f</li>\n<li><strong>\u9ed8\u8ba4\u5c31\u662f\u5b89\u5168\u7684</strong>\uff1a\u9ed8\u8ba4\u8d85\u65f6\u3001\u9ed8\u8ba4\u5931\u8d25\u4f20\u64ad\u3001\u81ea\u52a8\u53d6\u6d88</li>\n<li><strong>\u4ee3\u7801\u7ed3\u6784\u5c31\u662f\u4efb\u52a1\u5173\u7cfb</strong>\uff1a\u8bfb\u4ee3\u7801\u7684\u4eba\u4e00\u773c\u5c31\u80fd\u770b\u51fa\u4e24\u4e2a\u4efb\u52a1\u662f\u5e76\u53d1\u7684\uff0c\u4e14\u5fc5\u987b\u90fd\u5b8c\u6210\u624d\u80fd\u7ee7\u7eed</li>\n</ol>\n<p>\u5bf9\u6bd4\u4f20\u7edf\u5199\u6cd5\uff0c\u4f60\u9700\u8981\uff1a</p>\n<ul>\n<li>\u521b\u5efa\u7ebf\u7a0b\u6c60\uff0c\u914d\u7f6e\u6838\u5fc3\u7ebf\u7a0b\u6570\u3001\u961f\u5217\u5927\u5c0f</li>\n<li>\u63d0\u4ea4\u4efb\u52a1\uff0c\u624b\u52a8\u5904\u7406 Future</li>\n<li>\u5199 try-finally \u786e\u4fdd shutdown</li>\n<li>\u624b\u52a8\u5904\u7406\u8d85\u65f6\u548c\u5f02\u5e38\u4f20\u64ad</li>\n</ul>\n<p>\u8fd9\u91cc\u5176\u5b9e\u5c31\u80fd\u770b\u51fa\u6765 ThreadForge \u7684\u8bbe\u8ba1\u521d\u8877\u548c\u76ee\u6807\u4e86\uff0c\u5c31\u662f\u52aa\u529b\u8ba9\u6211\u4eec\u7701\u6389\u8fd9\u4e9b\u91cd\u590d\u52b3\u52a8\uff0c\u4e13\u6ce8\u4e1a\u52a1\u903b\u8f91\u3002</p>\n<h2>\u4e94\u4e2a\u8ba9\u4f60\u7701\u8111\u529b\u7684\u8bbe\u8ba1</h2>\n<h3>1. \u9ed8\u8ba4\u884c\u4e3a\u5c31\u662f\u6b63\u786e\u7684</h3>\n<pre><code class=\"language-java\">// \u9ed8\u8ba4:FAIL_FAST + 30 \u79d2\u8d85\u65f6 + \u81ea\u52a8\u53d6\u6d88\u5176\u4ed6\u4efb\u52a1\ntry (ThreadScope scope = ThreadScope.open()) {\n    Task&lt;Integer&gt; a = scope.submit(() -&gt; riskyRpc());\n    Task&lt;Integer&gt; b = scope.submit(() -&gt; anotherRpc());\n    scope.await(a, b);\n} catch (ScopeTimeoutException timeout) {\n    // \u8d85\u65f6\u4e86,\u6240\u6709\u4efb\u52a1\u5df2\u88ab\u81ea\u52a8\u53d6\u6d88\n    fallback();\n} catch (FailurePropagationException failed) {\n    // \u67d0\u4e2a\u4efb\u52a1\u5931\u8d25\u4e86,\u5176\u4ed6\u4efb\u52a1\u5df2\u88ab\u81ea\u52a8\u53d6\u6d88\n    handleError(failed);\n}\n</code></pre>\n<p>\u4e0d\u9700\u8981\u914d\u7f6e\uff0c\u4e0d\u9700\u8981\u601d\u8003\uff0c\u5f00\u7bb1\u5373\u7528\u3002</p>\n<h3>2. \u5931\u8d25\u7b56\u7565\u660e\u786e\u4e14\u7edf\u4e00</h3>\n<p>\u4e0d\u540c\u573a\u666f\u5bf9\u5931\u8d25\u7684\u5bb9\u5fcd\u5ea6\u4e0d\u540c\uff0cThreadForge \u63d0\u4f9b\u4e86 5 \u79cd\u660e\u786e\u7684\u7b56\u7565\uff1a</p>\n<ul>\n<li><code>FAIL_FAST</code>\uff1a\u5feb\u901f\u5931\u8d25\uff0c\u7acb\u5373\u53d6\u6d88\u5176\u4ed6\u4efb\u52a1\uff08\u9ed8\u8ba4\uff09</li>\n<li><code>COLLECT_ALL</code>\uff1a\u7b49\u6240\u6709\u4efb\u52a1\u7ed3\u675f\uff0c\u6c47\u603b\u6240\u6709\u5931\u8d25</li>\n<li><code>SUPERVISOR</code>\uff1a\u4e0d\u81ea\u52a8\u53d6\u6d88\uff0c\u5931\u8d25\u4fe1\u606f\u6536\u96c6\u5230 <code>Outcome</code></li>\n<li><code>CANCEL_OTHERS</code>\uff1a\u5931\u8d25\u540e\u53d6\u6d88\u5176\u4f59\u4efb\u52a1\uff0c\u4f46\u4e0d\u629b\u5f02\u5e38</li>\n<li><code>IGNORE_ALL</code>\uff1a\u5ffd\u7565\u5931\u8d25\uff0c\u53ea\u8fd4\u56de\u6210\u529f\u7684\u7ed3\u679c</li>\n</ul>\n<pre><code class=\"language-java\">// \u573a\u666f:\u6279\u91cf\u5bfc\u5165,\u5373\u4f7f\u90e8\u5206\u5931\u8d25\u4e5f\u8981\u77e5\u9053\u54ea\u4e9b\u6210\u529f\u4e86\ntry (ThreadScope scope = ThreadScope.open()\n        .withFailurePolicy(FailurePolicy.SUPERVISOR)) {\n    \n    List&lt;Task&lt;Void&gt;&gt; tasks = ids.stream()\n        .map(id -&gt; scope.submit(() -&gt; importData(id)))\n        .collect(toList());\n    \n    Outcome outcome = scope.await(tasks);\n    \n    // \u660e\u786e\u77e5\u9053\u54ea\u4e9b\u6210\u529f\u3001\u54ea\u4e9b\u5931\u8d25\n    log.info(\"\u6210\u529f: {}, \u5931\u8d25: {}\", \n        outcome.successCount(), outcome.failureCount());\n}\n</code></pre>\n<h3>3. \u5e76\u53d1\u5ea6\u63a7\u5236\u4e0d\u518d\u9700\u8981\u624b\u52a8\u7ba1\u7406\u961f\u5217</h3>\n<pre><code class=\"language-java\">// \u573a\u666f:\u8c03\u7528\u5916\u90e8 API,\u6700\u591a\u540c\u65f6 50 \u4e2a\u8bf7\u6c42\ntry (ThreadScope scope = ThreadScope.open()\n        .withConcurrencyLimit(50)) {\n    \n    List&lt;Task&lt;Result&gt;&gt; tasks = hugeIdList.stream()\n        .map(id -&gt; scope.submit(() -&gt; externalApi.call(id)))\n        .collect(toList());\n    \n    List&lt;Result&gt; results = scope.awaitAll(tasks);\n}\n// \u81ea\u52a8\u9650\u6d41,\u4e0d\u4f1a\u628a\u5916\u90e8\u670d\u52a1\u6253\u7206\n</code></pre>\n<p>\u4e0d\u9700\u8981\u81ea\u5df1\u5199\u4fe1\u53f7\u91cf\uff0c\u4e5f\u4e0d\u9700\u8981\u624b\u52a8\u5206\u6279\uff0c\u6846\u67b6\u81ea\u52a8\u5904\u7406\u3002</p>\n<h3>4. \u751f\u547d\u5468\u671f\u89c2\u6d4b\u7edf\u4e00\u6536\u53e3</h3>\n<pre><code class=\"language-java\">ThreadScope scope = ThreadScope.open()\n    .withHook(new ThreadHook() {\n        @Override\n        public void onStart(TaskInfo info) {\n            metrics.taskStarted(info.name());\n        }\n        \n        @Override\n        public void onSuccess(TaskInfo info, Duration duration) {\n            metrics.taskSuccess(info.name(), duration.toMillis());\n        }\n        \n        @Override\n        public void onFailure(TaskInfo info, Throwable error, Duration duration) {\n            log.error(\"Task {} failed after {}\", info.name(), duration, error);\n            metrics.taskFailed(info.name());\n        }\n    });\n</code></pre>\n<p>\u4e0d\u9700\u8981\u5728\u6bcf\u4e2a\u4efb\u52a1\u91cc\u91cd\u590d\u5199\u65e5\u5fd7\u548c\u76d1\u63a7\u4ee3\u7801\uff0c\u540c\u65f6\u65b0\u7684 1.0.2 \u7248\u672c\u4e2d\u5185\u7f6e\u4e86 <code>ScopeMetricsSnapshot</code> \u4f5c\u4e3a\u89c2\u6d4b\u70b9\uff0c\u76f4\u63a5 <code>.toString()</code> \u5c31\u80fd\u770b\u5230\u5b8c\u6574\u7684\u8c03\u7528\u8017\u65f6\u7b49\u60c5\u51b5 \u3002</p>\n<h3>5. \u8de8 JDK \u7248\u672c\u7684\u4e00\u81f4\u4f53\u9a8c</h3>\n<pre><code class=\"language-java\">// \u540c\u4e00\u5957 API\ntry (ThreadScope scope = ThreadScope.open()) {\n    // JDK 21+: \u81ea\u52a8\u4f7f\u7528\u865a\u62df\u7ebf\u7a0b\n    // JDK 8-20: \u81ea\u52a8\u964d\u7ea7\u5230\u7ebf\u7a0b\u6c60\n    Task&lt;String&gt; task = scope.submit(() -&gt; longRunningTask());\n    return task.await();\n}\n</code></pre>\n<p>\u4e0d\u9700\u8981\u5206\u53c9\u4ee3\u7801\uff0c\u4e0d\u9700\u8981\u5199 <code>if-else</code>\uff0c\u6846\u67b6\u81ea\u52a8\u9002\u914d\u3002</p>\n<h2>\u9002\u7528\u573a\u666f</h2>\n<p>ThreadForge \u7279\u522b\u9002\u5408\u8fd9\u4e9b\u573a\u666f\uff1a</p>\n<p><strong>\u5e76\u53d1 RPC \u805a\u5408</strong></p>\n<pre><code class=\"language-java\">try (ThreadScope scope = ThreadScope.open()) {\n    Task&lt;User&gt; user = scope.submit(() -&gt; userService.get(uid));\n    Task&lt;List&lt;Order&gt;&gt; orders = scope.submit(() -&gt; orderService.list(uid));\n    Task&lt;Profile&gt; profile = scope.submit(() -&gt; profileService.get(uid));\n    \n    scope.await(user, orders, profile);\n    \n    return buildResponse(user.await(), orders.await(), profile.await());\n}\n</code></pre>\n<p><strong>\u6279\u91cf\u6570\u636e\u5904\u7406</strong></p>\n<pre><code class=\"language-java\">try (ThreadScope scope = ThreadScope.open()\n        .withConcurrencyLimit(100)\n        .withDeadline(Duration.ofMinutes(5))) {\n    \n    List&lt;Task&lt;Void&gt;&gt; tasks = records.stream()\n        .map(r -&gt; scope.submit(() -&gt; process(r)))\n        .collect(toList());\n    \n    scope.awaitAll(tasks);\n}\n</code></pre>\n<p><strong>\u751f\u4ea7\u8005-\u6d88\u8d39\u8005\u6a21\u5f0f</strong></p>\n<pre><code class=\"language-java\">try (ThreadScope scope = ThreadScope.open()) {\n    Channel&lt;Data&gt; channel = Channel.bounded(1000);\n    \n    scope.submit(() -&gt; {\n        for (Data d : datasource) {\n            channel.send(d);\n        }\n        channel.close();\n        return null;\n    });\n    \n    List&lt;Task&lt;Void&gt;&gt; consumers = IntStream.range(0, 4)\n        .mapToObj(i -&gt; scope.submit(() -&gt; {\n            for (Data d : channel) {\n                process(d);\n            }\n            return null;\n        }))\n        .collect(toList());\n    \n    scope.awaitAll(consumers);\n}\n</code></pre>\n<h2>\u5f00\u59cb\u4f7f\u7528</h2>\n<p><strong>Maven:</strong></p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;pub.lighting&lt;/groupId&gt;\n    &lt;artifactId&gt;threadforge-core&lt;/artifactId&gt;\n    &lt;version&gt;1.0.2&lt;/version&gt;\n&lt;/dependency&gt;\n</code></pre>\n<p><strong>Gradle:</strong></p>\n<pre><code class=\"language-gradle\">implementation(\"pub.lighting:threadforge-core:1.0.2\")\n</code></pre>\n<p><strong>\u6700\u5c0f\u793a\u4f8b:</strong></p>\n<pre><code class=\"language-java\">try (ThreadScope scope = ThreadScope.open()) {\n    Task&lt;String&gt; task = scope.submit(() -&gt; \"Hello, ThreadForge\");\n    System.out.println(task.await());\n}\n</code></pre>\n<p>\ud83d\udce6 GitHub: <a href=\"https://github.com/wuuJiawei/ThreadForge\" rel=\"nofollow\">github.com/wuuJiawei/ThreadForge</a><br/>\n\ud83d\udcd6 \u6587\u6863: \u89c1\u9879\u76ee <code>docs/api/<a href=\"http://README.md\" rel=\"nofollow\">README.md</a></code><br/>\n\ud83d\udcc4 License: MIT</p>\n<h2>\u6700\u540e</h2>\n<p>\u611f\u8c22\u6240\u6709\u770b\u5230\u8fd9\u91cc\u7684\u670b\u53cb\u3002</p>\n<p>JDK21 \u4e4b\u540e\uff0c\u5b98\u65b9\u56e2\u961f\u4e5f\u8ddf\u8fdb\u4e86\u7ed3\u6784\u5316\u5e76\u53d1\u7c7b\uff0c\u53ef\u4ee5\u79f0\u8fd9\u4e2a\u9879\u76ee\u662f\u53c8\u4e00\u4e2a\u8f6e\u5b50\uff0c\u4e5f\u53ef\u4ee5\u79f0\u5b83\u662f\u5728\u5de5\u7a0b\u5316\u91cc\u9762\u7684\u4e00\u6b21\u63a2\u8ba8\u548c\u53e6\u4e00\u79cd\u89e3\u51b3\u65b9\u6848\uff0c\u6bd5\u7adf\u7ed9\u4f4e\u7248\u672c\u7684 JDK \u4e5f\u63d0\u4f9b\u4e86\u53ef\u80fd\u6027\u3002</p>\n<p>\u6b22\u8fce\u70b9\u8d5e\u3001\u8bc4\u8bba\uff0c\u5982\u679c\u6709\u4efb\u4f55\u95ee\u9898\uff0c\u4e5f\u6b22\u8fce\u63d0\u51fa\u60a8\u7684\u5b9d\u8d35\u610f\u89c1\u3002</p>\n<p><img alt=\"jimeng-2026-02-10-3757-\u300c ThreadForge \u300d \u8fd9\u662f\u6211\u65b0\u5f00\u53d1\u7684\u5f00\u6e90\u9879\u76ee\uff0c\u5e2e\u6211\u505a\u4e00\u4e2a logo \u3002Java....png\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/0ba00f11caf64fdd9352d2290d364660%7Etplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5LiA5Y-q5Y-r54Wk55CD55qE54yr:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMTczMjQ4NjA1ODc0NTA1NCJ9&amp;rk3s=f64ab15b&amp;x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&amp;x-orig-expires=1771548692&amp;x-orig-sign=XKKuqDuK8T0%2Ft0CVw5mKbJkeBLI%3D\"/></p>\n<p>\u8fd9\u662f\u8ba9\u5373\u68a6\u753b\u7684 logo \uff0c\u770b\u8d77\u6765\u6709\u70b9\u610f\u601d\uff0c\u50cf\u662f\u4e2a\u8001\u6d3e\u7684\u9879\u76ee\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zzNaLOGIC", 
        "name": "zzNaLOGIC", 
        "avatar": "https://cdn.v2ex.com/avatar/2b01/cb58/380799_large.png?m=1715413889"
      }, 
      "url": "https://www.v2ex.com/t/1192288", 
      "title": "\u5c4e\u5c71\u8001\u9879\u76ee\u60f3\u7528 ai \u5b9e\u73b0\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u6709\u4ec0\u4e48\u53ef\u843d\u5730\u7684\u65b9\u6848\u4e48", 
      "id": "https://www.v2ex.com/t/1192288", 
      "date_published": "2026-02-11T09:08:21+00:00", 
      "content_html": "<p>\u5341\u6765\u5e74\u7684 mvc \u5927\u5355\u4f53 java \u9879\u76ee(\u91cc\u9762\u8fd8\u6709\u5f88\u591a jsp \u548c\u8fdc\u7a0b\u8c03\u7528)\uff0c\u4e1a\u52a1\u5197\u4f59\u9ad8\uff0c\u6ca1\u6587\u6863\uff0c\u6ca1\u6ce8\u91ca\uff0c\u800c\u4e14\u4e1a\u52a1\u4e32\u8054\u5f88\u6df1\u3002\n\u73b0\u5728\u8981\u5bf9\u8fd9\u4e2a\u7cfb\u7edf\u7684\u67d0\u4e9b\u6a21\u5757\u8fdb\u884c\u6574\u4f53\u6cbb\u7406\uff0c\u57fa\u672c\u601d\u8def\u5c31\u662f\u6536\u96c6\u95ee\u9898\uff08\u4e1a\u52a1\u53cd\u9988+\u903b\u8f91\uff09\u2014\u2014 \u68b3\u7406\u95ee\u9898 \u2014\u2014 \u8fdb\u884c\u8986\u76d6\u6027\u573a\u666f\u6d4b\u8bd5\uff08\u53ef\u4ee5\u4eba\u5de5\uff0c\u4f46\u6700\u597d\u81ea\u52a8\u5316\uff0c\u4e0d\u7136\u4eba\u5de5\u540e\u7eed\u6267\u884c\u4e0d\u4e0b\u53bb\u7684\uff09\u3002\n\u4e3b\u8981\u76ee\u7684\u5c31\u662f\u8ba9\u8fd9\u5757\u4e1a\u52a1\u81f3\u5c11\u5728\u4e0d\u4fee\u6539\u7684\u60c5\u51b5\u4e0b\uff0c\u4e0d\u8981\u7ecf\u5e38\u7206\u51fa\u5404\u79cd\u5404\u6837\u7684 bug \u548c\u6027\u80fd\u95ee\u9898\u3002\u7136\u540e\u6240\u6709\u7684\u7528\u4f8b\u7559\u7740\uff0c\u65b0\u4fee\u6539\u5fc5\u987b\u8d70\u4e00\u904d\uff0c\u786e\u4fdd\u4e0d\u51fa\u73b0 p0p1 \u7684 bug\n\u4e5f\u8bd5\u4e86\u5f88\u591a skills \u90fd\u4e0d\u5c3d\u5982\u4eba\u610f\u3002\n\u6253\u7b97\u4e0d\u81ea\u5df1\u7422\u78e8\u4e86\uff0c\u95ee\u95ee\u5927\u5bb6\u6709\u6ca1\u6709\u7c7b\u4f3c\u7684\u573a\u666f\uff0c\u6216\u8005\u601d\u8def\u53ef\u4ee5\u53c2\u8003\u7684\u3002</p>\n<p>\u7ed3\u5c3e\u9001\u4e00\u5f20$20 Googleplay \u5151\u6362\u7801\uff0c\u672c\u6765\u60f3\u7740\u81ea\u5df1\u6709\u6d77\u5916\u7269\u7406\u673a\u73af\u5883\u5e94\u8be5\u4e0d\u662f\u95ee\u9898\uff0c\u7ed3\u679c\u5929\u771f\u4e86\u3002\u4e00\u76f4\u5151\u6362\u4e0d\u6210\u529f\u7838\u624b\u91cc\u4e0d\u5982\u9001\u7ed9\u8089\u8eab\u6d77\u5916\u7684\u6709\u7f18\u4eba\u3002</p>\n<p>ADY9MWGZZPE7CT7P</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/heliotrope", 
        "name": "heliotrope", 
        "avatar": "https://cdn.v2ex.com/gravatar/f26ff0f38e2dd1247dca0a34e19b03d7?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1190775", 
      "title": "WebFlux \u9879\u76ee \u88ab\u8bbf\u95ee\u540e \u8bbf\u95ee\u65b9\u5173\u95ed\u8fde\u63a5 \u65e0\u6cd5\u6355\u83b7 SocketException: Connection reset", 
      "id": "https://www.v2ex.com/t/1190775", 
      "date_published": "2026-02-04T09:47:59+00:00", 
      "content_html": "<p>\u7a0b\u5e8f A \u8bf7\u6c42\u65b9\n\u7a0b\u5e8f B WebFlux \u5199\u7684\u7f51\u5173\n\u7a0b\u5e8f C \u670d\u52a1\u65b9</p>\n<p>\u8bf7\u6c42\u65b9 \u8bf7\u6c42 \u7f51\u5173\u65f6 \u8d85\u65f6\u8bbe\u7f6e 10 \u79d2\n\u7f51\u5173\u8bbe\u7f6e\u8d85\u65f6 60 \u79d2 \u670d\u52a1\u65b9 \u54cd\u5e94\u9700\u8981 10 \u79d2\u4ee5\u4e0a\n\u51fa\u73b0\u4e00\u4e2a\u95ee\u9898</p>\n<p>\u7f51\u5173\u4e2d\u4f7f\u7528 WebClient \u8f6c\u53d1\u8bf7\u6c42\u5230\u670d\u52a1\u65b9\u65f6\n\u5f53\u8bf7\u6c42\u65b9\u56e0\u4e3a 10 \u79d2\u8d85\u65f6\u5173\u95ed\u94fe\u63a5\n\u7f51\u5173\u53ea\u4f1a\u8f93\u51fa\n'''reactor.netty.channel.FluxReceive [0;39m - [warn,299] -  [36m[ce92646a-2, L:/192.168.101.233:9195 - R:/192.168.101.233:50853] An exception has been observed post termination, use DEBUG level to see the full stack: java.net.SocketException: Connection reset'''</p>\n<p>\u8fd8\u53ea\u662f WARN\n\u7f51\u5173\u4e2d WebClient \u5199\u7684 doOnError doFinally \u90fd\u4e0d\u4f1a\u89e6\u53d1\n\u7f51\u5173\u7684 ErrorWebExceptionHandler \u4e5f\u62e6\u622a\u4e0d\u5230\u8fd9\u4e2a\u5f02\u5e38</p>\n<p>\u76f8\u5f53\u4e8e\u65e0\u6cd5\u8bb0\u5f55\u8fd9\u4e2a\u8bf7\u6c42\u88ab\u8bf7\u6c42\u65b9\u5173\u95ed\u4e86\n\u6574\u4e2a\u8fdb\u7a0b\u88ab kill \u6389\u4e86\u4e00\u6837 \u6ca1\u6cd5\u505a\u4efb\u4f55\u64cd\u4f5c</p>\n<p>\u6c42\u6559 \u5982\u4f55\u6355\u83b7\u8fd9\u4e2a Connection reset</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lowman", 
        "name": "lowman", 
        "avatar": "https://cdn.v2ex.com/avatar/2103/3249/401365_large.png?m=1770198429"
      }, 
      "url": "https://www.v2ex.com/t/1190774", 
      "title": "\u6709\u4eba\u7528 RUOYI \u6846\u67b6\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1190774", 
      "date_published": "2026-02-04T09:47:36+00:00", 
      "content_html": "\u6709\u4eba\u7528 RUOYI  \u6846\u67b6\u5417\uff1f\u57fa\u4e8e Spring Boot \u548c Spring Cloud Alibaba"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dzdh", 
        "name": "dzdh", 
        "avatar": "https://cdn.v2ex.com/avatar/1683/7ebf/226307_large.png?m=1757987240"
      }, 
      "url": "https://www.v2ex.com/t/1189596", 
      "title": "\u5173\u4e8e\u5546\u7528 jdk \u6536\u8d39\u7684\u95ee\u9898\uff0c\u6709\u9065\u6d4b\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1189596", 
      "date_published": "2026-01-30T09:19:55+00:00", 
      "content_html": "<p>\u95ee\u4e86 ai \u6ca1\u7b54\u51fa\u4e2a\u6240\u4ee5\u7136\uff0c</p>\n<p>\u6bd4\u5982\uff0cazul \u7684 prime \u53ef\u4ee5\u4e0b\u8f7d\u7528\u7684\uff0c\u5546\u7528\u7684\uff0c\u6211\u8981\u662f\u7528\u4e86\uff0c\u4e0d\u7ed9\u94b1\uff0c\u8fd8\u76c8\u5229\u4e86\uff0c\u5c0f\u89c4\u6a21\u6bd4\u5982\u5c31\u4e00\u53f0\u670d\u52a1\u5668\uff0cazul \u662f\u600e\u4e48\u77e5\u9053\u6211\u7528\u4e86\u7684\uff0c\u8ba9\u6211\u638f\u94b1\u7684\uff1f</p>\n<p>\u8fd8\u662f\u5c0f\u516c\u53f8\u4ed6\u4eec\u5176\u5b9e\u4e5f\u4e0d\u7ba1\uff0c\u53ea\u6709\u5927\u516c\u53f8\u624d\u4f1a\u4e3b\u52a8\u89e3\u51b3\u8fd9\u4e9b\u95ee\u9898\uff0c\n\u8fd8\u662f\u8bf4\u771f\u6709\u4ec0\u4e48\u9065\u6d4b\u4ec0\u4e48\u7684\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/christineAlex", 
        "name": "christineAlex", 
        "avatar": "https://cdn.v2ex.com/gravatar/182191ffc94ddd770974bd7f074a1c54?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1189317", 
      "date_modified": "2026-01-29T08:40:19+00:00", 
      "content_html": "\u7248\u672c\uff1aIntelliJ IDEA 2025.1.3<br />\t macOS 26 <br /><br />\u4f7f\u7528 cmd+tab \u5207\u6362\u5176\u4ed6\u5e94\u7528\uff0c\u518d\u5207\u6362\u56de\u6765\uff0c\u5927\u6982\u7387\u51fa\u73b0 IDEA \u9875\u9762\u65e0\u6cd5\u70b9\u51fb\uff0c\u90e8\u5206\u6309\u952e\u6709\u53cd\u5e94\uff0c\u53ea\u6709\u53f3\u4e0a\u89d2\u8fdb\u5165/\u9000\u51fa\u5168\u5c4f\u624d\u80fd\u6062\u590d\u6b63\u5e38\u3002<br /><br />\u592a\u6298\u78e8\u4eba\u4e86\uff0c\u6709\u65f6\u5019\u67e5\u8d44\u6599\uff08\u95ee AI \uff09\u9700\u8981\u6d4f\u89c8\u5668\u3001IDEA \u6765\u56de\u5207\u6362\uff0c\u4f46\u7ecf\u5e38\u5361\u4f4f\uff0c\u5f88\u5f71\u54cd\u5fc3\u6001\uff0c\u5404\u4f4d\u5927\u4f6c\u9047\u89c1\u8fc7\u7c7b\u4f3c\u7684\u60c5\u51b5\u5417\uff0c\u5982\u4f55\u89e3\u51b3\u554a", 
      "date_published": "2026-01-29T08:38:29+00:00", 
      "title": "IDEA \u5728 macOS \u4e0a\u5361\u4f4f", 
      "id": "https://www.v2ex.com/t/1189317"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/JieyueXing", 
        "name": "JieyueXing", 
        "avatar": "https://cdn.v2ex.com/avatar/59da/4184/624907_large.png?m=1772415471"
      }, 
      "url": "https://www.v2ex.com/t/1189255", 
      "title": "Java \uff1a 2026 \u5e74 SpringBoot, Quarkus, Solon ?", 
      "id": "https://www.v2ex.com/t/1189255", 
      "date_published": "2026-01-29T05:28:24+00:00", 
      "content_html": "<p>\u751f\u6001/\u56e2\u961f\u534f\u4f5c\uff08 Spring Boot \uff09\u3001\u4e91\u539f\u751f\u4e0e\u6548\u7387\uff08 Quarkus \uff09\u3001\u56fd\u5185\u8f7b\u91cf\u4e0e\u5feb\uff08 Solon \uff09\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/l84", 
        "name": "l84", 
        "avatar": "https://cdn.v2ex.com/gravatar/5b36cf6907724c1357419e37926f99ab?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1189114", 
      "title": "\u4f6c\u4eec\u6709\u6ca1\u6709\u6bd4\u8f83\u597d\u7684 Java \u811a\u624b\u67b6", 
      "id": "https://www.v2ex.com/t/1189114", 
      "date_published": "2026-01-28T11:22:43+00:00", 
      "content_html": "<ul>\n<li>\u7c7b\u4f3c Spring Initializr \uff0c\u6bd4\u8f83\u5e72\u51c0\uff08\u4f46\u662f\u53c8\u592a\u7b80\u5355\uff09\u3002</li>\n<li>\u6700\u597d\u53ef\u4ee5\u81ea\u5df1\u9009\u67b6\u6784\u6a21\u5f0f\uff0c\u6bd4\u5982\u516d\u8fb9\u5f62 DDD \u67b6\u6784\u3001\u7ecf\u5178\u5206\u5c42\u7b49</li>\n</ul>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/f0rb", 
        "name": "f0rb", 
        "avatar": "https://cdn.v2ex.com/gravatar/5327037325f18648036ec7f257afd825?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1187556", 
      "date_modified": "2026-01-22T04:03:04+00:00", 
      "content_html": "<p>GitHub \u5730\u5740\uff1a <a href=\"https://github.com/f0rb/java-orm-comparison\" rel=\"nofollow\">https://github.com/f0rb/java-orm-comparison</a></p>\n<p>\u5305\u542b SpringDataJPA/SpringJdbc/jOOQ/MyBatis-plus \u7b49\u6846\u67b6\u5f00\u53d1\u52a8\u6001\u67e5\u8be2\u529f\u80fd\u7684\u4ee3\u7801\uff0c\u4ee5\u53ca\u4e0e DoytoQuery \u7684\u4ee3\u7801\u91cf\u548c\u6027\u80fd\u5bf9\u6bd4\u3002</p>\n", 
      "date_published": "2026-01-22T03:59:09+00:00", 
      "title": "\u4e00\u4e2a\u5bf9\u6bd4 JavaORM \u6846\u67b6\u7684\u5c0f\u4ed3\u5e93", 
      "id": "https://www.v2ex.com/t/1187556"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/pocketz", 
        "name": "pocketz", 
        "avatar": "https://cdn.v2ex.com/avatar/13d3/66d2/527904_large.png?m=1767746342"
      }, 
      "url": "https://www.v2ex.com/t/1183629", 
      "date_modified": "2026-01-07T01:10:37+00:00", 
      "content_html": "<h1>\u95ee\u9898</h1>\n<p>\u5982\u679c\u5bf9\u4e00\u4e2a InputStream \u8c03\u7528 read \u65b9\u6cd5\uff0c\u5728\u6ca1\u6709\u6570\u636e\u53ef\u8bfb\u53d6\u7684\u65f6\u5019\uff0c\u7406\u8bba\u4e0a\u4f1a\u5904\u4e8e\u963b\u585e\u72b6\u6001\u3002</p>\n<blockquote>\n<blockquote>\n<p>This method blocks until input data is available, end of file is detected, or an exception is thrown.</p>\n</blockquote>\n</blockquote>\n<p>\u90a3\u4e48\u5982\u679c\u4e00\u4e2a IO \u6d41\uff0c\u66fe\u7ecf\u6709\u6570\u636e\u53ef\u8bfb\u53d6\u4f46\u5df2\u7ecf\u88ab\u8bfb\u53d6\u5b8c\u6bd5\uff0c\u4f46\u540e\u7eed\u4ecd\u6709\u53ef\u80fd\u589e\u52a0\u53ef\u8bfb\u53d6\u7684\u6570\u636e\uff0c\u6b64\u65f6\u8c03\u7528 read \uff0c\u662f\u4e0d\u662f\u4ecd\u7136\u5c5e\u4e8e\u8fd9\u91cc\u6240\u8bf4\u7684\u201cblocks until input data is available\u201d\uff0c\u4e5f\u5c31\u662f\uff0c\u662f\u5426\u4f1a\u53d1\u751f\u963b\u585e\uff1f</p>\n<h1>\u4f8b\u5b50</h1>\n<p>\u6211\u83b7\u53d6\u4e86 Process \u7684 InputStream \uff0c\u91cc\u9762\u7684\u5185\u5bb9\u662f\u8fd9\u4e2a\u8fdb\u7a0b\u7684\u6807\u51c6\u8f93\u51fa\uff08\u4ee5\u53ca\u9519\u8bef\u8f93\u51fa\uff09\u3002<br/>\n\u663e\u7136\uff0c\u8fdb\u7a0b\u7684\u8f93\u51fa\u662f\u95f4\u65ad\u6027\u7684\uff0c\u6211\u60f3\u77e5\u9053\u73b0\u6709\u8f93\u51fa\u5df2\u7ecf\u88ab\u8bfb\u5b8c\u7684\u60c5\u51b5\u4e0b\uff0c\u6b64\u65f6\u518d\u8c03\u7528 read \uff0c\u662f\u5426\u8fd8\u4f1a\u5904\u4e8e\u963b\u585e\u72b6\u6001?</p>\n<pre><code class=\"language-Java\">    private ProcessBuilder dumpProcessBuilder;\n    ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream(1024);\n    ...\n    dumpProcessBuilder.redirectErrorStream(true);\n    ...\n    Process dumpProcess = dumpProcessBuilder.start();\n    try (InputStream in = procForReader.getInputStream()) {\n        byte[] buf = new byte[1024];\n        int bytesRead = 0;\n        while ((bytesRead = in.read(buf)) != -1) {\n            output.write(buf, 0, outputBuffer);\n        }\n    }\n    ...\n</code></pre>\n", 
      "date_published": "2026-01-07T01:03:12+00:00", 
      "title": "\u60f3\u95ee\u4e00\u4e2a\u5173\u4e8e IO \u6d41\u7684\u7ec6\u8282", 
      "id": "https://www.v2ex.com/t/1183629"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/deku9", 
        "name": "deku9", 
        "avatar": "https://cdn.v2ex.com/gravatar/4b2b0f7ee7a7ace326d7eb327e9ac154?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1183609", 
      "title": "\u5173\u4e8e\u6211\u5728\u817e\u8baf\u4e91 windows \u670d\u52a1\u5668\u8d77\u4e86\u4e00\u4e2a\u540e\u7aef\u670d\u52a1\uff0c\u4f46\u662f\u670d\u52a1\u5668\u672c\u5730\u90fd\u8bf7\u6c42\u4e0d\u5230\u7684\u95ee\u9898 11", 
      "id": "https://www.v2ex.com/t/1183609", 
      "date_published": "2026-01-06T15:47:31+00:00", 
      "content_html": "rt \uff0c\u6211\u5728\u672c\u5730\u548c\u670d\u52a1\u5668\u90fd\u8d77\u4e86\u540c\u4e00\u4e2a jar \u5305\uff0c\u4f46\u662f\u6211\u672c\u5730\u8bbf\u95ee url \u80fd\u8bf7\u6c42\u5230\u540e\u7aef\u3002<br />\u670d\u52a1\u5668\u4e0a\u8d77\u7684\u662f\u4e00\u6837\u7684 jar \u5305\uff0c\u8bbf\u95ee\u7684\u4e5f\u662f\u540c\u4e00\u4e2a url \uff0c\u4f46\u662f\u62a5 404 \u3002<br />\u672c\u5730\u548c\u670d\u52a1\u5668\u90fd\u662f\u7528 apifox \u53d1\u7684\u8bf7\u6c42\u3002<br />\u76f8\u5f53\u4e8e\u672c\u673a\u548c\u670d\u52a1\u5668\u8d77\u540c\u4e00\u4e2a jar \u5305\uff0c\u914d\u7f6e\u4e5f\u662f\u4e00\u6837\u7684\uff0c\u4f46\u662f\u670d\u52a1\u5668\u4e0a\u81ea\u5df1\u8c03\u4e0d\u901a\uff08\u672c\u5730 apifox \u8c03 locahost \u3002<br />\u6c42\u95ee\u5927\u4f6c\u8fd9\u662f\u5565\u539f\u56e0"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/JYii", 
        "name": "JYii", 
        "avatar": "https://cdn.v2ex.com/avatar/6002/b4c1/487287_large.png?m=1773624099"
      }, 
      "url": "https://www.v2ex.com/t/1183220", 
      "title": "\u5206\u4eab\u4e00\u4e2a idea \u7684\u65e0\u54cd\u5e94 bug\uff0c\u5982\u679c\u4f60\u4e5f\u9047\u5230", 
      "id": "https://www.v2ex.com/t/1183220", 
      "date_published": "2026-01-05T06:10:25+00:00", 
      "content_html": "\u4eca\u5929\u6253\u5f00\u7535\u8111 idea \u54cd\u5e94\u975e\u5e38\u6162\uff0c\u4f1a\u77ac\u95f4\u5403\u6ee1 CPU \uff0c\u754c\u9762\u4e0b\u53d1\u63d0\u793a\u65e0\u54cd\u5e94\uff0c\u6211\u6ca1\u6709\u5174\u8da3 dump \uff08\u516c\u53f8\u7684\u7834\u9879\u76ee\u770b\u7740\u90fd\u6076\u5fc3\u5462\uff09\uff0c\u53bb\u5b98\u65b9\u8bba\u575b\u641c\u4e86\u641c\uff0c\u770b\u8d77\u6765\u4e0d\u6b62\u6211\u4e00\u4e2a\u4eba\u3002<br />\u770b\u8d77\u6765\u50cf\u4e2a\u5185\u5b58\u6cc4\u9732\uff0c\u5728\u6253\u5f00\u5927\u578b\u9879\u76ee\u65f6\uff0c\u8f83\u957f\u65f6\u95f4\u4e0d\u5173\u673a\u6709\u51e0\u7387\u89e6\u53d1\u3002<br /><br />\u53c2\u8003\u94fe\u63a5\uff1a<br /><a target=\"_blank\" href=\"https://youtrack.jetbrains.com/issue/IDEA-383438/IDEA-2025.3.1-freezes-when-opening-big-Maven-project-at-org.jetbrains.idea.maven.project.MavenProjectCompanion.read\" rel=\"nofollow noopener\">https://youtrack.jetbrains.com/issue/IDEA-383438/IDEA-2025.3.1-freezes-when-opening-big-Maven-project-at-org.jetbrains.idea.maven.project.MavenProjectCompanion.read</a>"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Yasuke", 
        "name": "Yasuke", 
        "avatar": "https://cdn.v2ex.com/avatar/2805/3b00/625825_large.png?m=1774833511"
      }, 
      "url": "https://www.v2ex.com/t/1182231", 
      "date_modified": "2025-12-30T10:32:49+00:00", 
      "content_html": "\u788d\u4e8e Java \u548c C/C++\u7684\u7ebf\u7a0b\u6a21\u578b\u3001\u5185\u5b58\u7ba1\u7406\u673a\u5236\u7684\u4e0d\u540c\uff0c\u73b0\u5728 JNI \u7684\u5199\u6cd5\u5b9e\u5728\u8fc7\u4e8e\u5570\u55e6\uff0c\u867d\u7136\u5b89\u5168\u4e14\u7a33\u5b9a\u3002", 
      "date_published": "2025-12-30T10:07:15+00:00", 
      "title": "JNI \u662f\u5426\u6709\u5411\"\u7b80\u6d01\"\u6f14\u5316\u7684\u53ef\u80fd\uff1f", 
      "id": "https://www.v2ex.com/t/1182231"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/workWithMusic", 
        "name": "workWithMusic", 
        "avatar": "https://cdn.v2ex.com/avatar/f092/b694/683535_large.png?m=1766980311"
      }, 
      "url": "https://www.v2ex.com/t/1181887", 
      "date_modified": "2025-12-29T06:26:49+00:00", 
      "content_html": "<p>\u4f7f\u7528 springboot \u96c6\u6210 micrometer \u5b9e\u73b0\u81ea\u5b9a\u4e49 prometheus \u6307\u6807\u3002\n\u5047\u5982\u5728\u591a\u5b9e\u4f8b\u7684\u5546\u57ce\u7cfb\u7edf\u4e2d\u5b58\u5728\u4e00\u4e2a\u7528\u4e8e\u7edf\u8ba1\u5546\u54c1\u67e5\u770b\u6b21\u6570\u7684\u6307\u6807\uff0c\u540d\u4e3a item_view_count \uff0clabel\uff1a<code>item_id</code> \u3001<code>instance_id</code> \u3002\n\u5f53\u670d\u52a1\u91cd\u542f\u65f6\uff0c\u6309\u7167 micrometer \u7684\u9ed8\u8ba4\u884c\u4e3a\uff0c\u8fd9\u4e2a\u6307\u6807\u4f1a\u88ab\u7f6e\u4e3a 0 \u3002</p>\n<p>\u5bf9\u4e8e\u8fd9\u4e2a\u884c\u4e3a\u6211\u60f3\u5230\u4e86\u4e24\u79cd\u65b9\u6848\u3002</p>\n<ol>\n<li>\u5c06\u8fd9\u4e2a\u503c\u6301\u4e45\u5316\uff0c\u5e76\u4e14\u5728\u7b2c\u4e00\u6b21\u521b\u5efa\u6307\u6807\u65f6\u52a0\u8f7d\u3002</li>\n<li>\u670d\u52a1\u91cd\u542f\u540e\u4f7f\u7528\u65b0\u7684 instance_id \uff0c\u8fd9\u6837\u5728\u505a sum \u7edf\u8ba1\u65f6\u4e0d\u4f1a\u88ab\u91cd\u7f6e\u5f71\u54cd</li>\n</ol>\n<p>\u5404\u4f4d\u90fd\u662f\u5982\u4f55\u5904\u7406\u8fd9\u4e2a\u95ee\u9898\u5462\uff1f</p>\n", 
      "date_published": "2025-12-29T04:41:20+00:00", 
      "title": "\u591a\u5b9e\u4f8b springboot \u5fae\u670d\u52a1\u91cd\u542f\u65f6 Counter \u7c7b\u578b\u6307\u6807\u91cd\u7f6e\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1181887"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/WngShhng", 
        "name": "WngShhng", 
        "avatar": "https://cdn.v2ex.com/avatar/4df1/42ef/328355_large.png?m=1764323245"
      }, 
      "url": "https://www.v2ex.com/t/1180696", 
      "title": "\u8ba8\u8bba\u4e2a\u95ee\u9898\uff1a\u8be5\u4e0d\u8be5\u91cd\u5199 equal \u548c hashcode", 
      "id": "https://www.v2ex.com/t/1180696", 
      "date_published": "2025-12-23T07:50:34+00:00", 
      "content_html": "<p>\u548c AI \u4ea4\u6d41\u7684\u65f6\u5019\u4ea7\u751f\u7684\u4e00\u4e2a\u95ee\u9898\uff1a</p>\n<p>AI \u7684\u5927\u81f4\u7ed3\u8bba\u662f\uff0c\u5bf9\u4e8e\u4e1a\u52a1\u7c7b\uff0c\u5982\u679c\u5b58\u5728\u660e\u786e\u7684\u552f\u4e00\u6807\u8bc6\uff0c\u6bd4\u5982 ID \uff0c\u90a3\u4e48\u5e94\u8be5\u91cd\u5199\u8fd9\u4e24\u4e2a\u65b9\u6cd5\uff0c\u8fd9\u6837\u5728\u505a\u54c8\u5e0c\u8868\u4e4b\u7c7b\u7684\u65f6\u5019\u624d\u80fd\u76f4\u63a5\u4f7f\u7528\u4e1a\u52a1\u7c7b\u3002</p>\n<p>\u4f46\u6211\u8ba4\u4e3a\u7684\u662f\uff0c\u56e0\u4e3a\u5f53\u628a\u4e00\u4e2a\u5bf9\u8c61\u653e\u8fdb\u54c8\u5e0c\u8868\u7684\u65f6\u5019\uff0c\u6211\u4f1a\u9ed8\u8ba4\u5b83\u7684 hashcode \u65b9\u6cd5\u662f\u9ed8\u8ba4\u7684\uff0c\u4e5f\u5c31\u662f\u6bcf\u4e2a\u5bf9\u8c61\u6709\u552f\u4e00\u7684\u54c8\u5e0c\u503c\u3002\u5982\u679c\u91cd\u5199\u4e86 hashcode \uff0c\u90a3\u4e48\u5728\u4f7f\u7528\u7684\u8fc7\u7a0b\u4e2d\u5982\u679c\u4e0d\u77e5\u9053\u8fd9\u4e2a\u7c7b\u590d\u5199\u4e86 hashcode \uff0c\u90a3\u4e48\u5c31\u5bb9\u6613\u5bfc\u81f4\u4ee3\u7801\u95ee\u9898\u3002</p>\n<p>\u6240\u4ee5\uff0c\u6211\u60f3\u77e5\u9053\u505a java \u540e\u7aef\u7684\uff0c\u4f60\u4eec\u4e00\u822c\u4f1a\u91cd\u5199\u5417\uff1f</p>\n<p>AI \u7684\u4e00\u90e8\u5206\u539f\u6587\uff1a</p>\n<pre><code>\u5982\u679c\u629b\u5f00 \u201c\u6570\u91cf\u5360\u6bd4\u201d\uff0c\u805a\u7126\u4e8e\u300c\u5f00\u53d1\u4e2d\u9700\u8981\u91cd\u70b9\u8bbe\u8ba1\u3001\u4fdd\u8bc1\u6b63\u786e\u6027\u7684\u6838\u5fc3\u573a\u666f\u300d\uff0c\u91cd\u5199\u7684\u9891\u7387\u4f1a\u8fdc\u9ad8\u4e8e \u201c\u4e0d\u91cd\u5199\u201d \u7684\u6838\u5fc3\u573a\u666f\uff0c\u539f\u56e0\u5982\u4e0b\uff1a\n\n\u6838\u5fc3\u7c7b\u5fc5\u91cd\u5199\uff1a\u6240\u6709\u627f\u8f7d\u4e1a\u52a1\u6570\u636e\u7684\u6838\u5fc3\u7c7b\uff08\u5982 User \u3001Order \u3001Goods \u7b49\uff09\uff0c\u51e0\u4e4e 100% \u9700\u8981\u91cd\u5199 \u2014\u2014 \u8fd9\u662f\u4fdd\u8bc1\u54c8\u5e0c\u96c6\u5408\u6b63\u5e38\u5de5\u4f5c\u3001\u4e1a\u52a1\u5bf9\u8c61\u552f\u4e00\u6027\u5224\u65ad\u3001\u5e8f\u5217\u5316\u540e\u6bd4\u5bf9\u7b49\u6838\u5fc3\u529f\u80fd\u7684\u524d\u63d0\uff0c\u4e0d\u5b58\u5728 \u201c\u53ef\u9009\u201d \u7684\u7a7a\u95f4\uff1b\n\n\u91cd\u5199\u7684 \u201c\u91cd\u590d\u6027\u201d \u66f4\u9ad8\uff1a\u4e00\u4e2a\u9879\u76ee\u4e2d\uff0c\u6570\u636e\u627f\u8f7d\u7c7b\u7684\u6570\u91cf\u867d\u5c11\uff0c\u4f46\u6bcf\u4e2a\u7c7b\u7684\u5f00\u53d1\u90fd\u5fc5\u7136\u5305\u542b \u201c\u91cd\u5199 equals/hashCode\u201d \u8fd9\u4e00\u6b65\uff08\u65e0\u8bba\u662f\u624b\u52a8\u751f\u6210\u3001Lombok \u6ce8\u89e3\u8fd8\u662f Record \u7c7b\uff09\uff0c\u5c5e\u4e8e \u201c\u5fc5\u505a\u64cd\u4f5c\u201d\uff1b\u800c\u4e0d\u91cd\u5199\u7684\u7c7b\uff0c\u53ea\u662f \u201c\u65e0\u9700\u989d\u5916\u64cd\u4f5c\u201d\uff0c\u5e76\u975e \u201c\u4e3b\u52a8\u5f00\u53d1\u884c\u4e3a\u201d\uff1b\n\n\u5de5\u5177\u7684\u666e\u53ca\u4f50\u8bc1\u9ad8\u9891\u9700\u6c42\uff1aLombok \u7684 @EqualsAndHashCode \u3001Java 16 + \u7684 Record \u7c7b\uff08\u9ed8\u8ba4\u91cd\u5199\uff09\u3001IDE \u81ea\u52a8\u751f\u6210\u529f\u80fd\uff0c\u8fd9\u4e9b\u5de5\u5177\u7684\u5e7f\u6cdb\u4f7f\u7528\uff0c\u672c\u8d28\u662f\u56e0\u4e3a \u201c\u91cd\u5199\u201d \u662f\u5f00\u53d1\u4e2d\u7684\u9ad8\u9891\u9700\u6c42\uff0c\u624d\u4f1a\u6709\u5927\u91cf\u5de5\u5177\u6765\u7b80\u5316\u8fd9\u4e00\u64cd\u4f5c\u3002\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/heliotrope", 
        "name": "heliotrope", 
        "avatar": "https://cdn.v2ex.com/gravatar/f26ff0f38e2dd1247dca0a34e19b03d7?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1179190", 
      "date_modified": "2025-12-16T03:36:13+00:00", 
      "content_html": "<pre><code class=\"language-java\">public &lt;T&gt; void setCacheObject(final String key, final T value)\n{\n\tredisTemplate.opsForValue().set(key, value);\t\n}\n\npublic &lt;T&gt; T getCacheObject(final String key)\n{\n\tValueOperations&lt;String, T&gt; operation = redisTemplate.opsForValue();\n    return operation.get(key);\n}\n</code></pre>\n<p>\u8fd9\u4e2a\u903b\u8f91\u5728\u8c03\u7528 getCacheObject \u65f6\n\u8fd4\u56de\u5bf9\u8c61\u4f1a\u968f\u673a\u53d8\u6210 com.alibaba.fastjson.JSONObject \u6216\u8005 com.alibaba.fastjson2.JSONObject\n\u5bfc\u81f4\u5916\u90e8\u8c03\u7528\u65f6\u62a5\u7c7b\u578b\u5f3a\u5236\u8f6c\u6362\u5f02\u5e38</p>\n<p>\u5c31\u662f ruoyi \u811a\u624b\u67b6 \u91cc\u9762\u7684 RedisService\nTokenService \u91cc\u9762\u8c03\u7528 getLoginUser\n\u5c31\u4f1a\u62a5 java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.ruoyi.system.api.model.LoginUser</p>\n<p>\u800c\u4e14\u4e4b\u524d\u90fd\u6b63\u5e38 \u4e00\u6bb5\u65f6\u95f4\u6ca1\u8fd0\u884c \u518d\u8dd1\u5c31\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\n\u5b9a\u4e49\u662f\u5728 RedisConfig</p>\n<pre><code class=\"language-java\">RedisTemplate&lt;Object, Object&gt; template = new RedisTemplate&lt;&gt;();\ntemplate.setConnectionFactory(connectionFactory);\nFastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);\n</code></pre>\n<p>\u5168\u90e8\u90fd\u662f object \u83b7\u53d6\u5230\u5c31\u53d8 JSONObject \u4e86\n\u5b9e\u5728\u662f\u6ca1\u641e\u61c2\u54ea\u91cc\u6709\u95ee\u9898</p>\n", 
      "date_published": "2025-12-16T03:32:41+00:00", 
      "title": "\u6c42\u52a9 \u6cdb\u578b\u8f6c\u6362\u78b0\u5230\u4e00\u4e2a\u5f88\u5947\u602a\u7684\u95ee\u9898 Object \u653e Redis \u81ea\u52a8\u53d8\u6210 JSONObject \u4e86", 
      "id": "https://www.v2ex.com/t/1179190"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/tiRolin", 
        "name": "tiRolin", 
        "avatar": "https://cdn.v2ex.com/gravatar/34a55186afde13a3880f2970ecaeffdc?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1176980", 
      "title": "Java Agent \u8be5\u600e\u4e48\u5feb\u901f\u5b66\u4e60\uff1f\u6709\u6559\u7a0b\u6587\u6863\u63a8\u4e00\u4e0b\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1176980", 
      "date_published": "2025-12-04T12:43:34+00:00", 
      "content_html": "<p>\u6211\u6700\u8fd1\u5165\u804c\u4e86\u4e00\u5bb6\u65b0\u516c\u53f8\uff0c\u6211\u5728\u91cc\u9762\u4e3b\u8981\u662f\u8d1f\u8d23\u505a APM \uff0c\u4e3b\u8981\u4f7f\u7528 Java Agent \u53bb\u505a\uff0c\u6211\u53bb B \u7ad9\u627e\u4e86\u4e00\u4e9b\u6559\u7a0b\uff0c\u4f46\u662f\u90fd\u53ea\u662f\u4e00\u4e9b\u7b80\u5355\u5165\u95e8\u7684\u5185\u5bb9\uff0c\u516c\u53f8\u5185\u90e8\u4e5f\u6709\u63d0\u4f9b\u4e00\u4e9b\u6559\u7a0b\uff0c\u4f46\u662f\u76ee\u524d\u6211\u53ea\u770b\u5230\u4e86\u8ddf\u516c\u53f8\u4ea7\u54c1\u672c\u8eab\u76f8\u5173\u7684\u5185\u5bb9\uff0c\u6211\u60f3\u95ee\u95ee\u5404\u4f4d\u8be5\u600e\u4e48\u5feb\u901f\u5b66\u4e60 Java Agent \u5462\uff1f\u6709\u6ca1\u6709\u4ec0\u4e48\u6559\u7a0b\u63a8\u4e00\u4e0b\uff1f\u7ed9\u6211\u5173\u952e\u5b57\u6216\u8005\u662f\u6587\u6863\u94fe\u63a5\u5c31\u597d\uff0c\u6211\u4f1a\u81ea\u5df1\u53bb\u770b\u7684\uff0c\u89c6\u9891\u4e5f\u53ef\u4ee5\uff0c\u6211\u90fd\u4f1a\u53bb\u770b\u7684\u3002</p>\n<p>\u5c0f\u5f1f\u6211\u5728\u8fd9\u91cc\u5148\u8c22\u8c22\u5404\u4f4d\u4e86</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/reavid", 
        "name": "reavid", 
        "avatar": "https://cdn.v2ex.com/avatar/0918/86de/250976_large.png?m=1755611240"
      }, 
      "url": "https://www.v2ex.com/t/1176946", 
      "title": "\u80fd\u4e0d\u80fd\u522b\u7528\u90a3\u70e6\u4eba\u7684 MyBatis-Plus \u4e86\uff01", 
      "id": "https://www.v2ex.com/t/1176946", 
      "date_published": "2025-12-04T09:23:26+00:00", 
      "content_html": "<p>\u521a\u521a clone \u516c\u53f8\u7684\u9879\u76ee\u4ee3\u7801\uff0c\u770b\u5230\u4e00\u5806\u7684 Wrapper \u771f\u7684\u7ef7\u4e0d\u4f4f\u4e86\u3002\u597d\u597d\u7684\u5728 xml \u91cc\u9762\u5199 SQL \u4e0d\u597d\u5417\uff1f\u975e\u8981\u5728 Service \u5199\u90a3\u4e48\u591a\u548c\u4e1a\u52a1\u65e0\u5173\u7684\u4e1c\u897f\uff0c\u4ee3\u7801\u770b\u5f97\u6211\u5934\u5927\u3002</p>\n<pre><code class=\"language-java\">@Override\npublic int deleteByColorId(Long colorId,String userCode) {\n    LambdaUpdateWrapper&lt;ColorLibraryFile&gt;  updateWrapper = new LambdaUpdateWrapper&lt;&gt;();\n    updateWrapper.set(ColorLibraryFile::getDeletedFlag,DeletedFlagEnum.DELETE.getCode());\n    updateWrapper.set(ColorLibraryFile::getDeletedBy,userCode);\n    updateWrapper.set(ColorLibraryFile::getDeletedTime, new Date());\n    updateWrapper.eq(ColorLibraryFile::getColorId,colorId);\n    updateWrapper.eq(ColorLibraryFile::getDeletedFlag,DeletedFlagEnum.NORMAL.getCode());\n   return colorLibraryFileDao.update(null,updateWrapper);\n}\n\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/blababa", 
        "name": "blababa", 
        "avatar": "https://cdn.v2ex.com/gravatar/5b4e487de12f3dd63e2b9cea16d66418?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1176527", 
      "title": "\u4f5c\u4e3a Java boy \u4f60\u4eec\u4e1a\u4f59\u65f6\u95f4\u4f1a\u5b66\u70b9\u4ec0\u4e48\uff1f", 
      "id": "https://www.v2ex.com/t/1176527", 
      "date_published": "2025-12-03T01:38:29+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/xhf1024", 
        "name": "xhf1024", 
        "avatar": "https://cdn.v2ex.com/avatar/4c6f/0b47/452574_large.png?m=1763020279"
      }, 
      "url": "https://www.v2ex.com/t/1172567", 
      "title": "\u5404\u4f4d v \u53cb\u4eec\uff01\u6709\u65e0\u65e0\u654c\u597d\u7528\u7684\u526a\u8f91\u8f6f\u4ef6\u6c42\u63a8\u8350\uff01", 
      "id": "https://www.v2ex.com/t/1172567", 
      "date_published": "2025-11-13T07:52:43+00:00", 
      "content_html": "<p>\u6700\u8fd1\u9a6c\u4e0a\u8981\u7ed3\u5a5a\u4e86\uff0c\u4eb2\u53cb\u4eec\u7684\u89c6\u9891\u60f3\u81ea\u5df1\u62ff\u6765\u526a\u8f91\u526a\u8f91\uff01\u73a9\u4e00\u73a9\uff01</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/a33291", 
        "name": "a33291", 
        "avatar": "https://cdn.v2ex.com/avatar/e29e/fd46/582789_large.png?m=1752114948"
      }, 
      "url": "https://www.v2ex.com/t/1172483", 
      "date_modified": "2025-11-14T04:27:23+00:00", 
      "content_html": "", 
      "date_published": "2025-11-13T03:20:42+00:00", 
      "title": "\u5982\u4f55\u4ece\u53cd\u5c04\u7684 Field/Method \u52a8\u6001\u6784\u9020 mybatis \u7684 SFunction?", 
      "id": "https://www.v2ex.com/t/1172483"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/2018yuli", 
        "name": "2018yuli", 
        "avatar": "https://cdn.v2ex.com/gravatar/d895fb1ae2261f4e3156b62697670b05?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1172476", 
      "date_modified": "2025-11-13T03:18:39+00:00", 
      "content_html": "<p>\u53ef\u80fd\u662f Java \u5f97\u9879\u76ee\u90fd\u6bd4\u8f83\u5927\uff0c\u611f\u89c9\u73b0\u5728\u5176\u4ed6\u8bed\u8a00\u5f97\u5c0f\u9879\u76ee AI \u80fd\u63a5\u8fd1 100% \u7684\u5b8c\u6210\u3002\u4f46\u662f\u6253\u5f00\u4e00\u4e2a Java \u7684 cloud \u9879\u76ee\uff0c\u770b\u5230\u90a3\u65e0\u6570\u5e76\u5217\u7684 controller. AI \u90fd\u80fd\u626b\u5230 token \u8017\u5c3d\u3002\u7136\u540e\uff0c\u5b9e\u9645\u4e0a\uff0c\u4ed6\u771f\u7684\u6709\u5f88\u591a\u529f\u80fd\u4e48\uff1f\u5f88\u591a\u4e1a\u52a1\u4e48\uff1f</p>\n<p>\u6211\u5728\u60f3\uff0c\u4e3a\u4e86 AI \u9605\u8bfb\u65b9\u4fbf\uff0c\u6211\u4eec\u662f\u4e0d\u662f\u5e94\u8be5\u5c06\u6240\u6709 crud \u90fd\u7eb3\u5230\u6846\u67b6\u5c42\uff0c\u6216\u8005\u662f\u653e\u5230\u72ec\u7acb\u7684\u5305\u3002\u4e1a\u52a1\u5c42\u53ea\u6709\u5b58\u903b\u8f91\u3002\u63d0\u5347\u4fe1\u606f\u5bc6\u5ea6\u3002\u8fd9\u6837\u624d\u5bf9 AI \u53cb\u597d\uff0c\u5404\u4f4d\u89c9\u5f97\u5462\uff0cJava \u662f\u4e0d\u662f\u9700\u8981\u8fd9\u6837\u5b50\u7684\u6846\u67b6\u3002</p>\n<p>\u6211\u4e2a\u4eba\u6700\u8fd1\u597d\u4e45\u6ca1\u505a Java \u4e86\uff0c\u4e0d\u559c\u8f7b\u55b7\u3002</p>\n", 
      "date_published": "2025-11-13T03:02:55+00:00", 
      "title": "Java \u5f97\u5197\u4f59\u4e0e\u5570\u55e6\u662f\u4e0d\u662f\u5bf9 AI \u4e0d\u53cb\u597d", 
      "id": "https://www.v2ex.com/t/1172476"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ainyyy", 
        "name": "ainyyy", 
        "avatar": "https://cdn.v2ex.com/gravatar/b22c4dfe580d8c9bc4dfae25e9d06bf5?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1171249", 
      "title": "\u95ee\u4e00\u4e2a\u65e5\u5fd7\u4e0d\u6253\u5370\u6808\u4fe1\u606f\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1171249", 
      "date_published": "2025-11-07T08:21:39+00:00", 
      "content_html": "<p>\u90e8\u5206\u4ee3\u7801\u5982\u4e0b:</p>\n<pre><code class=\"language-java\">\t\t\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return RestResult.fail(\"\u7cfb\u7edf\u5f02\u5e38\");\n        }\n\n</code></pre>\n<p>\u65e5\u5fd7\u6587\u4ef6\u4e2d\u663e\u793a</p>\n<pre><code>2025-11-07 09:43:23.128 [http-nio-20001-exec-934] ERROR StoreOrderServiceImpl:557 - null\njava.lang.NullPointerException: null \n</code></pre>\n<p>\u7136\u540e\u5c31\u7ed3\u675f\u4e86, \u6700\u8fd1\u51fa\u4e86\u597d\u591a\u8fd9\u79cd\u95ee\u9898.  \u6253\u5370\u7a7a\u6307\u9488,\u4f46\u662f\u5b8c\u5168\u6ca1\u6709\u6808\u76f8\u5173\u4fe1\u606f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cocong", 
        "name": "cocong", 
        "avatar": "https://cdn.v2ex.com/avatar/63d3/f969/553019_large.png?m=1773881551"
      }, 
      "url": "https://www.v2ex.com/t/1171142", 
      "title": "\u4e3a\u4f55 RestTemplate \u65e0\u6cd5\u5b9a\u5236\u8bf7\u6c42", 
      "id": "https://www.v2ex.com/t/1171142", 
      "date_published": "2025-11-07T02:14:30+00:00", 
      "content_html": "<p>\u6211\u4eec\u9879\u76ee\u90fd\u662f\u914d\u7f6e\u4e00\u4e2a RestTemplate bean \uff0c\u7136\u540e\u6240\u6709\u5916\u90e8\u8bf7\u6c42\u90fd\u7528\u5b83\uff0c\u73b0\u5728\u6709\u4e2a\u9700\u6c42\u7684\u8d85\u65f6\u65f6\u95f4\u8981\u6c42\u4e0d\u4e00\u6837\uff0c\u5c31\u5f97\u91cd\u65b0\u5b9a\u4e49\u4e00\u4e2a bean \uff0c\u53c8\u5f97\u603c\u4e00\u5806\u914d\u7f6e\uff0c\u9ebb\u70e6\uff0c\u76f4\u63a5\u7528 simpleClientHttpRequestFactory \u53c8\u4e0d\u80fd\u7528\u5230\u8fde\u63a5\u6c60\uff0c\u6240\u4ee5\u4e3a\u4f55 RestTemplate \u4e0d\u652f\u6301\u5bf9\u6bcf\u4e2a\u8bf7\u6c42\u5b9a\u5236\u5316\uff0c\u5c31\u50cf\u4e8b\u52a1\u8d85\u65f6\u8bbe\u7f6e @<a href=\"/member/Transactional\">Transactional</a>(timeout = 3)\uff0c\u6bcf\u4e2a\u90fd\u53ef\u4ee5\u4e0d\u4e00\u6837\uff0c\u552f\u72ec\u8fd9\u4e2a\u5916\u90e8\u8bf7\u6c42\u6ca1\u6709\u8fd9\u79cd\u529f\u80fd\uff0c\u5c31\u611f\u89c9\u4e0d\u592a\u5408\u7406\u3002</p>\n<p>\u95ee\u4e86 AI \uff0c\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u65b9\u6cd5\uff0c\u4f46\u611f\u89c9\u8fd8\u662f\u592a\u9ebb\u70e6\u4e86\uff0c\u4e0d\u591f\u7b80\u5355\u4f18\u96c5</p>\n<h2>\u6b65\u9aa4 1\uff1a\u521b\u5efa\u4e00\u4e2a\u5168\u5c40\u5171\u4eab\u7684\u3001\u5e26\u8fde\u63a5\u6c60\u7684 CloseableHttpClient</h2>\n<pre><code class=\"language-java\">public class PooledRestClient {\n\n    private static final CloseableHttpClient httpClient;\n\n    static {\n        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();\n        cm.setMaxTotal(100);\n        cm.setDefaultMaxPerRoute(20);\n        // \u53ef\u9009\uff1a\u8bbe\u7f6e\u7a7a\u95f2\u8fde\u63a5\u6e05\u7406\n        httpClient = HttpClients.custom()\n                .setConnectionManager(cm)\n                .evictIdleConnections(60, TimeUnit.SECONDS)\n                .build();\n    }\n\n    // \u6838\u5fc3\u65b9\u6cd5\uff1a\u52a8\u6001\u53d1\u8d77\u8bf7\u6c42\n    public static ResponseEntity&lt;String&gt; exchange(\n            String url,\n            HttpMethod method,\n            HttpEntity&lt;?&gt; requestEntity,\n            Class&lt;String&gt; responseType,\n            int connectTimeoutMs,\n            int readTimeoutMs) {\n\n        HttpComponentsClientHttpRequestFactory factory =\n                new HttpComponentsClientHttpRequestFactory( httpClient);\n        factory.setConnectTimeout(connectTimeoutMs);\n        factory.setReadTimeout(readTimeoutMs);\n\n        RestTemplate restTemplate = new RestTemplate(factory);\n        return restTemplate.exchange(url, method, requestEntity, responseType);\n    }\n}\n</code></pre>\n<h2>\u6b65\u9aa4 2\uff1a\u5728\u4e1a\u52a1\u4ee3\u7801\u4e2d\u76f4\u63a5\u8c03\u7528\uff08\u65e0\u9700 Spring Bean \uff09</h2>\n<pre><code class=\"language-java\">// \u52a8\u6001\u6784\u9020\u8bf7\u6c42\u5934\nHttpHeaders headers = new HttpHeaders();\nheaders.set(\"Authorization\", \"Bearer \" + token);\nheaders.setContentType(MediaType.APPLICATION_JSON);\n\nHttpEntity&lt;String&gt; entity = new HttpEntity&lt;&gt;(\"{\\\"key\\\":\\\"value\\\"}\", headers);\n\n// \u53d1\u8d77\u5e26\u8fde\u63a5\u6c60\u7684\u8bf7\u6c42\uff08\u6bcf\u6b21 URL/Token/Body \u90fd\u53ef\u4e0d\u540c\uff09\nResponseEntity&lt;String&gt; response = PooledRestClient.exchange(\n        \"https://api.example.com/v1/data\",\n        HttpMethod.POST,\n        entity,\n        String.class,\n        3000,   // connect timeout\n        10000   // read timeout\n);\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dog82", 
        "name": "dog82", 
        "avatar": "https://cdn.v2ex.com/avatar/f971/879d/149284_large.png?m=1576045483"
      }, 
      "url": "https://www.v2ex.com/t/1170596", 
      "title": "\u65e5\u7ecf\u5410\u69fd\uff1a\u73b0\u5728\u7684 Java \u8bed\u8a00\u771f\u7684\u6709\u70b9\u4ee4\u4eba\u6076\u5fc3", 
      "id": "https://www.v2ex.com/t/1170596", 
      "date_published": "2025-11-05T02:17:52+00:00", 
      "content_html": "<p>\u6211\u4e4b\u524d\u5728 java1.4/1.5/weblogic \u65f6\u4ee3\u505a\u4e86\u591a\u4e2a java \u9879\u76ee\uff0c\u540e\u6765\u8f6c\u6218 Go \u8bed\u8a00\u591a\u5e74\uff0c\u73b0\u5728\u518d\u8fd4\u56de\u6765\u505a java \u9879\u76ee\uff0c\u6709\u70b9 hold \u4e0d\u4f4f\u4e86\u2026\u2026\n1 \u3001\u5404\u79cd\u8bed\u6cd5\u7cd6\u53e0\u52a0\u8d77\u6765\uff0c\u975e\u5e38\u4e0d\u76f4\u89c2\u3002\u76d0\u591a\u4e86\u52a0\u6c34\uff0c\u6c34\u591a\u4e86\u52a0\u76d0\uff0c\u770b\u7c7b\u5e93\u7684\u6e90\u7801\u5c31\u50cf\u770b\u7532\u9aa8\u6587\uff0c\u8111\u5b50\u5feb\u62e7\u6210\u9ebb\u82b1\u4e86\uff1b\n2 \u3001\u6574\u4e2a\u6280\u672f\u4f53\u7cfb java+spring boot+cloud \u592a\u5e9e\u6742\uff0c\u5b66\u4e60\u6210\u672c\u548c\u4f7f\u7528\u6210\u672c\u975e\u5e38\u9ad8\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dzdh", 
        "name": "dzdh", 
        "avatar": "https://cdn.v2ex.com/avatar/1683/7ebf/226307_large.png?m=1757987240"
      }, 
      "url": "https://www.v2ex.com/t/1169693", 
      "title": "\u65b0\u624b javaer \u54a8\u8be2\u51e0\u4e2a\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1169693", 
      "date_published": "2025-10-31T06:12:41+00:00", 
      "content_html": "<p>\u5b66\u4e86\u5927\u6982\u4e00\u5468\u505a\u4e86\u70b9\u684c\u9762\u5c0f\u73a9\u610f\u513f\uff0c\u505a\u4e86\u51e0\u4e2a demo \u7f51\u7ad9\uff0c\u6709\u4e9b\u8bb8\u7591\u60d1\u6709\u6ca1\u6709 java \u524d\u8f88\u6307\u70b9\u4e00\u4e0b\u3002</p>\n<p>\u6211\u77e5\u9053 java ee \u662f\u4e2a\u89c4\u8303\uff08\u8fd9\u4e2a\u89c4\u8303\u662f\u4e66\u9762\u6587\u6863\u800c\u5df2\uff0c\u662f\u4e2a\u5021\u8bae\uff1f\u8fd8\u662f\u4e00\u4e9b\u5177\u4f53\u7684 API \u4e14\u5185\u7f6e\u7684\uff1f\uff09\n\u7136\u540e JavaEE \u4ea4\u7ed9\u4e86 Eclipse \u73b0\u5728\u53eb JakartaEE \u6211\u770b\u5230\u6709\u4e00\u4e9b\u5305\u540d\u662f jakarta.* \u6240\u4ee5\u5e94\u8be5\u662f\u4e00\u4e9b\u5177\u4f53\u7684 jdk \u5185\u7f6e\u7684\u5305\uff1f\u6216\u4e09\u65b9\u5305\uff1f</p>\n<p>spring \u662f\u4e2a\u4ec0\u4e48\u4e1c\u897f\uff1f\u662f\u7c7b\u4f3c php \u7684 laravel \uff0cpython \u7684 fastapi \uff0cgo \u7684 gin \uff0crust \u7684 tokio \u5417\uff1f\u53ea\u662f\u5728\u67d0\u4e2a\u9886\u57df\u7684\u4e8b\u5b9e\u6807\u51c6\uff0c\u53ea\u662f\u5927\u591a\u6570\u4eba\u7528\uff0c\u4f46\u4e0d\u5f3a\u5236\uff1f</p>\n<p>netty \u53c8\u662f\u4e2a\u5565\uff1f\u6587\u6863\u8bf4\u540c\u7b49\u529f\u80fd\u7684\u8fd8\u6709 undertow \u3001tomcat-embed \uff0c\u4e5f\u53ea\u662f\u57fa\u4e8e\u5185\u7f6e NIO \u5b9e\u73b0\u7684\u201c\u5b9e\u65f6\u6807\u51c6\u201d\u6846\u67b6\u5417\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Lucy2002", 
        "name": "Lucy2002", 
        "avatar": "https://cdn.v2ex.com/avatar/357c/49a6/628579_large.png?m=1683833819"
      }, 
      "url": "https://www.v2ex.com/t/1169512", 
      "title": "\u81ea\u5b66 Java \u770b\u4e0d\u61c2\u62a5\u9519\u4fe1\u606f\u548c\u4ee3\u7801\uff0c\u6709\u4ec0\u4e48\u63a8\u8350 ai \u62ff\u6765\u81ea\u5b66\u7684\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1169512", 
      "date_published": "2025-10-30T10:47:15+00:00", 
      "content_html": "<p>\u7b97\u662f\u534a\u5c0f\u767d\uff0c\u6c42\u63a8\u8350\u81ea\u5b66\u80fd\u7528\u6765\u89e3\u91ca\u4ee3\u7801\u548c\u62a5\u9519\u7684 AI \u3002\ud83e\udd17</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/montaro2017", 
        "name": "montaro2017", 
        "avatar": "https://cdn.v2ex.com/avatar/5672/5388/583325_large.png?m=1765365176"
      }, 
      "url": "https://www.v2ex.com/t/1169319", 
      "date_modified": "2025-10-30T01:52:24+00:00", 
      "content_html": "<p>\u516c\u53f8\u6709\u4e00\u53f0\u670d\u52a1\u5668\uff0c\u6709\u5f88\u591a\u4e2a\u516c\u7f51 IP \uff0c\u5c31\u60f3\u7740\u80fd\u4e0d\u80fd\u5229\u7528\u8d77\u6765\u3002</p>\n<p>\u7136\u540e\u73b0\u5728\u6709\u4e00\u4e2a\u4efb\u52a1\u662f\u7528\u6d4f\u89c8\u5668\u6253\u5f00\u6307\u5b9a\u7f51\u5740\uff0c\u8fd4\u56de\u7f51\u9875\u6e90\u4ee3\u7801\uff0c\u6211\u5c31\u6253\u7b97\u628a\u8fd9\u4e2a\u670d\u52a1\u5668\u505a\u6210\u4ee3\u7406\u670d\u52a1\u5668\u3002</p>\n<p>\u672c\u6765\u662f\u8ba1\u5212\u6bcf\u4e2a IP \u505a\u4e00\u4e2a\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u4ee3\u7406\u670d\u52a1\u5668\u6839\u636e\u5165\u53e3 IP \u7528\u5bf9\u5e94\u7684 IP \u8fde\u63a5\u76ee\u6807\u670d\u52a1\u5668\u3002</p>\n<p>\u5f00\u542f\u6bcf\u4e2a\u6d4f\u89c8\u5668\u7684\u65f6\u5019\u8bbe\u7f6e\u4ee3\u7406\u5730\u5740\uff0c\u6bd4\u5982 1.2.3.4:8639, 1.2.3.5:8639 \u8fd9\u6837 \u3002</p>\n<p>\u7136\u540e\u53d1\u73b0\u591a\u5f00\u6d4f\u89c8\u5668\u975e\u5e38\u5403\u6027\u80fd\uff0c\u8981\u5145\u5206\u5229\u7528\u6240\u6709\u7684\u516c\u7f51 IP \u5f97\u5f00\u51e0\u5341\u4e2a\u6d4f\u89c8\u5668\uff0c\u8fd9\u65f6\u5019\u5df2\u7ecf\u5361\u5230\u52a8\u4e0d\u4e86\u4e86\uff0c\u80af\u5b9a\u4e0d\u884c\u3002</p>\n<p>\u6240\u4ee5\u6211\u5c31\u60f3\u5f00 4 \u4e2a\u6d4f\u89c8\u5668\uff0c\u6bcf\u4e2a\u6d4f\u89c8\u5668\u8bbe\u7f6e\u4e00\u4e2a\u4ee3\u7406\uff0c\u7136\u540e\u901a\u8fc7\u63a5\u53e3\u53bb\u5207\u6362\u4ee3\u7406\u540e\u7aef\u7684\u51fa\u53e3\u3002</p>\n<p>\u4ee3\u7406\u670d\u52a1\u5668\u662f\u7528 netty \u5199\u7684\uff0c\u903b\u8f91\u6539\u6210\u4e86\u7ed1\u5b9a\u4e0d\u540c\u7aef\u53e3\uff0c\u7136\u540e\u901a\u8fc7\u63a5\u53e3\u6307\u5b9a\u7aef\u53e3\u53f7\u548c\u51fa\u53e3 IP \uff0c\u6765\u5207\u6362\u4e0d\u540c\u7aef\u53e3\u5bf9\u5e94\u4ee3\u7406\u7684\u51fa\u53e3 IP \u3002</p>\n<p>\u5176\u5b9e\u5c31\u662f\u5b58\u4e86\u4e00\u4e2a Map&lt;Integer, String&gt;\uff0c\u8c03\u63a5\u53e3\u4fee\u6539\u8fd9\u4e2a map \uff0cnetty \u4ee3\u7406\u670d\u52a1\u5668\u8fde\u63a5\u76ee\u6807\u670d\u52a1\u5668\u7684\u65f6\u5019\u4f7f\u7528\u51fa\u53e3\u5730\u5740\u53bb\u8fde\u63a5\u3002</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/ENpcItt.png\"/></p>\n<p>\u73b0\u5728\u95ee\u9898\u5728\u4e8e\uff0c\u8c03\u7528\u63a5\u53e3\u5207\u6362\u51fa\u53e3 IP \u540e\uff0c\u65e5\u5fd7\u663e\u793a\u5df2\u7ecf\u4f7f\u7528\u65b0\u7684\u51fa\u53e3 IP \u4e86\uff0c\u4f46\u662f\u8bbf\u95ee\u67e5\u8be2 IP \u7684\u7f51\u7ad9\uff0c\u8fd8\u662f\u4f7f\u7528\u4e4b\u524d\u7684 IP \uff0c\u597d\u50cf\u8981\u7b49\u4e00\u6bb5\u65f6\u95f4\u624d\u751f\u6548\uff0c\u8fd9\u662f\u4ec0\u4e48\u95ee\u9898\uff0c\u6c42\u5404\u4f4d\u5927\u4f6c\u6307\u6559</p>\n<pre><code class=\"language-java\">@Log4j2\npublic class ProxyFrontendHandler extends SimpleChannelInboundHandler&lt;FullHttpRequest&gt; {\n\n    private final AddressFunction addressFunction;\n\n    public ProxyFrontendHandler(AddressFunction addressFunction) {\n        this.addressFunction = addressFunction;\n    }\n\n    @Override\n    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) {\n        if (HttpMethod.CONNECT.equals(req.method())) {\n            handleConnectRequest(ctx, req);\n            return;\n        }\n        handleHttpRequest(ctx, req);\n    }\n\n    private void handleConnectRequest(ChannelHandlerContext ctx, FullHttpRequest req) {\n        List&lt;String&gt; split = StrUtil.split(req.uri(), \":\");\n        String host = CollUtil.getFirst(split);\n        int port = Convert.toInt(CollUtil.get(split, 1), 443);\n\n        Bootstrap bootstrap = new Bootstrap();\n        bootstrap.group(ctx.channel().eventLoop())\n                .channel(NioSocketChannel.class)\n                .handler(new ChannelInitializer&lt;SocketChannel&gt;() {\n                    @Override\n                    protected void initChannel(SocketChannel ch) {\n                        ch.pipeline().addLast(new RelayHandler(ctx.channel()));\n                    }\n                });\n\n        ChannelFuture connectFuture;\n        InetSocketAddress remoteAddress = new InetSocketAddress(host, port);\n        InetSocketAddress sourceAddress = addressFunction.apply(ctx);\n        if (sourceAddress != null) {\n            log.info(\"Using outbound: {} | host: {}\", sourceAddress, remoteAddress.getHostString());\n            connectFuture = bootstrap.connect(remoteAddress, sourceAddress);\n        } else {\n            connectFuture = bootstrap.connect(remoteAddress);\n        }\n        connectFuture.addListener((ChannelFutureListener) future -&gt; {\n            if (future.isSuccess()) {\n                Channel outboundChannel = future.channel();\n                DefaultFullHttpResponse response = new DefaultFullHttpResponse(\n                        HttpVersion.HTTP_1_1,\n                        HttpResponseStatus.OK\n                );\n                response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);\n                ctx.writeAndFlush(response).addListener((ChannelFutureListener) f -&gt; {\n                    try {\n                        ctx.pipeline().remove(HttpServerCodec.class);\n                        ctx.pipeline().remove(HttpObjectAggregator.class);\n                        ctx.pipeline().addLast(new RelayHandler(outboundChannel));\n                    } catch (Exception ignored) {\n                    }\n                });\n            } else {\n                sendErrorResponse(ctx, \"\u65e0\u6cd5\u8fde\u63a5\u5230\u76ee\u6807\u670d\u52a1\u5668\");\n                closeOnFlush(ctx.channel());\n            }\n        });\n    }\n\n    private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {\n        String host = req.headers().get(HttpHeaderNames.HOST);\n        if (host == null) {\n            sendErrorResponse(ctx, \"\u7f3a\u5c11 Host \u5934\");\n            closeOnFlush(ctx.channel());\n            return;\n        }\n        String[] hostParts = host.split(\":\");\n        String targetHost = hostParts[0];\n        int targetPort = hostParts.length &gt; 1 ? Integer.parseInt(hostParts[1]) : 80;\n        // \u4fee\u6539\u8bf7\u6c42 URI \u4e3a\u7edd\u5bf9\u8def\u5f84\n        req.setUri(req.uri().replace(\"http://\" + host, \"\"));\n        req.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);\n\n        // \u590d\u5236\u8bf7\u6c42\u4ee5\u907f\u514d\u5728\u5f02\u6b65\u64cd\u4f5c\u671f\u95f4\u88ab\u91ca\u653e\n        FullHttpRequest copiedReq = req.copy();\n        // \u521b\u5efa\u5230\u76ee\u6807\u670d\u52a1\u5668\u7684\u8fde\u63a5\n        Bootstrap bootstrap = new Bootstrap();\n        bootstrap.group(ctx.channel().eventLoop())\n                .channel(NioSocketChannel.class)\n                .handler(new ChannelInitializer&lt;SocketChannel&gt;() {\n                    @Override\n                    protected void initChannel(SocketChannel ch) {\n                        ch.pipeline().addLast(new HttpClientCodec());\n                        ch.pipeline().addLast(new HttpObjectAggregator(1024 * 1024)); // \u589e\u52a0\u5230 1MB\n                        ch.pipeline().addLast(new RelayHandler(ctx.channel()));\n                    }\n                });\n        ChannelFuture connectFuture;\n        InetSocketAddress remoteAddress = new InetSocketAddress(targetHost, targetPort);\n        InetSocketAddress sourceAddress = addressFunction.apply(ctx);\n        if (sourceAddress != null) {\n            log.info(\"Using outbound: {} | host: {}\", sourceAddress, remoteAddress.getHostString());\n            connectFuture = bootstrap.connect(remoteAddress, sourceAddress);\n        } else {\n            connectFuture = bootstrap.connect(remoteAddress);\n        }\n        connectFuture.addListener((ChannelFutureListener) future -&gt; {\n            if (future.isSuccess()) {\n                future.channel().writeAndFlush(copiedReq);\n            } else {\n                closeOnFlush(ctx.channel());\n            }\n            if (copiedReq.refCnt() != 0) {\n                copiedReq.release();\n            }\n        });\n    }\n\n    private void sendErrorResponse(ChannelHandlerContext ctx, String message) {\n        FullHttpResponse response = new DefaultFullHttpResponse(\n                HttpVersion.HTTP_1_1,\n                HttpResponseStatus.BAD_GATEWAY,\n                Unpooled.wrappedBuffer(message.getBytes())\n        );\n        response.headers().set(HttpHeaderNames.CONTENT_TYPE, \"text/plain; charset=UTF-8\");\n        response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());\n        ctx.writeAndFlush(response);\n    }\n\n    @Override\n    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {\n        if (cause instanceof SocketException) {\n            closeOnFlush(ctx.channel());\n            return;\n        }\n        log.error(cause.getMessage());\n        closeOnFlush(ctx.channel());\n    }\n\n    private void closeOnFlush(Channel ch) {\n        if (ch.isActive()) {\n            ch.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);\n        }\n    }\n}\n</code></pre>\n<pre><code class=\"language-java\">@Log4j2\npublic class RelayHandler extends ChannelInboundHandlerAdapter {\n\n    private final Channel relayChannel;\n\n    public RelayHandler(Channel relayChannel) {\n        this.relayChannel = relayChannel;\n    }\n\n    @Override\n    public void channelActive(ChannelHandlerContext ctx) {\n        ctx.read();\n    }\n\n    @Override\n    public void channelRead(ChannelHandlerContext ctx, Object msg) {\n        if (relayChannel.isActive()) {\n            relayChannel.writeAndFlush(msg).addListener((ChannelFutureListener) future -&gt; {\n                if (future.isSuccess()) {\n                    ctx.read(); // \u7ee7\u7eed\u8bfb\u53d6\u6570\u636e\n                } else {\n                    future.channel().close();\n                }\n            });\n        } else {\n            closeOnFlush(ctx.channel());\n        }\n    }\n\n    @Override\n    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {\n        log.error(cause);\n        closeOnFlush(ctx.channel());\n    }\n\n    private void closeOnFlush(Channel ch) {\n        if (ch.isActive()) {\n            ch.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);\n        }\n    }\n}\n\n</code></pre>\n", 
      "date_published": "2025-10-30T01:50:20+00:00", 
      "title": "\u7528 netty \u7f16\u5199\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u5207\u6362\u51fa\u53e3 IP\uff0c\u4e0d\u80fd\u53ca\u65f6\u751f\u6548", 
      "id": "https://www.v2ex.com/t/1169319"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lingerr", 
        "name": "lingerr", 
        "avatar": "https://cdn.v2ex.com/gravatar/83f287b186c64c14e7616c26e3be953e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1168921", 
      "title": "mysql \u6162\u65e5\u5fd7\u5206\u6790\u6392\u67e5\u5c0f\u5de5\u5177 1.0.0", 
      "id": "https://www.v2ex.com/t/1168921", 
      "date_published": "2025-10-28T07:18:45+00:00", 
      "content_html": "<p>\u518d\u53d1\u4e00\u6b21\u54af, \u73b0\u5728\u6392\u884c\u4e5f\u652f\u6301\u5206\u9875\u4e86</p>\n<p>\u540e\u7aef\u5f00\u53d1\u65e5\u5e38\u5c11\u4e0d\u4e86\u6392\u67e5\u6162 SQL \u3002\u5e73\u65f6\u6211\u90fd\u662f\u7528 mysqldumpslow \u6216 pt-query-digest \u6765\u5206\u6790\u65e5\u5fd7\uff0c\u4f46\u547d\u4ee4\u884c\u770b\u7740\u592a\u4e0d\u76f4\u89c2\u3002\n\u4e8e\u662f\u6211\u5199\u4e86\u4e00\u4e2a\u53ef\u89c6\u5316\u5c0f\u5de5\u5177\uff0c\u53ef\u4ee5\u628a\u6162\u65e5\u5fd7\u7ed3\u679c\u76f4\u63a5\u5c55\u793a\u6210\u8868\u683c\uff0c\u5e76\u652f\u6301\u53c2\u6570\u6392\u5e8f\uff1a</p>\n<p>c\uff1a\u8bbf\u95ee\u6b21\u6570</p>\n<p>l\uff1a\u9501\u5b9a\u65f6\u95f4</p>\n<p>r\uff1a\u8fd4\u56de\u8bb0\u5f55\u6570</p>\n<p>t\uff1a\u67e5\u8be2\u65f6\u95f4</p>\n<p>al\uff1a\u5e73\u5747\u9501\u5b9a\u65f6\u95f4</p>\n<p>ar\uff1a\u5e73\u5747\u8fd4\u56de\u8bb0\u5f55\u6570</p>\n<p>at\uff1a\u5e73\u5747\u67e5\u8be2\u65f6\u95f4</p>\n<p>\ud83d\udc49 \u5728\u7ebf\u4f53\u9a8c\u5730\u5740\uff1a <a href=\"http://tool.linger.host/tools/mysql-analysis\" rel=\"nofollow\">http://tool.linger.host/tools/mysql-analysis</a></p>\n<p>\u6b22\u8fce\u5927\u5bb6\u4f53\u9a8c\u4e0b\uff0c\u6709\u4ec0\u4e48\u4f18\u5316\u5efa\u8bae\u4e5f\u6b22\u8fce\u7559\u8a00\u4ea4\u6d41\uff01</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/a33291", 
        "name": "a33291", 
        "avatar": "https://cdn.v2ex.com/avatar/e29e/fd46/582789_large.png?m=1752114948"
      }, 
      "url": "https://www.v2ex.com/t/1168328", 
      "date_modified": "2025-10-25T12:43:20+00:00", 
      "content_html": "\u6709\u51e0\u4e2a\u7591\u95ee<br /><br />1. \u6bcf\u4e2a\u72ec\u7acb\u7684\u5e94\u7528\u90fd\u7528 Preferences.userNodeForPackage(Object.class)\u83b7\u53d6\u5230\u7684 Preferences \u8fdb\u884c\u5b58\u50a8,\u5219\u4ed6\u4eec\u662f\u76f8\u4e92\u9694\u79bb\u7684\u8fd8\u662f\u4f1a\u4e92\u76f8\u5f71\u54cd?<br />2. \u5b58\u50a8\u4f4d\u7f6e\u5728\u54ea\u513f(win)? \u6211\u95ee AI \u548c google \u90fd\u8bf4\u5728\u6ce8\u518c\u8868\u7684 HKEY_CURRENT_USER\\Software\\JavaSoft\\Prefs\\ \u4e0b,\u4ee5\u5305\u540d\u4e3a\u5b50\u952e\u7684\u4f4d\u7f6e,\u4f46\u662f\u6211\u6d4b\u8bd5\u8fd0\u884c\u53d1\u73b0\u5e76\u6ca1\u6709\u627e\u5230,\u4f46\u662f\u7684\u5374\u4f18\u52bf\u5b58\u50a8\u6210\u529f,\u56e0\u4e3a\u80fd\u8bfb\u51fa\u6765<br />3. \u4f7f\u7528\u8fd9\u4e2a\u5b58\u50a8\u654f\u611f\u4fe1\u606f(\u5bc6\u7801\u4e4b\u7c7b)\u5408\u9002\u561b?<br /><br />\u611f\u8c22", 
      "date_published": "2025-10-25T10:07:43+00:00", 
      "title": "Preferences.userNodeForPackage(Object.class)\u5b58\u50a8\u4f4d\u7f6e\u5728\u54ea\u91cc?", 
      "id": "https://www.v2ex.com/t/1168328"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/pony2335", 
        "name": "pony2335", 
        "avatar": "https://cdn.v2ex.com/gravatar/e1c3b8baf61c009f01304cb23d9d60d6?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1168311", 
      "title": "vscode \u4e2d augment code \u600e\u4e48\u4f7f\u7528 mcp", 
      "id": "https://www.v2ex.com/t/1168311", 
      "date_published": "2025-10-25T07:43:10+00:00", 
      "content_html": "<p>\u73b0\u6709\u4e2a\u9879\u76ee\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u4f7f\u7528 mcp \u529f\u80fd\u7684 mysql \u8fde\u63a5\u5230\u6570\u636e\u5e93\uff0c\u5e2e\u52a9\u5927\u6a21\u578b\u66f4\u597d\u7684\u7406\u89e3\u4e1a\u52a1\uff0c\u627e\u4e86\u534a\u5929\u6ca1\u627e\u5230\u6559\u7a0b\uff0c\u7279\u610f\u6765 V2EX \u6c42\u52a9</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lingerr", 
        "name": "lingerr", 
        "avatar": "https://cdn.v2ex.com/gravatar/83f287b186c64c14e7616c26e3be953e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1168213", 
      "title": "mysql \u6162\u65e5\u5fd7\u5206\u6790\u6392\u67e5\u5c0f\u5de5\u5177", 
      "id": "https://www.v2ex.com/t/1168213", 
      "date_published": "2025-10-24T10:36:30+00:00", 
      "content_html": "<p>\u540e\u7aef\u5f00\u53d1\u65e5\u5e38\u5c11\u4e0d\u4e86\u6392\u67e5\u6162 SQL \u3002\u5e73\u65f6\u6211\u90fd\u662f\u7528 mysqldumpslow \u6216 pt-query-digest \u6765\u5206\u6790\u65e5\u5fd7\uff0c\u4f46\u547d\u4ee4\u884c\u770b\u7740\u592a\u4e0d\u76f4\u89c2\u3002\n\u4e8e\u662f\u6211\u5199\u4e86\u4e00\u4e2a\u53ef\u89c6\u5316\u5c0f\u5de5\u5177\uff0c\u53ef\u4ee5\u628a\u6162\u65e5\u5fd7\u7ed3\u679c\u76f4\u63a5\u5c55\u793a\u6210\u8868\u683c\uff0c\u5e76\u652f\u6301\u53c2\u6570\u6392\u5e8f\uff08 Top 10 \uff09\uff1a</p>\n<p>c\uff1a\u8bbf\u95ee\u6b21\u6570</p>\n<p>l\uff1a\u9501\u5b9a\u65f6\u95f4</p>\n<p>r\uff1a\u8fd4\u56de\u8bb0\u5f55\u6570</p>\n<p>t\uff1a\u67e5\u8be2\u65f6\u95f4</p>\n<p>al\uff1a\u5e73\u5747\u9501\u5b9a\u65f6\u95f4</p>\n<p>ar\uff1a\u5e73\u5747\u8fd4\u56de\u8bb0\u5f55\u6570</p>\n<p>at\uff1a\u5e73\u5747\u67e5\u8be2\u65f6\u95f4</p>\n<p>\ud83d\udc49 \u5728\u7ebf\u4f53\u9a8c\u5730\u5740\uff1a <a href=\"http://tool.linger.host/tools/mysql-analysis\" rel=\"nofollow\">http://tool.linger.host/tools/mysql-analysis</a></p>\n<p>\u6b22\u8fce\u5927\u5bb6\u4f53\u9a8c\u4e0b\uff0c\u6709\u4ec0\u4e48\u4f18\u5316\u5efa\u8bae\u4e5f\u6b22\u8fce\u7559\u8a00\u4ea4\u6d41\uff01</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/YanSeven", 
        "name": "YanSeven", 
        "avatar": "https://cdn.v2ex.com/avatar/3f22/feff/383743_large.png?m=1775465214"
      }, 
      "url": "https://www.v2ex.com/t/1168179", 
      "date_modified": "2025-10-24T08:35:18+00:00", 
      "content_html": "\u5404\u79cd\u4e8c\u8fdb\u5236\u6253\u5728\u955c\u50cf\u91cc\u9762\u4e5f\u7b97\u662f\u4e00\u6b21\u7f16\u8bd1\u5230\u5904\u8fd0\u884c\u5427\u3002", 
      "date_published": "2025-10-24T08:34:50+00:00", 
      "title": "Java \u7684\u4e00\u6b21\u7f16\u8bd1\u5230\u5904\u8fd0\u884c\u5728\u76ee\u524d\u8fd8\u6709\u4f18\u52bf\u5417", 
      "id": "https://www.v2ex.com/t/1168179"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dzdh", 
        "name": "dzdh", 
        "avatar": "https://cdn.v2ex.com/avatar/1683/7ebf/226307_large.png?m=1757987240"
      }, 
      "url": "https://www.v2ex.com/t/1166867", 
      "title": "\u73b0\u5728\u5b66 Java \u7b97 49 \u5e74\u5165\u56fd\u519b\u5417", 
      "id": "https://www.v2ex.com/t/1166867", 
      "date_published": "2025-10-20T01:31:22+00:00", 
      "content_html": "<p>\u672c\u804c\u662f\u62cd\u9ec4\u7247 \u53bb \u5c41\u773c\u901a\u7ea2</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Aresxue", 
        "name": "Aresxue", 
        "avatar": "https://cdn.v2ex.com/avatar/9d20/b69c/401577_large.png?m=1760441381"
      }, 
      "url": "https://www.v2ex.com/t/1165225", 
      "title": "\u63a8\u5e7f\u4e00\u4e0b\u81ea\u5df1\u521a\u64b8\u7684 IDEA \u63d2\u4ef6\u2014Bean Copy \u52a9\u624b", 
      "id": "https://www.v2ex.com/t/1165225", 
      "date_published": "2025-10-14T12:43:45+00:00", 
      "content_html": "<p>\u63d2\u4ef6\u540d\u79f0\uff1a<strong>bean-copy-helper</strong></p>\n<p>\u63d2\u4ef6\u5730\u5740\uff1a<a href=\"https://plugins.jetbrains.com/plugin/28686-bean-copy-helper\" rel=\"nofollow\">https://plugins.jetbrains.com/plugin/28686-bean-copy-helper</a><br/>\n\u6e90\u7801\u5730\u5740\uff1a<a href=\"https://github.com/Aresxue/bean-copy-helper\" rel=\"nofollow\">https://github.com/Aresxue/bean-copy-helper</a></p>\n<p>\u5b89\u88c5\u65b9\u5f0f\uff1a\u5728 <strong>Settings</strong> -&gt; <strong>Plugins</strong> -&gt; <strong>Marketplace</strong> \u4e2d\u8f93\u5165 bean-copy-helper \u68c0\u7d22\u5373\u53ef\u627e\u5230\u8be5\u63d2\u4ef6</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/0Sn4TBn.png\"/></p>\n<p>\u8fd9\u4e2a\u63d2\u4ef6\u4e00\u5f00\u59cb\u4e3b\u8981\u662f\u5199\u7ed9\u81ea\u5df1\u7528\u7684\uff0c\u5728\u9605\u8bfb\u4ee3\u7801\u548c\u6392\u67e5 bug \u7684\u65f6\u5019\u53d1\u73b0\u6709\u5f88\u591a\u9879\u76ee\u4f7f\u7528\u4e86 Bean Copy \uff0cBean Copy \u6709\u65f6\u5019\u786e\u5b9e\u5f88\u597d\u7528\uff0c \u4f46\u662f\u5b83\u4e5f\u4f1a\u5e26\u6765\u4e00\u4e9b\u56f0\u6270\u6bd4\u5982\u6e90\u5bf9\u8c61\u901a\u8fc7 Bean Copy \u8d4b\u503c\u7ed9\u76ee\u6807\u5bf9\u8c61\u4ee5\u540e\u901a\u8fc7 IDEA \u7684\u5f15\u7528\u662f\u627e\u4e0d\u5230\u5b57\u6bb5\u8bfb\u53d6\u548c\u5199\u5165\uff08 Bean Copy \uff09\u7684\u5730\u65b9\u7684\uff0c\u8fd9\u4e2a\u63d2\u4ef6\u53ef\u4ee5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/sRWrMZc.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/fjjuFPA.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/PmuWbxu.png\"/></p>\n<p>\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u53ef\u4ee5\u5bf9\u4e8e<strong>Getter/Setter \u65b9\u6cd5\u6216\u8005\u5b57\u6bb5</strong>\u4f7f\u7528\u5c5e\u6027\u590d\u5236\u8303\u56f4\u67e5\u627e\uff0c\u4f1a\u8ba4\u4e3a\u4e00\u6b21 Bean Copy \u662f\u5bf9\u6e90\u5bf9\u8c61\u548c\u76ee\u6807\u5bf9\u8c61\u540c\u540d\u4e14\u540c\u7c7b\u578b\u7684\u5b57\u6bb5\u8bfb\u53d6\u548c\u5199\u5165\uff08\u5bf9\u4e8e\u6e90\u5bf9\u8c61\u6765\u8bf4\u662f\u8bfb\u53d6\u5bf9\u4e8e\u76ee\u6807\u5bf9\u8c61\u6765\u8bf4\u662f\u5199\u5165\uff09</p>\n<p>\u4e3a\u4e86\u907f\u514d\u5bf9\u539f\u6709\u65b9\u6cd5\u5f15\u7528\u7684\u6c61\u67d3\u6240\u4ee5\u91c7\u7528\u7c7b\u4f3c<strong>Find Usages</strong>\u7684\u65b9\u5f0f\uff0c\u8fd9\u6837\u5728\u8ddf\u8e2a\u67d0\u4e2a\u5b57\u6bb5\u7684\u8bfb\u53d6/\u5199\u5165\u65f6\u518d\u4e5f\u4e0d\u4f1a\u56e0\u4e3a Bean Copy \u800c\u88ab\u963b\u65ad\u4e86\uff01\uff01\uff01</p>\n<p>\u9664\u6b64\u4e4b\u5916 Bean Copy \u8fd8\u7ecf\u5e38\u88ab\u8bef\u7528\uff0c\u8fd9\u91cc\u4e5f\u4f1a\u5bf9\u5176\u505a\u4e00\u4e9b\u98ce\u9669\u8bc6\u522b</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/C8WnGpO.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/DjrFVhl.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/SeSqcsD.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/SYDlTOj.png\"/></p>\n<p>\u6700\u5178\u578b\u7684\u573a\u666f\u5c31\u662f<strong>\u540c\u540d\u5b57\u6bb5\u7c7b\u578b\u4e0d\u4e00\u81f4</strong>\uff0c\u5b9e\u9645\u4e0a\u8fd9\u4e2a\u5b57\u6bb5\u662f\u6ca1\u6cd5\u88ab Copy \u8fc7\u53bb\u7684\uff01\uff01\uff01</p>\n<p>\u9664\u6b64\u4e4b\u5916\u8fd8\u96c6\u6210\u4e86\u5176\u5b83\u4e00\u4e9b\u529f\u80fd</p>\n<p>\u53ef\u4ee5\u9884\u89c8\u6e90\u7c7b\u548c\u76ee\u6807\u7c7b\u5c5e\u6027\u7684<strong>\u5bf9\u6bd4</strong>\u5e76\u751f\u6210\u76f8\u5e94\u6ce8\u91ca<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/NDXKDy1.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/64iFjyI.png\"/></p>\n<p>\u9884\u89c8\u751f\u6210\u5c5e\u6027\u590d\u5236\u5bf9\u5e94\u7684<strong>Getter/Setter \u4ee3\u7801</strong></p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/6qNWE4W.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/EF3UkUF.png\"/></p>\n<p>\u53ef\u4ee5\u9884\u89c8\u6e90\u7c7b\u548c\u76ee\u6807\u7c7b<strong>\u590d\u5236\u6210\u529f\u7684\u5c5e\u6027</strong>\u5e76\u751f\u6210\u76f8\u5e94\u6ce8\u91ca</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/R1m4qfa.png\"/><br/>\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/JjCGx74.png\"/></p>\n<p>\u800c\u4e14\u4f7f\u7528\u4e2d\u6211\u5e38\u5e38\u53d1\u73b0\u5b57\u4f53\u65f6\u5927\u65f6\u5c0f\u6709\u65f6\u5019\u51e0\u4e4e\u65e0\u6cd5\u89c2\u770b\uff0c\u6240\u4ee5\u5f00\u653e\u4e86\u5b57\u4f53\u5927\u5c0f\u81ea\u5b9a\u4e49\u5927\u5bb6\u53ef\u81ea\u884c\u4fee\u6539</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://imgur.com/vKQRAn2.png\"/></p>\n<p><strong>\u672c\u63d2\u4ef6\u6c38\u4e45\u514d\u8d39\uff0c\u6709\u9700\u8981\u7684\u5c0f\u4f19\u4f34\u81ea\u53d6\u3002</strong></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lying500", 
        "name": "lying500", 
        "avatar": "https://cdn.v2ex.com/gravatar/db997bf3e01b40f7126d494529f0cfeb?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1164842", 
      "date_modified": "2025-10-13T06:47:45+00:00", 
      "content_html": "<p>\u5404\u4f4d\u5927\u4f6c\uff0c\u60f3\u8bf7\u6559\u4e00\u4e0b\u8fd9\u4e2a\u5173\u4e8e\u67e5\u8be2\u7528\u6237\u62e5\u6709\u6743\u9650\u7684\u6570\u636e\u7684\u95ee\u9898\uff0c\u611f\u89c9\u8fd9\u4e2a\u633a\u5e38\u89c1\u7684\u9700\u6c42</p>\n<p>\u4e1a\u52a1\u573a\u666f\uff1a</p>\n<p>\u5047\u8bbe\u4e00\u4e2a\u4e1a\u52a1\u8868\uff0c\u6570\u636e\u91cf\u5728\u51e0\u5343\u4e07\u7ea7\u3002\n\u9700\u8981\u4e3a\u8fd9\u4e2a\u8868\u63d0\u4f9b\u4e00\u4e2a\u5217\u8868\u5c55\u793a\u9875\uff0c\u8981\u6c42\u6309\u521b\u5efa\u65f6\u95f4\u5012\u5e8f\u5206\u9875\u3002\n\u4e3b\u8981\u662f\u6743\u9650\u95ee\u9898\u5bfc\u81f4\u67e5\u8be2\u6162\uff1a\n1 \u3001\u7528\u6237\u53ef\u4ee5\u67e5\u770b\u81ea\u5df1\u521b\u5efa\u7684\u6570\u636e\u3002\n2 \u3001\u7528\u6237\u53ef\u4ee5\u67e5\u770b\u81ea\u5df1\u6240\u5c5e\u7fa4\u7ec4\u7684\u6570\u636e\u3002\n3 \u3001\u7fa4\u7ec4\u7684\u6743\u9650\u662f\u53ef\u7ee7\u627f\u7684\u3001\u5c42\u7ea7\u7684\uff1a\u5982\u679c\u4e00\u4e2a\u7528\u6237\u5c5e\u4e8e\u67d0\u4e2a\u4e0a\u7ea7\u7fa4\u7ec4\uff0c\u90a3\u4e48\u4ed6\u81ea\u52a8\u62e5\u6709\u67e5\u770b\u5176\u6240\u6709\u4e0b\u7ea7\u3001\u4e0b\u4e0b\u7ea7...\u7fa4\u7ec4\u5185\u6570\u636e\u7684\u6743\u9650\u3002</p>\n<p>\u95ee\u9898\uff1a\n\u5982\u679c\u6743\u9650\u7b80\u5355\uff0c\u6bd4\u5982\u53ea\u770b\u81ea\u5df1\u7684\u6570\u636e\uff0c\u67e5\u8be2\u975e\u5e38\u7b80\u5355\uff1a\nWHERE user_id = ? ORDER BY create_time DESC LIMIT N\n\u8fd9\u79cd\u67e5\u8be2\u7528\u7d22\u5f15\u5c31\u597d\u89e3\u51b3\u3002</p>\n<p>\u4f46\u5982\u679c\u52a0\u5165\u7fa4\u7ec4\u6743\u9650\uff0c\u67e5\u8be2\u7684\u903b\u8f91\u5c31\u53d8\u6210\u4e86\uff1a\nSELECT * FROM a_large_table WHERE user_id = ? OR group_id IN (\u7528\u6237\u6240\u5c5e\u7fa4\u7ec4\u4ee5\u53ca\u6240\u6709\u4e0b\u7ea7\u7fa4\u7ec4\u7684 ID \u5217\u8868) ORDER BY create_time DESC LIMIT N</p>\n<p>\u8fd9\u4e2a\u67e5\u8be2\u5c31\u6bd4\u8f83\u6162\u4e86\n\u6bd4\u5982\u5047\u5b9a\u7ed3\u6784\u662f\u8fd9\u6837\uff1a</p>\n<p><img alt=\"xx\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.imgur.com/dvIVECo.png\"/></p>\n<p>\u67e5\u8be2\u5c31\u53d8\u6210\u4e86</p>\n<pre><code class=\"language-sql\">SELECT *\nFROM project\n         JOIN `group` ON project.group_id = `group`.id\nWHERE `group`.id IN (SELECT \u7528\u6237\u5173\u8054\u7684\u7fa4\u7ec4\u53ca\u5176\u5b50\u7fa4\u7ec4 id)\n   OR user_id = 20\nORDER BY project.created_at DESC\nLIMIT 10;\n</code></pre>\n<p>\u8fd9\u65f6\u5019 (group_id, user_id, created_at) \u4e5f\u4e0d\u597d\u4f7f;</p>\n<p>\u95ee\u4e86 AI \uff0c\u8bf4\u4e86\u51e0\u4e2a\u65b9\u6848\uff1a\n1 \u3001\u5e94\u7528\u5c42\u805a\u5408/union user_id \u548c group_id \u7684\uff0c\u5efa\u4e24\u4e2a\u7d22\u5f15\uff1b\n2 \u3001\u5197\u4f59\u4e00\u5f20 \u7528\u6237\u80fd\u8bbf\u95ee\u6570\u636e\u7684\u8868\uff0c\u76f4\u63a5\u67e5\u8fd9\u4e2a\u8868\uff1b\n3 \u3001\u5f15\u5165 es \u4e4b\u7c7b\u7684\u4e2d\u95f4\u4ef6\uff1b</p>\n<p>\u60f3\u95ee\u4e00\u4e0b\u5b9e\u9645\u5927\u5bb6\u662f\u600e\u4e48\u5904\u7406\u7684\uff1f</p>\n", 
      "date_published": "2025-10-13T06:39:18+00:00", 
      "title": "\u51e0\u5343\u4e07\u7684\u6570\u636e\u91cf\uff0c\u5c42\u7ea7\u6743\u9650\u4e0b\u7684\u5217\u8868\u5c55\u793a\u9875\u67e5\u8be2\u5e94\u8be5\u600e\u4e48\u8bbe\u8ba1\uff1f", 
      "id": "https://www.v2ex.com/t/1164842"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lidlesseye11", 
        "name": "lidlesseye11", 
        "avatar": "https://cdn.v2ex.com/gravatar/eeba66f9389c398404bfd2b52dfe0014?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1164788", 
      "title": "\u5927\u5bb6\u751f\u4ea7\u73af\u5883\u4f1a\u4e00\u76f4\u5f00\u7740 JFR \u5417", 
      "id": "https://www.v2ex.com/t/1164788", 
      "date_published": "2025-10-13T03:32:29+00:00", 
      "content_html": "\u6027\u80fd\u5f00\u9500\u6709\u591a\u5927\uff1f<br />\u6211\u770b\u53f7\u79f0\u4e00\u822c\u662f 1%\uff5e 2%\uff0c\u4f46\u662f\u5728\u6d4b\u8bd5\u73af\u5883\u8bd5\u4e86\u4e0b\u76f8\u5dee\u751a\u8fdc\u3002\u3002<br />\u672c\u6765\u53ea\u7528\u4e0d\u5230 0.5 \u6838 CPU \uff0c\u4e00\u6253\u5f00 jfr \u76f4\u63a5\u5954 1.5 \u6838\u53bb\u4e86\u3002<br />k8s \u73af\u5883\uff0cjdk8 \uff0c\u5927\u4f6c\u4eec\u6709\u4ec0\u4e48\u601d\u8def\u5417"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/YanSeven", 
        "name": "YanSeven", 
        "avatar": "https://cdn.v2ex.com/avatar/3f22/feff/383743_large.png?m=1775465214"
      }, 
      "url": "https://www.v2ex.com/t/1164621", 
      "date_modified": "2025-10-14T08:31:28+00:00", 
      "content_html": "\u697c\u4e3b\u76ee\u524d\u5bf9 Go \u6709\u4e86\u4e00\u5b9a\u7684\u7406\u89e3\uff0c\u5305\u62ec\u8fd0\u884c\u65f6\u8c03\u5ea6\uff0c\u5185\u5b58\u7ba1\u7406\uff0cGC \u8fd9\u4e9b,\u867d\u7136\u4e5f\u5f88\u6d45\u3002<br /><br />\u770b\u8bba\u575b\u6495\u903c\u5927\u6218\u7ecf\u5e38\u6709 Goer \u548c\u65b0 Javaer \u7684\u8eab\u5f71\u3002<br /><br />\u6240\u4ee5\uff0c\u4ea7\u751f\u597d\u5947\u5fc3\u7406\uff0c\u60f3\u5bf9\u6bd4\u5b66\u4e60\u4e86\u89e3\u4e00\u4e0b\u65b0\u7248\u7684 Java \u3002<br /><br />\u697c\u4e3b Java \u57fa\u7840\u4ec5\u9650\u4e8e n \u5e74\u524d\u4e0a\u5b66\u671f\u95f4\u7684 Java \u57fa\u672c\u8bed\u6cd5\u3002", 
      "date_published": "2025-10-12T04:55:26+00:00", 
      "title": "\u6709\u6ca1\u6709\u65b0\u7248 Java \u7684\u4f6c(jdk25 \u548c 21 \u8fd9\u79cd), \u4e0a\u624b\u8fd8\u662f\u8d70\u5b98\u65b9\u6587\u6863\u5417", 
      "id": "https://www.v2ex.com/t/1164621"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lame_chen", 
        "name": "lame_chen", 
        "avatar": "https://cdn.v2ex.com/avatar/ef50/c335/1018_large.png?m=1768529044"
      }, 
      "url": "https://www.v2ex.com/t/1164118", 
      "date_modified": "2025-10-11T05:43:15+00:00", 
      "content_html": "\u6700\u8fd1\u60f3\u8981\u8df3\u69fd\uff08\u5e74\u540e\u4e5f\u884c\uff09\uff0c\u6211\u5728\u516c\u53f8\u662f\u505a java \u540e\u7aef\u5f00\u53d1\u7684\uff0c\u9879\u76ee\u7ecf\u9a8c\u6709\uff0c\u5237\u9898\u5c31\u4e3b\u8981\u627e leetcode \u4e86\uff0c\u76ee\u6807\u662f\u5237\u4e2a 200~300 \u9053\uff0c\u4f46\u662f\u4e0d\u6e05\u695a\u9762\u7ecf\u600e\u4e48\u627e\uff08\u4e3b\u8981\u516b\u80a1\u8fd8\u6709\u7ed3\u5408\u9879\u76ee\u63d0\u95ee\u7684\u4e00\u4e9b\u95ee\u9898\uff09\uff0c\u53bb\u54ea\u91cc\u627e\u6bd4\u8f83\u597d\uff0c\u600e\u4e48\u590d\u4e60\u6548\u7387\u80fd\u9ad8\u4e00\u4e9b\u3002\u6700\u8fd1\u770b\u7684 java guide \uff0c\u5e7f\u5ea6\u662f\u591f\u7684\uff0c\u4e0d\u77e5\u9053\u6df1\u5ea6\u591f\u4e0d\u591f\u3002\u6709\u6ca1\u6709\u8df3\u69fd\u4e0d\u4e45\u7684\u5144\u5f1f\u6307\u6559\u4e00\u4e0b\uff08\u76ee\u6807\u4e3b\u8981\u8fd8\u662f\u60f3\u53bb\u5927\u5382\uff09", 
      "date_published": "2025-10-10T03:13:32+00:00", 
      "title": "Java \u7a0b\u5e8f\u5458\u9762\u7ecf\u600e\u4e48\u51c6\u5907", 
      "id": "https://www.v2ex.com/t/1164118"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Cbdy", 
        "name": "Cbdy", 
        "avatar": "https://cdn.v2ex.com/gravatar/91ea1dcad5350d82e02fac3e795dc1f5?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1162247", 
      "date_modified": "2025-09-27T16:18:17+00:00", 
      "content_html": "<h1>Compact Java App - \u50cf\u5199 Python \u4e00\u6837\u5199 Java</h1>\n<p><strong>\u9879\u76ee\u5730\u5740</strong>: <a href=\"https://github.com/alchem-x/compact-sb\" rel=\"nofollow\">https://github.com/alchem-x/compact-sb</a></p>\n<h2>\u4ec0\u4e48\u662f Compact Java App \uff1f</h2>\n<p>Compact Java App \u662f\u57fa\u4e8e Java 25 \u65b0\u7279\u6027\uff08 JEP 512 \uff09\u7684\u7f16\u7a0b\u65b9\u5f0f\uff0c\u8ba9\u4f60\u53ef\u4ee5\u50cf\u5199 Python \u4e00\u6837\u5199 Java \u7a0b\u5e8f\uff1a</p>\n<pre><code class=\"language-java\">// \u4f20\u7edf\u7684 Java Hello World\npublic class HelloWorld {\n    public static void main(String[] args) {\n        System.out.println(\"Hello, World!\");\n    }\n}\n\n// Compact Java App Hello World\nvoid main() {\n    IO.println(\"Hello, World!\");\n}\n</code></pre>\n<h2>\u6838\u5fc3\u4f18\u52bf</h2>\n<ul>\n<li>\u2705 <strong>\u96f6\u6837\u677f\u4ee3\u7801</strong> - \u65e0\u9700\u7c7b\u58f0\u660e\u3001public static void main \u7b49\u7e41\u7410\u8bed\u6cd5</li>\n<li>\u2705 <strong>\u81ea\u52a8\u5bfc\u5165</strong> - \u81ea\u52a8\u5bfc\u5165 java.base \u6240\u6709\u5e38\u7528\u7c7b</li>\n<li>\u2705 <strong>\u7b80\u6d01 I/O</strong> - \u65b0\u7684 IO \u7c7b\u7b80\u5316\u63a7\u5236\u53f0\u8f93\u5165\u8f93\u51fa</li>\n<li>\u2705 <strong>\u5e73\u6ed1\u6f14\u8fdb</strong> - \u53ef\u968f\u65f6\u6269\u5c55\u5230\u5b8c\u6574 Java \u7a0b\u5e8f</li>\n<li>\u2705 <strong>\u539f\u751f\u6027\u80fd</strong> - \u7f16\u8bd1\u540e\u4e0e\u4f20\u7edf Java \u5b8c\u5168\u7b49\u6548</li>\n</ul>\n<h2>\u5f53\u524d\u9879\u76ee\u4ecb\u7ecd</h2>\n<p>\u8fd9\u4e2a\u4ed3\u5e93\u6f14\u793a\u4e86 Compact Java App \u7684\u5b9e\u9645\u5e94\u7528 - \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684 Web \u670d\u52a1\u5668\u5b9e\u73b0\u3002</p>\n<h3>\u9879\u76ee\u7ed3\u6784</h3>\n<pre><code>compact-sb/\n\u251c\u2500\u2500 Lu.java              # \u7d27\u51d1 Java App \u4e3b\u7a0b\u5e8f\n\u251c\u2500\u2500 CompactSB.java       # Web \u670d\u52a1\u5668\u6838\u5fc3\n\u251c\u2500\u2500 lib/                 # \u4f9d\u8d56\u5e93\n\u2514\u2500\u2500 README.md\n</code></pre>\n<h3>\u5feb\u901f\u5f00\u59cb</h3>\n<ol>\n<li><strong>\u786e\u4fdd Java 25+\u5df2\u5b89\u88c5</strong></li>\n</ol>\n<pre><code class=\"language-bash\">java -version  # \u9700\u8981 Java 25 \u6216\u66f4\u9ad8\u7248\u672c\n</code></pre>\n<ol>\n<li><strong>\u8fd0\u884c\u5e94\u7528</strong></li>\n</ol>\n<pre><code class=\"language-bash\">java Lu.java &amp;&amp; java -cp \"lib/*\" CompactSB.java\n</code></pre>\n<ol>\n<li><strong>\u8bbf\u95ee Web \u670d\u52a1</strong>\n\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee http://localhost:8080/</li>\n</ol>\n<h3>\u6838\u5fc3\u4ee3\u7801\u793a\u4f8b</h3>\n<p><strong>Lu.java</strong> - \u7d27\u51d1 Java App \u7684\u7cbe\u9ad3\uff1a</p>\n<pre><code class=\"language-java\">void main() {\n    // \u7b80\u6d01\u7684 Web \u670d\u52a1\u5668\u542f\u52a8\n    IO.println(\"Starting Compact Web Server...\");\n\n    // \u81ea\u52a8\u5bfc\u5165\u6240\u6709 java.base \u7c7b\n    var server = new Server();\n    server.start(8080);\n\n    IO.println(\"Server running at http://localhost:8080/\");\n}\n</code></pre>\n<h3>\u4e3a\u4ec0\u4e48\u9009\u62e9 Compact Java App \uff1f</h3>\n<ol>\n<li><strong>\u6559\u5b66\u53cb\u597d</strong> - \u7b2c\u4e00\u5929\u5c31\u80fd\u5199\u51fa\u5b9e\u7528\u7684\u7a0b\u5e8f</li>\n<li><strong>\u811a\u672c\u5316</strong> - \u7528 Java \u5199\u811a\u672c\uff0c\u4eab\u53d7\u5f3a\u7c7b\u578b\u548c\u4f18\u79c0\u6027\u80fd</li>\n<li><strong>\u96f6\u914d\u7f6e</strong> - \u65e0\u9700\u590d\u6742\u9879\u76ee\u7ed3\u6784\u548c\u6784\u5efa\u5de5\u5177</li>\n<li><strong>\u751f\u4ea7\u5c31\u7eea</strong> - \u53ef\u5e73\u6ed1\u6269\u5c55\u5230\u4f01\u4e1a\u7ea7\u5e94\u7528</li>\n</ol>\n<h3>\u4e0e\u4f20\u7edf Java \u5bf9\u6bd4</h3>\n<table>\n<thead>\n<tr>\n<th>\u7279\u6027</th>\n<th>\u4f20\u7edf Java</th>\n<th>Compact Java App</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Hello World</td>\n<td>5 \u884c\uff0c4 \u4e2a\u6982\u5ff5</td>\n<td>3 \u884c\uff0c1 \u4e2a\u6982\u5ff5</td>\n</tr>\n<tr>\n<td>\u4f9d\u8d56\u7ba1\u7406</td>\n<td>\u9700\u8981 Maven/Gradle</td>\n<td>\u76f4\u63a5\u8fd0\u884c\u6e90\u6587\u4ef6</td>\n</tr>\n<tr>\n<td>\u5b66\u4e60\u66f2\u7ebf</td>\n<td>\u9661\u5ced</td>\n<td>\u5e73\u7f13</td>\n</tr>\n<tr>\n<td>\u5f00\u53d1\u901f\u5ea6</td>\n<td>\u6162</td>\n<td>\u5feb\u901f</td>\n</tr>\n<tr>\n<td>\u8fd0\u884c\u65f6\u6027\u80fd</td>\n<td>\u4f18\u79c0</td>\n<td><strong>\u540c\u6837\u4f18\u79c0</strong></td>\n</tr>\n</tbody></table><h3>\u5e94\u7528\u573a\u666f</h3>\n<ul>\n<li>\ud83c\udf93 <strong>\u7f16\u7a0b\u6559\u5b66</strong> - \u8ba9\u5b66\u751f\u5feb\u901f\u770b\u5230\u6210\u679c</li>\n<li>\ud83d\ude80 <strong>\u5feb\u901f\u539f\u578b</strong> - \u9a8c\u8bc1\u60f3\u6cd5\u7684\u6700\u4f73\u9009\u62e9</li>\n<li>\u2699\ufe0f <strong>\u7cfb\u7edf\u811a\u672c</strong> - \u66ff\u4ee3 Shell \u811a\u672c\u7684\u5b89\u5168\u9009\u62e9</li>\n<li>\ud83d\udcca <strong>\u6570\u636e\u5904\u7406</strong> - \u5904\u7406 CSV \u3001JSON \u7b49\u6570\u636e\u6587\u4ef6</li>\n<li>\ud83c\udf10 <strong>Web \u670d\u52a1</strong> - \u5982\u672c\u9879\u76ee\u7684\u8f7b\u91cf\u7ea7\u670d\u52a1\u5668</li>\n</ul>\n<h3>\u6280\u672f\u7ec6\u8282</h3>\n<ul>\n<li><strong>\u9690\u5f0f\u7c7b\u58f0\u660e</strong> - \u6e90\u6587\u4ef6\u81ea\u52a8\u8f6c\u6362\u4e3a final \u7c7b</li>\n<li><strong>\u5b9e\u4f8b main \u65b9\u6cd5</strong> - \u65e0\u9700 static \u4fee\u9970\u7b26</li>\n<li><strong>\u81ea\u52a8\u5bfc\u5165</strong> - java.base \u6a21\u5757 54 \u4e2a\u5305\u81ea\u52a8\u53ef\u7528</li>\n<li><strong>IO \u7b80\u5316</strong> - <code>IO.println()</code>\u66ff\u4ee3<code>System.out.println()</code></li>\n</ul>\n<h3>\u4e0b\u4e00\u6b65\u8ba1\u5212</h3>\n<p>\u8fd9\u4e2a\u9879\u76ee\u5c55\u793a\u4e86 Compact Java App \u5728 Web \u5f00\u53d1\u4e2d\u7684\u5e94\u7528\u3002\u672a\u6765\u53ef\u4ee5\uff1a</p>\n<ol>\n<li>\u6dfb\u52a0\u66f4\u591a\u8def\u7531\u5904\u7406\u529f\u80fd</li>\n<li>\u96c6\u6210\u6a21\u677f\u5f15\u64ce</li>\n<li>\u652f\u6301\u9759\u6001\u6587\u4ef6\u670d\u52a1</li>\n<li>\u6dfb\u52a0\u6570\u636e\u5e93\u8fde\u63a5\u793a\u4f8b</li>\n<li>\u521b\u5efa RESTful API \u6f14\u793a</li>\n</ol>\n<h3>\u76f8\u5173\u8d44\u6e90</h3>\n<ul>\n<li><a href=\"https://github.com/alchem-x/compact-sb\" rel=\"nofollow\">\u672c\u9879\u76ee GitHub \u4ed3\u5e93</a> - \u6e90\u4ee3\u7801\u548c\u793a\u4f8b</li>\n<li><a href=\"https://openjdk.org/jeps/512\" rel=\"nofollow\">JEP 512 \u5b98\u65b9\u6587\u6863</a> - \u6280\u672f\u89c4\u8303</li>\n<li><a href=\"https://jdk.java.net/25/\" rel=\"nofollow\">OpenJDK 25 \u4e0b\u8f7d</a> - \u83b7\u53d6 Java 25</li>\n</ul>\n<hr/>\n<p><strong>Compact Java App \u8ba9 Java \u91cd\u65b0\u53d8\u5f97\u7b80\u5355\u4f18\u96c5\uff0c\u540c\u65f6\u4fdd\u6301\u5176\u5f3a\u5927\u7684\u751f\u6001\u7cfb\u7edf\u3002\u672a\u6765\u5df2\u6765\uff0c\u8ba9\u6211\u4eec\u4e00\u8d77\u62e5\u62b1\u8fd9\u4e2a\u5168\u65b0\u7684 Java \u65f6\u4ee3\uff01</strong> \ud83d\ude80</p>\n<p><em>\u672c\u9879\u76ee\u662f Compact Java App \u7406\u5ff5\u7684\u5b9e\u8df5\u6f14\u793a\uff0c\u5c55\u793a\u4e86\u5982\u4f55\u7528\u7b80\u6d01\u7684\u4ee3\u7801\u6784\u5efa\u5b9e\u7528\u7684\u5e94\u7528\u7a0b\u5e8f\u3002</em></p>\n", 
      "date_published": "2025-09-27T16:13:18+00:00", 
      "title": "Java 25 \u540e\u7684\u65f6\u4ee3\uff1a\u50cf\u5199 Python \u4e00\u6837\u5199 Java", 
      "id": "https://www.v2ex.com/t/1162247"
    }
  ]
}