{"id":988,"date":"2021-12-19T19:17:03","date_gmt":"2021-12-19T11:17:03","guid":{"rendered":"https:\/\/blog.cauchyschwarz.com\/?p=988"},"modified":"2021-12-19T19:17:09","modified_gmt":"2021-12-19T11:17:09","slug":"java%e5%8f%8d%e5%b0%84","status":"publish","type":"post","link":"https:\/\/blog.cauchyschwarz.com\/?p=988","title":{"rendered":"Java\u53cd\u5c04"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 ez-toc-wrap-right counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a28dbdbd1251\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a28dbdbd1251\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#Java%E5%8F%8D%E5%B0%84\" >Java\u53cd\u5c04<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#Classes\" >Classes<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E8%8E%B7%E5%8F%96%E7%B1%BB%E5%AF%B9%E8%B1%A1\" >\u83b7\u53d6\u7c7b\u5bf9\u8c61<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%A3%80%E6%9F%A5%E7%B1%BB%E7%9A%84%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%92%8C%E7%B1%BB%E5%9E%8B\" >\u68c0\u67e5\u7c7b\u7684\u4fee\u9970\u7b26\u548c\u7c7b\u578b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E8%8E%B7%E5%8F%96%E7%B1%BB%E6%88%90%E5%91%98\" >\u83b7\u53d6\u7c7b\u6210\u5458<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#Members\" >Members<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E5%9F%9FFields\" >\u57df(Fields)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%96%B9%E6%B3%95Methods\" >\u65b9\u6cd5(Methods)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0Constructors\" >\u6784\u9020\u51fd\u6570(Constructors)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%95%B0%E7%BB%84%E4%B8%8E%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B\" >\u6570\u7ec4\u4e0e\u679a\u4e3e\u7c7b\u578b<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%95%B0%E7%BB%84\" >\u6570\u7ec4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=988\/#%E6%93%8D%E4%BD%9C%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B\" >\u64cd\u4f5c\u679a\u4e3e\u7c7b\u578b<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1 class=\"wp-block-heading\" id=\"javae58f8de5b084-1\"><span class=\"ez-toc-section\" id=\"Java%E5%8F%8D%E5%B0%84\"><\/span><a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/reflect\/\">Java\u53cd\u5c04<\/a><span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u7684\u4f5c\u7528\uff1a<br>\u6709\u4e9b\u4e8b\u60c5\u4e0d\u7528\u53cd\u5c04\u505a\u4e0d\u4e86\uff0c<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Extensibility Features<br>\u6bd4\u5982\u901a\u8fc7\u7ed9\u5b9a\u4e00\u4e2a\u5916\u90e8\u7684\/\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u7c7b\u7684\u5b8c\u5168\u9650\u5b9a\u7c7b\u540d\u521b\u5efa\u65b0\u7684\u5bf9\u8c61\uff1b<\/li><li>Class Browsers and Visual Development Environments<br>\u5b9e\u73b0\u4e00\u4e2a\u7c7b\u7684\u6d4f\u89c8\u5668\uff0c\u679a\u4e3e\u8fd9\u4e2a\u7c7b\u7684\u57df\u548c\u65b9\u6cd5\uff1b\u5728\u4e00\u4e2a\u865a\u62df\u5f00\u53d1\u73af\u5883\u4e2d\u53ef\u4ee5\u5229\u7528\u8fd9\u4e9b\u4fe1\u606f\u5e2e\u52a9\u5f00\u53d1\u8005\u5199\u51fa\u6b63\u786e\u7684\u4ee3\u7801\uff1b<\/li><li>Debuggers and Test Tools<br>\u8c03\u8bd5\u5668\u53ef\u4ee5\u7528\u53cd\u5c04\u6765\u67e5\u770b\u79c1\u6709\u6210\u5458\uff1b\u6d4b\u8bd5\u5de5\u5177\u53ef\u4ee5\u7528\u53cd\u5c04\u6765\u67e5\u770b\u7c7b\u7684\u65b9\u6cd5\uff0c\u5e76\u8c03\u7528\u8fd9\u4e9b\u65b9\u6cd5\u4ee5\u63d0\u9ad8\u4ee3\u7801\u8986\u76d6\u7387\uff1b<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u7684\u7f3a\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Performance Overhead<br>\u540c\u6837\u7684\u529f\u80fd\uff0c\u53cd\u5c04\u5b9e\u73b0\u6bd4\u975e\u53cd\u5c04\u5b9e\u73b0\u66f4\u6162\uff1b<\/li><li>Security Restrictions<br>\u53cd\u5c04\u9700\u8981\u8fd0\u884c\u65f6\u7684\u6743\u9650(runtime permission)\uff0c\u5728\u53d7\u9650\u5236\u7684\u73af\u5883\u4e0b(\u5982Applet)\uff0c\u53cd\u5c04\u4e0d\u80fd\u5de5\u4f5c\uff1b<\/li><li>Exposure of Internals<br>\u7531\u4e8e\u53ef\u4ee5\u901a\u8fc7\u53cd\u5c04\u53bb\u4fee\u6539\u79c1\u6709\u6210\u5458\uff0c\u56e0\u6b64\u53cd\u5c04\u8fdd\u53cd\u4e86\u6211\u4eec\u901a\u5e38\u9075\u5faa\u7684\u7ea6\u5b9a\uff0c\u8fd9\u53ef\u80fd\u4f1a\u4f7f\u7a0b\u5e8f\u4ea7\u751f\u5f02\u5e38\u884c\u4e3a\u3002<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"classes-1\"><span class=\"ez-toc-section\" id=\"Classes\"><\/span>Classes<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e88eb7e58f96e7b1bbe5afb9e8b1a1-1\"><span class=\"ez-toc-section\" id=\"%E8%8E%B7%E5%8F%96%E7%B1%BB%E5%AF%B9%E8%B1%A1\"><\/span>\u83b7\u53d6\u7c7b\u5bf9\u8c61<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Object.getClass()<br>\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">byte[] bytes = new byte[1024];\nClass c = bytes.getClass();\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u65b9\u6cd5\u5c31\u662f\u5bf9\u539f\u59cb\u7c7b\u578b\u4e0d\u594f\u6548(primitive type)\uff0c\u56e0\u4e3a\u539f\u59cb\u6570\u636e\u7c7b\u578b\u6ca1\u6709\u8fd9\u4e2a.getClass()\u65b9\u6cd5\u53ef\u4ee5\u6389\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>.class Syntax<br>\u539f\u59cb\u7c7b\u578b\u7528\u4e0d\u4e86\u4e0a\u9762\u7684\u65b9\u6cd5\uff0c\u53ef\u4ee5\u7528\u8fd9\u4e2a\u3002\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">boolean b;\nClass c = boolean.class;\nc = java.io.PrintStream.class;\nc = int[][][].class;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Class.forName()<br>\u8fd9\u4e2a\u65b9\u6cd5\u5bf9\u4e8e\u539f\u59cb\u7c7b\u578b\u548c\u5f15\u7528\u7c7b\u578b\u90fd\u53ef\u4ee5\uff0c\u5c31\u662f\u901a\u8fc7\u5b8c\u5168\u9650\u5b9a\u7c7b\u540d\u6765\u83b7\u5f97\u76f8\u5e94\u7684\u7c7b\u5bf9\u8c61\u3002\u5173\u4e8eJava\u7684\u7c7b\u7684fully-qualified name\uff0c\u8c8c\u4f3c\u5728jni\u7684\u6587\u6863\u91cc\u8fd8\u662f\u54ea\u91cc\u6709\u8bb2\u8fc7\u547d\u540d\u89c4\u5219\uff0c\u4ec0\u4e48\u65f6\u5019\u7ffb\u5230\u4e86\u518d\u8d34\u5230\u8fd9\u91cc\u3002\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">Class c = Class.forName(\"com.duke.MyLocaleServiceProvider\");\nClass cDoubleArray = Class.forName(\"[D\");\nClass cStringArray = Class.forName(\"[[Ljava.lang.String;\");\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>TYPE Field for Primitive Type Wrappers<br>\u53ea\u5bf9\u539f\u59cb\u7c7b\u578b\u7684\u76f8\u5e94\u5c01\u88c5\u7c7b\u578b\u6709\u6548\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">Class c = Double.TYPE;\nClass c = Void.TYPE;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Methods that Return Classes<br>\u4e0a\u9762\u7684\u90fd\u662f\u901a\u8fc7\u7c7b\u540d\u3001\u5bf9\u8c61\u4e4b\u7c7b\u7684\u83b7\u53d6\u76f8\u5e94\u7684\u7c7b\u5bf9\u8c61\uff0cClass\u7c7b\u4ee5\u53ca\u53cd\u5c04api\u4e2d\u8fd8\u6709\u4e00\u4e9b\u83b7\u53d6\u548c\u672c\u7c7b\u76f8\u5173\u7684\u7c7b(\u6bd4\u5982\u7236\u7c7b)\u7684\u7c7b\u5bf9\u8c61\u7684\u65b9\u6cd5\uff1a<ul><li>Class.getSuperclass()<\/li><li>Class.getClasses()<\/li><li>Class.getDeclaredClasses()<\/li><li>Class.getDeclaringClass()<\/li><li>java.lang.reflect.Field.getDeclaringClass()<\/li><li>java.lang.reflect.Method.getDeclaringClass()<\/li><li>java.lang.reflect.Constructor.getDeclaringClass()<br>\u533f\u540d\u5185\u90e8\u7c7b\u6ca1\u6709\u8fd9\u4e2adeclaring class\uff0c\u800c\u662f\u6709\u4e00\u4e2aenclosing class\u3002<\/li><li>class.getEnclosingClass()<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e6a380e69fa5e7b1bbe79a84e4bfaee9a5b0e7aca6e5928ce7b1bbe59e8b-1\"><span class=\"ez-toc-section\" id=\"%E6%A3%80%E6%9F%A5%E7%B1%BB%E7%9A%84%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%92%8C%E7%B1%BB%E5%9E%8B\"><\/span>\u68c0\u67e5\u7c7b\u7684\u4fee\u9970\u7b26\u548c\u7c7b\u578b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u4fee\u9970\u7b26\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>public, protected, private<\/em><\/li><li><em>abstract<\/em><\/li><li><em>static<\/em><\/li><li><em>final<\/em><\/li><li><em>strictfp<\/em><\/li><li>\u6ce8\u89e3<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">ClassDeclarationSpy\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.annotation.Annotation;\nimport java.lang.reflect.Modifier;\nimport java.lang.reflect.Type;\nimport java.lang.reflect.TypeVariable;\nimport java.util.Arrays;\nimport java.util.ArrayList;\nimport java.util.List;\nimport static java.lang.System.out;\n\npublic class ClassDeclarationSpy {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    out.format(\"Class:%n  %s%n%n\", c.getCanonicalName());\n\t    out.format(\"Modifiers:%n  %s%n%n\",\n\t\t       Modifier.toString(c.getModifiers()));\n\n\t    out.format(\"Type Parameters:%n\");\n\t    TypeVariable[] tv = c.getTypeParameters();\n\t    if (tv.length != 0) {\n\t\tout.format(\"  \");\n\t\tfor (TypeVariable t : tv)\n\t\t    out.format(\"%s \", t.getName());\n\t\tout.format(\"%n%n\");\n\t    } else {\n\t\tout.format(\"  -- No Type Parameters --%n%n\");\n\t    }\n\n\t    out.format(\"Implemented Interfaces:%n\");\n\t    Type[] intfs = c.getGenericInterfaces();\n\t    if (intfs.length != 0) {\n\t\tfor (Type intf : intfs)\n\t\t    out.format(\"  %s%n\", intf.toString());\n\t\tout.format(\"%n\");\n\t    } else {\n\t\tout.format(\"  -- No Implemented Interfaces --%n%n\");\n\t    }\n\n\t    out.format(\"Inheritance Path:%n\");\n\t    List&lt;Class&gt; l = new ArrayList&lt;Class&gt;();\n\t    printAncestor(c, l);\n\t    if (l.size() != 0) {\n\t\tfor (Class&lt;?&gt; cl : l)\n\t\t    out.format(\"  %s%n\", cl.getCanonicalName());\n\t\tout.format(\"%n\");\n\t    } else {\n\t\tout.format(\"  -- No Super Classes --%n%n\");\n\t    }\n\n\t    out.format(\"Annotations:%n\");\n\t    Annotation[] ann = c.getAnnotations();\n\t    if (ann.length != 0) {\n\t\tfor (Annotation a : ann)\n\t\t    out.format(\"  %s%n\", a.toString());\n\t\tout.format(\"%n\");\n\t    } else {\n\t\tout.format(\"  -- No Annotations --%n%n\");\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n\n    private static void printAncestor(Class&lt;?&gt; c, List&lt;Class&gt; l) {\n\tClass&lt;?&gt; ancestor = c.getSuperclass();\n \tif (ancestor != null) {\n\t    l.add(ancestor);\n\t    printAncestor(ancestor, l);\n \t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e88eb7e58f96e7b1bbe68890e59198-1\"><span class=\"ez-toc-section\" id=\"%E8%8E%B7%E5%8F%96%E7%B1%BB%E6%88%90%E5%91%98\"><\/span>\u83b7\u53d6\u7c7b\u6210\u5458<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u4e24\u7c7b\u83b7\u53d6\u7c7b\u6210\u5458(\u5305\u62ec\u4e86\u57df\u3001\u65b9\u6cd5\u548c\u6784\u9020\u51fd\u6570)\u7684\u65b9\u6cd5\uff1a\u4e00\u79cd\u662f\u63d0\u4f9b\u4e00\u4e2a\u679a\u4e3e\u7684\u5217\u8868\uff0c\u4e00\u79cd\u662f\u6839\u636e\u540d\u79f0\u67e5\u627e\u76f8\u5e94\u7684\u6210\u5458\u3002<br>\u4e0b\u9762\u662f\u5173\u4e8e\u8fd9\u4e9b\u65b9\u6cd5\u7684\u603b\u7ed3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u7528\u4e8e\u5b9a\u4f4d\u57df\u7684\u65b9\u6cd5\uff1a<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Class API<\/th><th>List of members?<\/th><th>Inherited members?<\/th><th>Private members?<\/th><\/tr><\/thead><tbody><tr><td>getDeclaredField()<\/td><td>no<\/td><td>no<\/td><td>yes<\/td><\/tr><tr><td>getField()<\/td><td>no<\/td><td>yes<\/td><td>no<\/td><\/tr><tr><td>getDeclaredFields()<\/td><td>yes<\/td><td>no<\/td><td>yes<\/td><\/tr><tr><td>getFields()<\/td><td>yes<\/td><td>yes<\/td><td>no<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>\u7528\u4e8e\u5b9a\u4f4d\u65b9\u6cd5\u7684\u65b9\u6cd5\uff1a<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Class API<\/th><th>List of members?<\/th><th>Inherited members?<\/th><th>Private members?<\/th><\/tr><\/thead><tbody><tr><td>getDeclaredMethod()<\/td><td>no<\/td><td>no<\/td><td>yes<\/td><\/tr><tr><td>getMethod()<\/td><td>no<\/td><td>yes<\/td><td>no<\/td><\/tr><tr><td>getDeclaredMethods<\/td><td>yes<\/td><td>no<\/td><td>yes<\/td><\/tr><tr><td>getMethods<\/td><td>yes<\/td><td>yes<\/td><td>no<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>\u7528\u4e8e\u5b9a\u4f4d\u6784\u9020\u51fd\u6570(Constructors)\u7684\u65b9\u6cd5\uff1a<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Class API<\/th><th>List of members?<\/th><th>Inherited members?<\/th><th>Private members?<\/th><\/tr><\/thead><tbody><tr><td>getDeclaredConstructor()<\/td><td>no<\/td><td>\u6784\u9020\u51fd\u6570\u4e0d\u7ee7\u627f<\/td><td>yes<\/td><\/tr><tr><td>getConstructor()<\/td><td>no<\/td><td>\u6784\u9020\u51fd\u6570\u4e0d\u7ee7\u627f<\/td><td>no<\/td><\/tr><tr><td>getDeclaredConstructors()<\/td><td>yes<\/td><td>\u6784\u9020\u51fd\u6570\u4e0d\u7ee7\u627f<\/td><td>yes<\/td><\/tr><tr><td>getConstructors()<\/td><td>yes<\/td><td>\u6784\u9020\u51fd\u6570\u4e0d\u7ee7\u627f<\/td><td>no<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u5b9e\u4e0a\u9762\u8fd9\u4e09\u4e2a\u8868\u53ef\u4ee5\u7b80\u5355\u5f52\u7eb3\u5982\u4e0b\uff1a<br>\u65e0\u8bba\u5bf9\u4e8e\u57df\u3001\u65b9\u6cd5\u8fd8\u662f\u6784\u9020\u51fd\u6570\uff0c\u5e26\u590d\u6570(s)\u540e\u7f00\u7684\u90fd\u662f\u90a3\u79cd\u679a\u4e3e\u6210\u5458\u7684\u65b9\u6cd5\uff0c\u4e0d\u5e26\u7684\u662f\u6309\u7167\u540d\u5b57\u67e5\u627e\u7684\u65b9\u6cd5\uff0c\u5e26Declared\u7684\u5305\u542b\u4e86\u79c1\u6709\u6210\u5458\u4f46\u662f\u4e0d\u5305\u542b\u7ee7\u627f\u7684\u6210\u5458\uff0c\u4e0d\u5e26Declared\u7684\u5219\u6b63\u597d\u76f8\u53cd\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2a\u679a\u4e3e\u6210\u5458\u7684\u4f8b\u5b50\u7a0b\u5e8f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Member;\nimport static java.lang.System.out;\n\nenum ClassMember { CONSTRUCTOR, FIELD, METHOD, CLASS, ALL }\n\npublic class ClassSpy {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    out.format(\"Class:%n  %s%n%n\", c.getCanonicalName());\n\n\t    Package p = c.getPackage();\n\t    out.format(\"Package:%n  %s%n%n\",\n\t\t       (p != null ? p.getName() : \"-- No Package --\"));\n\n\t    for (int i = 1; i &lt; args.length; i++) {\n\t\tswitch (ClassMember.valueOf(args[i])) {\n\t\tcase CONSTRUCTOR:\n\t\t    printMembers(c.getConstructors(), \"Constructor\");\n\t\t    break;\n\t\tcase FIELD:\n\t\t    printMembers(c.getFields(), \"Fields\");\n\t\t    break;\n\t\tcase METHOD:\n\t\t    printMembers(c.getMethods(), \"Methods\");\n\t\t    break;\n\t\tcase CLASS:\n\t\t    printClasses(c);\n\t\t    break;\n\t\tcase ALL:\n\t\t    printMembers(c.getConstructors(), \"Constuctors\");\n\t\t    printMembers(c.getFields(), \"Fields\");\n\t\t    printMembers(c.getMethods(), \"Methods\");\n\t\t    printClasses(c);\n\t\t    break;\n\t\tdefault:\n\t\t    assert false;\n\t\t}\n\t    }\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n\n    private static void printMembers(Member[] mbrs, String s) {\n\tout.format(\"%s:%n\", s);\n\tfor (Member mbr : mbrs) {\n\t    if (mbr instanceof Field)\n\t\tout.format(\"  %s%n\", ((Field)mbr).toGenericString());\n\t    else if (mbr instanceof Constructor)\n\t\tout.format(\"  %s%n\", ((Constructor)mbr).toGenericString());\n\t    else if (mbr instanceof Method)\n\t\tout.format(\"  %s%n\", ((Method)mbr).toGenericString());\n\t}\n\tif (mbrs.length == 0)\n\t    out.format(\"  -- No %s --%n\", s);\n\tout.format(\"%n\");\n    }\n\n    private static void printClasses(Class&lt;?&gt; c) {\n\tout.format(\"Classes:%n\");\n\tClass&lt;?&gt;[] clss = c.getClasses();\n\tfor (Class&lt;?&gt; cls : clss)\n\t    out.format(\"  %s%n\", cls.getCanonicalName());\n\tif (clss.length == 0)\n\t    out.format(\"  -- No member interfaces, classes, or enums --%n\");\n\tout.format(\"%n\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">todo&nbsp;<strong>\u5173\u4e8e\u6784\u9020\u51fd\u6570\u7684\u590d\u4e60\uff1a<\/strong><br>\u5728C++\u548cJava\u4e2d\uff0c\u5bf9\u4e8e\u7ee7\u627f\u548c\u6784\u9020\u51fd\u6570\u7684\u5173\u7cfb<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"members-1\"><span class=\"ez-toc-section\" id=\"Members\"><\/span>Members<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u673a\u5236\u5b9a\u4e49\u4e86java.lang.reflect.Member\u63a5\u53e3\uff0c\u4ee5\u53ca\u4e09\u4e2aMember\u7684\u5b9e\u73b0java.lang.reflect.Field\u3001java.lang.reflect.Method\u548cjava.lang.reflect.Constructor\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e59f9ffields-1\"><span class=\"ez-toc-section\" id=\"%E5%9F%9FFields\"><\/span>\u57df(Fields)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u57df\u5177\u6709\u7c7b\u578b\u548c\u503c\u4e24\u4e2a\u5c5e\u6027\uff0cjava.lang.reflect.Field\u63d0\u4f9b\u4e86\u8bfb\u53d6\u57df\u7684\u7c7b\u578b\u4fe1\u606f\u548c\u8bfb\u5199\u57df\u7684\u503c\u7684\u65b9\u6cd5\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u7c7b\u578b\u4fe1\u606f<br>\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">  import java.lang.reflect.Field;\n  import java.util.List;\n  \n  public class FieldSpy&lt;T&gt; {\n      public boolean[][] b = { { false, false }, { true, true } };\n      public String name  = \"Alice\";\n      public List&lt;Integer&gt; list;\n      public T val;\n  \n      public static void main(String... args) {\n  \ttry {\n  \t    Class&lt;?&gt; c = Class.forName(args[0]);\n  \t    Field f = c.getField(args[1]);\n  \t    System.out.format(\"Type: %s%n\", f.getType());\n  \t    System.out.format(\"GenericType: %s%n\", f.getGenericType());\n  \n          <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n  \t} catch (ClassNotFoundException x) {\n  \t    x.printStackTrace();\n  \t} catch (NoSuchFieldException x) {\n  \t    x.printStackTrace();\n  \t}\n      }\n  }\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u57df\u7684\u7c7b\u578b\u7684<a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Class.html#getName--\">\u547d\u540d\u89c4\u5219<\/a>\u3002<br>\u5bf9\u4e8e\u6570\u7ec4\u7c7b\u578b\u7684\u5bf9\u8c61\u7684\u7c7b\u578b\uff0c\u7c7b\u578b\u540d\u4f1a\u4ee5**[<strong>\u5f00\u59cb(\u662f\u591a\u5c11\u7ef4\u6570\u7ec4\u5c31\u6709\u591a\u5c11\u4e2a<\/strong>[**)\uff0c\u7136\u540e\u63a5\u4e0a\u76f8\u5e94\u7684\u5143\u7d20\u7c7b\u578b\u7684\u7b80\u5199\u3002\u7b80\u5199\u89c4\u5219\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><strong>Element Type<\/strong><\/th><th><strong>Encoding<\/strong><\/th><\/tr><\/thead><tbody><tr><td>boolean<\/td><td>Z<\/td><\/tr><tr><td>byte<\/td><td>B<\/td><\/tr><tr><td>char<\/td><td>C<\/td><\/tr><tr><td>class or interface<\/td><td>Lclassname<\/td><\/tr><tr><td>double<\/td><td>D<\/td><\/tr><tr><td>float<\/td><td>F<\/td><\/tr><tr><td>int<\/td><td>I<\/td><\/tr><tr><td>long<\/td><td>J<\/td><\/tr><tr><td>short<\/td><td>S<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>java FieldSpy FieldSpy val<\/code>\u7684\u7ed3\u679c\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Type: class java.lang.Object GenericType: T<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u4e8e\u6cdb\u578b\u6709\u7c7b\u578b\u64e6\u9664\u7684\u673a\u5236\uff0c\u56e0\u6b64val\u7684Type\u662fObject\u3002\u5bf9\u4e8eGenericType\uff0cField.getGenericType()\u4f1a\u5728\u7f16\u8bd1\u7684\u7c7b\u6587\u4ef6\u67e5\u627eSignature Attribute\uff0c\u5982\u679c\u6ca1\u6709\u5c31\u4f1a\u56de\u9000\u5230Field.getType()\u7684\u5b9e\u73b0\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u5e76\u89e3\u6790\u4fee\u9970\u7b26<br>\u4fee\u9970\u7b26\uff1a<ul><li>public, protected, private<\/li><li>transient, volatile<\/li><li>static<\/li><li>final<\/li><li>annotations<\/li><\/ul>\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport static java.lang.System.out;\n\nenum Spy { BLACK , WHITE }\n\npublic class FieldModifierSpy {\n    volatile int share;\n    int instance;\n    class Inner {}\n\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    int searchMods = 0x0;\n\t    for (int i = 1; i &lt; args.length; i++) {\n\t\tsearchMods |= modifierFromString(args[i]);\n\t    }\n\n\t    Field[] flds = c.getDeclaredFields();\n\t    out.format(\"Fields in Class '%s' containing modifiers:  %s%n\",\n\t\t       c.getName(),\n\t\t       Modifier.toString(searchMods));\n\t    boolean found = false;\n\t    for (Field f : flds) {\n\t\tint foundMods = f.getModifiers();\n\t\t<em>\/\/ Require all of the requested modifiers to be present<\/em>\n\t\tif ((foundMods &amp; searchMods) == searchMods) {\n\t\t    out.format(\"%-8s [ synthetic=%-5b enum_constant=%-5b ]%n\",\n\t\t\t       f.getName(), f.isSynthetic(),\n\t\t\t       f.isEnumConstant());\n\t\t    found = true;\n\t\t}\n\t    }\n\n\t    if (!found) {\n\t\tout.format(\"No matching fields%n\");\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n\n    private static int modifierFromString(String s) {\n\tint m = 0x0;\n\tif (\"public\".equals(s))           m |= Modifier.PUBLIC;\n\telse if (\"protected\".equals(s))   m |= Modifier.PROTECTED;\n\telse if (\"private\".equals(s))     m |= Modifier.PRIVATE;\n\telse if (\"static\".equals(s))      m |= Modifier.STATIC;\n\telse if (\"final\".equals(s))       m |= Modifier.FINAL;\n\telse if (\"transient\".equals(s))   m |= Modifier.TRANSIENT;\n\telse if (\"volatile\".equals(s))    m |= Modifier.VOLATILE;\n\treturn m;\n    }\n}  \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u8bd1\u5668\u53ef\u80fd\u4f1a\u7c7b\u6dfb\u52a0\u4e00\u4e9b<em>synthetic fields<\/em>\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u4f7f\u7528\u793a\u4f8b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>$ java FieldModifierSpy FieldModifierSpy\\$Inner final<\/code>Fields in Class &#8216;FieldModifierSpy$Inner&#8217; containing modifiers: final<br>this$0 [ synthetic=true enum_constant=false ]<\/li><li><code>$ java FieldModifierSpy Spy private static final<\/code>Fields in Class &#8216;Spy&#8217; containing modifiers: private static final<br>$VALUES [ synthetic=true enum_constant=false ]<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>this0*\u548c*0\u2217\u548c\u2217VALUES<\/em>\u90fd\u662f\u7f16\u8bd1\u5668\u751f\u6210\u7684\u57df\u3002<em>this0*\u901a\u5e38\u7528\u4e8e\u5185\u90e8\u7c7b\uff0c\u7528\u4e8e\u5f15\u7528\u5916\u90e8\u7c7b\uff1b*0\u2217\u901a\u5e38\u7528\u4e8e\u5185\u90e8\u7c7b\uff0c\u7528\u4e8e\u5f15\u7528\u5916\u90e8\u7c7b\uff1b\u2217VALUES<\/em>\u901a\u5e38\u7528\u4e8e\u679a\u4e3e\uff0c\u4ee5\u5b9e\u73b0\u679a\u4e3e\u7c7b\u7684values()\u65b9\u6cd5\u3002\u8fd9\u4e24\u4e2a\u57df\u7684\u540d\u5b57\u53ef\u80fd\u4f1a\u56e0\u7f16\u8bd1\u5668\u5b9e\u73b0\u4e0d\u540c\u6216\u8005\u7248\u672c\u4e0d\u540c\u800c\u6709\u6240\u53d8\u5316\u3002Class.getDeclaredFields()\u4f1a\u5305\u542b<em>synthetic fields<\/em>\u800cClass.getFields()\u4e0d\u4f1a\uff0c\u56e0\u4e3a<em>synthetic fields<\/em>\u901a\u5e38\u4e0d\u662fpublic\u7684\u3002\u6b64\u5916\uff0c\u8981\u5224\u65ad\u4e00\u4e2a\u57df\u662f\u5426\u662f<em>synthetic field<\/em>\u53ef\u4ee5\u8c03\u7528Field.isSynthetic()\u3002<br>Field\u7c7b\u5b9e\u73b0\u4e86java.lang.reflect.AnnotatedElement\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u83b7\u5f97\u57df\u7684\u76f8\u5e94\u6ce8\u89e3\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8bfb\u5199\u57df\u7684\u503c<br>\u4f7f\u7528\u793a\u4f8b\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Field;\nimport java.util.Arrays;\nimport static java.lang.System.out;\n\nenum Tweedle { DEE, DUM }\n\npublic class Book {\n    public long chapters = 0;\n    public String[] characters = { \"Alice\", \"White Rabbit\" };\n    public Tweedle twin = Tweedle.DEE;\n\n    public static void main(String... args) {\n\tBook book = new Book();\n\tString fmt = \"%6S:  %-12s = %s%n\";\n\n\ttry {\n\t    Class&lt;?&gt; c = book.getClass();\n\n\t    Field chap = c.getDeclaredField(\"chapters\");\n\t    out.format(fmt, \"before\", \"chapters\", book.chapters);\n  \t    chap.setLong(book, 12);\n\t    out.format(fmt, \"after\", \"chapters\", chap.getLong(book));\n\n\t    Field chars = c.getDeclaredField(\"characters\");\n\t    out.format(fmt, \"before\", \"characters\",\n\t\t       Arrays.asList(book.characters));\n\t    String[] newChars = { \"Queen\", \"King\" };\n\t    chars.set(book, newChars);\n\t    out.format(fmt, \"after\", \"characters\",\n\t\t       Arrays.asList(book.characters));\n\n\t    Field t = c.getDeclaredField(\"twin\");\n\t    out.format(fmt, \"before\", \"twin\", book.twin);\n\t    t.set(book, Tweedle.DUM);\n\t    out.format(fmt, \"after\", \"twin\", t.get(book));\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (NoSuchFieldException x) {\n\t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5e38\u89c1\u9519\u8bef<br>\u4f7f\u7528\u53cd\u5c04\u4e3a\u57df\u8d4b\u503c\u65f6\uff0c\u9664\u4e86Class.isAssignableFrom()\u8fd4\u56detrue\u7684\u7c7b\u578b\uff0c\u7f16\u8bd1\u5668\u4e0d\u4f1a\u8fdb\u884cauto boxing\u3002\u800c\u6211\u4eec\u5e38\u89c1\u7684int\u548cInteger\uff0c<code>Integer.class.isAssignableFrom(int.class) == false<\/code>\uff0c<code>int.class.isAssignableFrom(Integer.class) == false<\/code>\u3002\u5373int\u548cInteger\u662f\u4e0d\u76f8\u5bb9\u7684\uff0c\u7f16\u8bd1\u5668\u4e0d\u4f1a\u81ea\u52a8boxing\u6216\u8005unboxing\u3002<br>\u4f7f\u7528\u53cd\u5c04\u4e3afinal\u57df\u8d4b\u503c\u65f6\u4f1a\u51fa\u73b0IllegalAccessException\uff0c\u5728security context\u5141\u8bb8\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u901a\u8fc7AccessibleObject.setAccessible()\u65b9\u6cd5\u4fee\u6539\u8be5\u57df\u7684\u5c5e\u6027\uff0c\u7136\u540e\u518d\u4e3a\u8be5final\u57df\u8d4b\u503c\u3002<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e696b9e6b395methods-1\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95Methods\"><\/span>\u65b9\u6cd5(Methods)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">java.lang.reflect.Method\u53ef\u4ee5\u83b7\u53d6\u65b9\u6cd5\u7684\u4fee\u9970\u7b26\u3001\u8fd4\u56de\u503c\u7c7b\u578b\u3001\u6ce8\u89e3\u3001\u629b\u51fa\u7684\u5f02\u5e38\uff0c\u4ee5\u53ca\u53ef\u4ee5\u7528\u6765\u8c03\u7528\u8fd9\u4e9b\u65b9\u6cd5\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u65b9\u6cd5\u7684\u7c7b\u578b\u4fe1\u606f<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Method;\nimport java.lang.reflect.Type;\nimport static java.lang.System.out;\n\npublic class MethodSpy {\n    private static final String  fmt = \"%24s: %s%n\";\n\n    <em>\/\/ for the morbidly curious<\/em>\n    &lt;E extends RuntimeException&gt; void genericThrow() throws E {}\n\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Method[] allMethods = c.getDeclaredMethods();\n\t    for (Method m : allMethods) {\n\t\tif (!m.getName().equals(args[1])) {\n\t\t    continue;\n\t\t}\n\t\tout.format(\"%s%n\", m.toGenericString());\n\n\t\tout.format(fmt, \"ReturnType\", m.getReturnType());\n\t\tout.format(fmt, \"GenericReturnType\", m.getGenericReturnType());\n\n\t\tClass&lt;?&gt;[] pType  = m.getParameterTypes();\n\t\tType[] gpType = m.getGenericParameterTypes();\n\t\tfor (int i = 0; i &lt; pType.length; i++) {\n\t\t    out.format(fmt,\"ParameterType\", pType[i]);\n\t\t    out.format(fmt,\"GenericParameterType\", gpType[i]);\n\t\t}\n\n\t\tClass&lt;?&gt;[] xType  = m.getExceptionTypes();\n\t\tType[] gxType = m.getGenericExceptionTypes();\n\t\tfor (int i = 0; i &lt; xType.length; i++) {\n\t\t    out.format(fmt,\"ExceptionType\", xType[i]);\n\t\t    out.format(fmt,\"GenericExceptionType\", gxType[i]);\n\t\t}\n\t    }\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c\u793a\u4f8b\uff1a<br><code>$ java MethodSpy java.lang.Class getConstructor<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">public java.lang.reflect.Constructor&lt;T&gt; java.lang.Class.getConstructor\n(java.lang.Class&lt;?&gt;[]) throws java.lang.NoSuchMethodException,\njava.lang.SecurityException\n            ReturnType: class java.lang.reflect.Constructor\n     GenericReturnType: java.lang.reflect.Constructor&lt;T&gt;\n         ParameterType: class [Ljava.lang.Class;\n  GenericParameterType: java.lang.Class&lt;?&gt;[]\n         ExceptionType: class java.lang.NoSuchMethodException\n  GenericExceptionType: class java.lang.NoSuchMethodException\n         ExceptionType: class java.lang.SecurityException\n  GenericExceptionType: class java.lang.SecurityException\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bf4\u660e\uff1a\u9996\u5148\uff0c\u50cf\u8fd9\u79cdgetGenericXXXType()\u7684\uff0c\u5148\u5728\u7f16\u8bd1\u540e\u7684\u7c7b\u6587\u4ef6\u4e2d\u67e5\u8be2Signature Attribute\uff0c\u5982\u679c\u6ca1\u6709\u8fd9\u4e2aSignature Attribute\uff0c\u518d\u56de\u9000\u5230getXXXType()\u3002\u5176\u6b21\u8fd9\u4e2aMethodSpy\u7684main\u65b9\u6cd5\u7684\u8f93\u5165\u53c2\u6570\u662f\u53ef\u53d8\u53c2\u6570\uff0c\u53cd\u5c04\u7684\u7ed3\u679c\u8868\u660e\u8fd9\u4e2a\u53ef\u53d8\u53c2\u6570\u662f\u5f53\u505a\u6570\u7ec4\u6765\u5904\u7406\u7684\uff0c\u90a3\u4e48\u5982\u4f55\u548c\u771f\u6b63\u4f7f\u7528\u6570\u7ec4\u4f5c\u4e3a\u53c2\u6570\u7684\u65b9\u6cd5\u533a\u5206\u5462\uff1f\u4f7f\u7528Method.isVarArgs()\u65b9\u6cd5\u5373\u53ef\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u65b9\u6cd5\u7684\u53c2\u6570\u540d<br>\u4e00\u822c\u7f16\u8bd1\u5668\u4f1a\u5728\u7f16\u8bd1\u65f6\u53bb\u6389\u53c2\u6570\u540d\uff0c\u56e0\u6b64\u5982\u679c\u60f3\u901a\u8fc7\u53cd\u5c04\u6765\u83b7\u53d6\u53c2\u6570\u7684\u540d\u5b57\uff0c\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u52a0\u4e0a<code>-parameters<\/code>\u53c2\u6570\u6307\u793a\u7f16\u8bd1\u5668\u4fdd\u7559\u53c2\u6570\u540d\u3002\u7528\u4e8e\u83b7\u53d6\u65b9\u6cd5(\u5305\u62ec\u6784\u9020\u51fd\u6570)\u53c2\u6570\u540d\u7684\u7a0b\u5e8f\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"><em>\/*\n * Copyright (c) 2013, Oracle and\/or its affiliates. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n *   - Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *\n *   - Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and\/or other materials provided with the distribution.\n *\n *   - Neither the name of Oracle or the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n * IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\/<\/em> \n\nimport java.lang.reflect.*;\nimport java.util.function.*;\nimport static java.lang.System.out;\n\npublic class MethodParameterSpy {\n    \n    private static final String  fmt = \"%24s: %s%n\";\n\n    <em>\/\/ for the morbidly curious<\/em>\n    &lt;E extends RuntimeException&gt; void genericThrow() throws E {}\n    \n    public static void printClassConstructors(Class c) {\n        Constructor[] allConstructors = c.getConstructors();\n        out.format(fmt, \"Number of constructors\", allConstructors.length);\n        for (Constructor currentConstructor : allConstructors) {\n            printConstructor(currentConstructor);\n        }  \n        Constructor[] allDeclConst = c.getDeclaredConstructors();\n        out.format(fmt, \"Number of declared constructors\",\n            allDeclConst.length);\n        for (Constructor currentDeclConst : allDeclConst) {\n            printConstructor(currentDeclConst);\n        }          \n    }\n    \n    public static void printClassMethods(Class c) {\n       Method[] allMethods = c.getDeclaredMethods();\n        out.format(fmt, \"Number of methods\", allMethods.length);\n        for (Method m : allMethods) {\n            printMethod(m);\n        }        \n    }\n    \n    public static void printConstructor(Constructor c) {\n        out.format(\"%s%n\", c.toGenericString());\n        Parameter[] params = c.getParameters();\n        out.format(fmt, \"Number of parameters\", params.length);\n        for (int i = 0; i &lt; params.length; i++) {\n            printParameter(params[i]);\n        }\n    }\n    \n    public static void printMethod(Method m) {\n        out.format(\"%s%n\", m.toGenericString());\n        out.format(fmt, \"Return type\", m.getReturnType());\n        out.format(fmt, \"Generic return type\", m.getGenericReturnType());\n                \n        Parameter[] params = m.getParameters();\n        for (int i = 0; i &lt; params.length; i++) {\n            printParameter(params[i]);\n        }\n    }\n    \n    public static void printParameter(Parameter p) {\n        out.format(fmt, \"Parameter class\", p.getType());\n        out.format(fmt, \"Parameter name\", p.getName());\n        out.format(fmt, \"Modifiers\", p.getModifiers());\n        out.format(fmt, \"Is implicit?\", p.isImplicit());\n        out.format(fmt, \"Is name present?\", p.isNamePresent());\n        out.format(fmt, \"Is synthetic?\", p.isSynthetic());\n    }\n    \n    public static void main(String... args) {        \n\n        try {\n            printClassConstructors(Class.forName(args[0]));\n            printClassMethods(Class.forName(args[0]));\n        } catch (ClassNotFoundException x) {\n            x.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u7f16\u8bd1\u65f6\u6ca1\u6709\u7528<code>-parameters<\/code>\u53c2\u6570\uff0c\u90a3\u4e48Parameter.getName()\u4f1a\u8fd4\u56de\u4e00\u4e2asynthetic\u7684\u540d\u5b57argN\uff0cN\u662f\u8be5\u53c2\u6570\u5728\u65b9\u6cd5\u53c2\u6570\u5217\u8868\u4e2d\u7684\u7d22\u5f15\u3002<br>\u5173\u4e8e\u4fee\u9970\u7b26\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><strong>Value(in decimal)<\/strong><\/th><th><strong>Value(in hexadecimal)<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>16<\/td><td>0x0010<\/td><td>The formal parameter is declared final<\/td><\/tr><tr><td>4096<\/td><td>0x1000<\/td><td>The formal parameter is synthetic. Alternatively, you can invoke the method&nbsp;<em>isSynthetic<\/em><\/td><\/tr><tr><td>32768<\/td><td>0x8000<\/td><td>The parameter is implicitly declared in source code. Alternatively, you can invoke the method&nbsp;<em>isImplicitly<\/em><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u4e8eParameter\u7684\u51e0\u4e2a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>isImplicit()<\/em><br>\u5982\u679c\u8be5\u53c2\u6570\u662f\u9690\u5f0f\u58f0\u660e\u7684\uff0c\u90a3\u4e48\u5c31\u8fd4\u56detrue\u3002implicit\u7684\u60c5\u5f62\uff1a\u5185\u90e8\u7c7b\u7684\u65b9\u6cd5\u90fd\u4f1a\u5c06\u5916\u90e8\u7c7b\u7684\u5bf9\u8c61\u4f5c\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\uff0c\u8fd9\u4e2a\u53c2\u6570\u5c31\u662fimplicit\u7684\u3002<\/li><li><em>isNamePresent()<\/em><br>\u5982\u679c.class\u6587\u4ef6\u5305\u542b\u4e86\u8fd9\u4e2a\u53c2\u6570\u7684\u540d\u5b57\u4fe1\u606f\u5c31\u8fd4\u56detrue\u3002<\/li><li><em>isSynthetic()<\/em><br>\u5982\u679c\u8fd9\u4e2a\u53c2\u6570\u65e2\u4e0d\u662f\u663e\u5f0f\u58f0\u660e\u4e5f\u4e0d\u662f\u9690\u5f0f\u58f0\u660e\u7684\uff0c\u90a3\u4e48\u8fd9\u4e2a\u53c2\u6570\u5c31\u662fsynthetic\u7684\u3002\u6bd4\u5982\u7f16\u8bd1\u5668\u4e3a\u4e0b\u9762\u7684enum\u7c7b\u578bColors\u751f\u6210\u7684\u6784\u9020\u51fd\u6570\u7684\u53c2\u6570\u5c31\u662fsynthetic\u7684\u3002<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">public class MethodParameterExamples {\n    enum Colors {\n        RED, WHITE;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u4e0a\u9762\u7684java\u4ee3\u7801\uff0c\u7f16\u8bd1\u5668\u4f1a\u751f\u6210\u542b\u6709\u5927\u81f4\u5982\u4e0b\u5185\u5bb9\u7684.class\u6587\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">final class Colors extends java.lang.Enum&lt;Colors&gt; {\n    public final static Colors RED = new Colors(\"RED\", 0);\n    public final static Colors BLUE = new Colors(\"WHITE\", 1);\n \n    private final static values = new Colors[]{ RED, BLUE };\n \n    private Colors(String name, int ordinal) {\n        super(name, ordinal);\n    }\n \n    public static Colors[] values(){\n        return values;\n    }\n \n    public static Colors valueOf(String name){\n        return (Colors)java.lang.Enum.valueOf(Colors.class, name);\n    }\n}\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\u53ef\u4ee5\u770b\u5230\uff0c\u7f16\u8bd1\u5668\u751f\u6210\u4e86\u4e00\u4e2a`private Colors(String name, int ordinal)`\u7684\u6784\u9020\u51fd\u6570\uff0c\u800c\u4e14\u8fd9\u4e2a\u6784\u9020\u51fd\u6570\u662f\u6709\u4e24\u4e2a\u53c2\u6570\u7684\uff0c\u8fd9\u4e24\u4e2a\u53c2\u6570\u5c31\u662fsynthetic\u7684\u3002  \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>java MethodParameterSpy MethodParameterExamples\\$Colors<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">Number of constructors: 0\nNumber of declared constructors: 1\nprivate MethodParameterExamples$Colors()\n    Number of parameters: 2\n         Parameter class: class java.lang.String\n          Parameter name: $enum$name\n               Modifiers: 4096\n            Is implicit?: false\n        Is name present?: true\n           Is synthetic?: true\n         Parameter class: int\n          Parameter name: $enum$ordinal\n               Modifiers: 4096\n            Is implicit?: false\n        Is name present?: true\n           Is synthetic?: true\n       Number of methods: 2\npublic static MethodParameterExamples$Colors[] MethodParameterExamples$Colors.values()\n             Return type: class [LMethodParameterExamples$Colors;\n     Generic return type: class [LMethodParameterExamples$Colors;\npublic static MethodParameterExamples$Colors MethodParameterExamples$Colors.valueOf(java.lang.String)\n             Return type: class MethodParameterExamples$Colors\n     Generic return type: class MethodParameterExamples$Colors\n         Parameter class: class java.lang.String\n          Parameter name: name\n               Modifiers: 32768\n            Is implicit?: true\n        Is name present?: true\n           Is synthetic?: false\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u3001\u4fee\u6539\u65b9\u6cd5\u7684\u4fee\u9970\u7b26\u65b9\u6cd5\u7684\u4fee\u9970\u7b26\uff1a<ul><li>public, protected, private<\/li><li>static<\/li><li>final<\/li><li>abstract<\/li><li>synchronized<\/li><li>native<\/li><li>strictfp<\/li><li>annotations<\/li><\/ul>\u4ee3\u7801\u793a\u4f8b\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport static java.lang.System.out;\n\npublic class MethodModifierSpy {\n\n    private static int count;\n    private static synchronized void inc() { count++; }\n    private static synchronized int cnt() { return count; }\n\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Method[] allMethods = c.getDeclaredMethods();\n\t    for (Method m : allMethods) {\n\t\tif (!m.getName().equals(args[1])) {\n\t\t    continue;\n\t\t}\n\t\tout.format(\"%s%n\", m.toGenericString());\n\t\tout.format(\"  Modifiers:  %s%n\",\n\t\t\t   Modifier.toString(m.getModifiers()));\n\t\tout.format(\"  [ synthetic=%-5b var_args=%-5b bridge=%-5b ]%n\",\n\t\t\t   m.isSynthetic(), m.isVarArgs(), m.isBridge());\n\t\tinc();\n\t    }\n\t    out.format(\"%d matching overload%s found%n\", cnt(),\n\t\t       (cnt() == 1 ? \"\" : \"s\"));\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8c03\u7528\u65b9\u6cd5<br>\u793a\u4f8b\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">mport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Type;\nimport java.util.Locale;\nimport static java.lang.System.out;\nimport static java.lang.System.err;\n\npublic class Deet&lt;T&gt; {\n    private boolean testDeet(Locale l) {\n\t<em>\/\/ getISO3Language() may throw a MissingResourceException<\/em>\n\tout.format(\"Locale = %s, ISO Language Code = %s%n\", l.getDisplayName(), l.getISO3Language());\n\treturn true;\n    }\n\n    private int testFoo(Locale l) { return 0; }\n    private boolean testBar() { return true; }\n\n    public static void main(String... args) {\n\tif (args.length != 4) {\n\t    err.format(\"Usage: java Deet &lt;classname&gt; &lt;langauge&gt; &lt;country&gt; &lt;variant&gt;%n\");\n\t    return;\n\t}\n\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Object t = c.newInstance();\n\n\t    Method[] allMethods = c.getDeclaredMethods();\n\t    for (Method m : allMethods) {\n\t\tString mname = m.getName();\n\t\tif (!mname.startsWith(\"test\")\n\t\t    || (m.getGenericReturnType() != boolean.class)) {\n\t\t    continue;\n\t\t}\n \t\tType[] pType = m.getGenericParameterTypes();\n \t\tif ((pType.length != 1)\n\t\t    || Locale.class.isAssignableFrom(pType[0].getClass())) {\n \t\t    continue;\n \t\t}\n\n\t\tout.format(\"invoking %s()%n\", mname);\n\t\ttry {\n\t\t    m.setAccessible(true);\n\t\t    Object o = m.invoke(t, new Locale(args[1], args[2], args[3]));\n\t\t    out.format(\"%s() returned %b%n\", mname, (Boolean) o);\n\n\t\t<em>\/\/ Handle any exceptions thrown by method to be invoked.<\/em>\n\t\t} catch (InvocationTargetException x) {\n\t\t    Throwable cause = x.getCause();\n\t\t    err.format(\"invocation of %s failed: %s%n\",\n\t\t\t       mname, cause.getMessage());\n\t\t}\n\t    }\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t} catch (InstantiationException x) {\n\t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8c03\u7528\u542b\u6709\u53ef\u53d8\u53c2\u6570\u3001\u4ee5\u53castatic\u7684\u51fd\u6570\u7684\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\n\npublic class InvokeMain {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Class[] argTypes = new Class[] { String[].class };\n\t    Method main = c.getDeclaredMethod(\"main\", argTypes);\n  \t    String[] mainArgs = Arrays.copyOfRange(args, 1, args.length);\n\t    System.out.format(\"invoking %s.main()%n\", c.getName());\n\t    main.invoke(null, (Object)mainArgs);\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t} catch (NoSuchMethodException x) {\n\t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t} catch (InvocationTargetException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5e38\u89c1\u51fa\u9519<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e69e84e980a0e587bde695b0constructors-1\"><span class=\"ez-toc-section\" id=\"%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0Constructors\"><\/span>\u6784\u9020\u51fd\u6570(Constructors)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u67e5\u627e\u6784\u9020\u51fd\u6570\uff1a<br>\u67e5\u627e\u5177\u6709\u6307\u5b9a\u7c7b\u578b\u53c2\u6570\u7684\u6784\u9020\u51fd\u6570\u7684\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Constructor;\nimport java.lang.reflect.Type;\nimport static java.lang.System.out;\n\npublic class ConstructorSift {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; cArg = Class.forName(args[1]);\n\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Constructor[] allConstructors = c.getDeclaredConstructors();\n\t    for (Constructor ctor : allConstructors) {\n\t\tClass&lt;?&gt;[] pType  = ctor.getParameterTypes();\n\t\tfor (int i = 0; i &lt; pType.length; i++) {\n\t\t    if (pType[i].equals(cArg)) {\n\t\t\tout.format(\"%s%n\", ctor.toGenericString());\n\n\t\t\tType[] gpType = ctor.getGenericParameterTypes();\n\t\t\tfor (int j = 0; j &lt; gpType.length; j++) {\n\t\t\t    char ch = (pType[j].equals(cArg) ? '*' : ' ');\n\t\t\t    out.format(\"%7c%s[%d]: %s%n\", ch,\n\t\t\t\t       \"GenericParameterType\", j, gpType[j]);\n\t\t\t}\n\t\t\tbreak;\n\t\t    }\n\t\t}\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u3001\u4fee\u6539\u6784\u9020\u51fd\u6570\u4fee\u9970\u7b26<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Constructor;\nimport java.lang.reflect.Modifier;\nimport java.lang.reflect.Type;\nimport static java.lang.System.out;\n\npublic class ConstructorAccess {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    Constructor[] allConstructors = c.getDeclaredConstructors();\n\t    for (Constructor ctor : allConstructors) {\n\t\tint searchMod = modifierFromString(args[1]);\n\t\tint mods = accessModifiers(ctor.getModifiers());\n\t\tif (searchMod == mods) {\n\t\t    out.format(\"%s%n\", ctor.toGenericString());\n\t\t    out.format(\"  [ synthetic=%-5b var_args=%-5b ]%n\",\n\t\t\t       ctor.isSynthetic(), ctor.isVarArgs());\n\t\t}\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n\n    private static int accessModifiers(int m) {\n\treturn m &amp; (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED);\n    }\n\n    private static int modifierFromString(String s) {\n\tif (\"public\".equals(s))               return Modifier.PUBLIC;\n\telse if (\"protected\".equals(s))       return Modifier.PROTECTED;\n\telse if (\"private\".equals(s))         return Modifier.PRIVATE;\n\telse if (\"package-private\".equals(s)) return 0;\n\telse return -1;\n    }\n} \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">public class SyntheticConstructor {\n    private SyntheticConstructor() {}\n    class Inner {\n\t<em>\/\/ Compiler will generate a synthetic constructor since<\/em>\n\t<em>\/\/ SyntheticConstructor() is private.<\/em>\n\tInner() { new SyntheticConstructor(); }\n    }\n}\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>$ java ConstructorAccess SyntheticConstructor package-private<\/code><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>SyntheticConstructor(SyntheticConstructor$1) [ synthetic=true var_args=false ]<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u4e8e\u5185\u90e8\u7c7b\u5f15\u7528\u4e86\u5916\u90e8\u7c7b\u7684private\u6784\u9020\u51fd\u6570\uff0c\u7f16\u8bd1\u5668\u4f1a\u751f\u6210\u4e00\u4e2aSyntheticConstructor\u7c7b\u7684package-private\u7684\u6784\u9020\u51fd\u6570\u3002\u50cf\u8fd9\u79cd\u4f7f\u7528\u4e86synthetic(compiler generated)\u6216\u8005non-public\u7684\u7c7b\u6210\u5458\u7684\u4ee3\u7801\u662f\u6709\u53ef\u79fb\u690d\u6027\u95ee\u9898\u7684\u3002\u56e0\u4e3a\u50cf\u8fd9\u4e2a\u7f16\u8bd1\u5668\u751f\u6210\u7684\u6784\u9020\u51fd\u6570\u7684\u53c2\u6570\u7c7b\u578bSyntheticConstructor$1\u662f\u8ddf\u7f16\u8bd1\u5668\u5b9e\u73b0\u76f8\u5173\u7684\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u521b\u5efa\u65b0\u7684\u7c7b\u5b9e\u4f8b<br>\u901a\u8fc7\u53cd\u5c04\u521b\u5efa\u7c7b\u7684\u5b9e\u4f8b\u6709\u4e24\u79cd\u65b9\u6cd5\uff1ajava.lang.reflect.Constructor.newInstance()\u548cClass.newInstance()\u3002\u63a8\u8350\u4f7f\u7528\u524d\u8005\uff1a<ul><li>Class.newInstance()\u53ea\u80fd\u8c03\u7528\u4e0d\u9700\u8981\u63d0\u4f9b\u53c2\u6570\u7684\u6784\u9020\u51fd\u6570<\/li><li>Class.newInstance()\u4f1a\u629b\u51fa\u76f8\u5e94\u6784\u9020\u51fd\u6570\u4f1a\u629b\u51fa\u7684\u5404\u79cd\u7c7b\u578b\u7684\u5f02\u5e38\uff0c\u800cConstructor.newInstance()\u53ea\u4f1a\u629b\u51fa\u7ecf\u8fc7\u5c01\u88c5\u4e86\u7684InvocationTargetException\u3002<\/li><li>Class.newInstance()\u8981\u6c42\u76f8\u5e94\u7684\u6784\u9020\u51fd\u6570\u53ef\u89c1\uff1b\u800cConstructor.newInstance()\u53ef\u4ee5\u5728\u7279\u5b9a\u60c5\u666f\u4e0b\u8c03\u7528private\u7684\u6784\u9020\u51fd\u6570\u3002<\/li><\/ul><\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.io.Console;\nimport java.nio.charset.Charset;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport static java.lang.System.out;\n\npublic class ConsoleCharset {\n    public static void main(String... args) {\n\tConstructor[] ctors = Console.class.getDeclaredConstructors();\n\tConstructor ctor = null;\n\tfor (int i = 0; i &lt; ctors.length; i++) {\n\t    ctor = ctors[i];\n\t    if (ctor.getGenericParameterTypes().length == 0)\n\t\tbreak;\n\t}\n\n\ttry {\n\t    ctor.setAccessible(true);\n \t    Console c = (Console)ctor.newInstance();\n\t    Field f = c.getClass().getDeclaredField(\"cs\");\n\t    f.setAccessible(true);\n\t    out.format(\"Console charset         :  %s%n\", f.get(c));\n\t    out.format(\"Charset.defaultCharset():  %s%n\",\n\t\t       Charset.defaultCharset());\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (InstantiationException x) {\n\t    x.printStackTrace();\n \t} catch (InvocationTargetException x) {\n \t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t} catch (NoSuchFieldException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5e38\u89c1\u95ee\u9898<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"e695b0e7bb84e4b88ee69e9ae4b8bee7b1bbe59e8b-1\"><span class=\"ez-toc-section\" id=\"%E6%95%B0%E7%BB%84%E4%B8%8E%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B\"><\/span>\u6570\u7ec4\u4e0e\u679a\u4e3e\u7c7b\u578b<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u6570\u7ec4\u548c\u679a\u4e3e\u7c7b\u578b\u5176\u5b9e\u4e5f\u662f\u7c7b\uff0c\u4e0d\u8fc7\u53cd\u5c04\u4e3a\u4ed6\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e9b\u7279\u522b\u7684api\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e695b0e7bb84-1\"><span class=\"ez-toc-section\" id=\"%E6%95%B0%E7%BB%84\"><\/span>\u6570\u7ec4<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u4e3a\u6570\u7ec4\u63d0\u4f9b\u4e86\u4e00\u4e9bapi\u7528\u6765\u5bf9\u6570\u7ec4\u4e2d\u7684\u6210\u5458\u8fdb\u884c\u64cd\u4f5c(\u5bf9\u6570\u7ec4\u6574\u4f53\u8fdb\u884c\u64cd\u4f5c\u7684\u8bdd\u90a3\u5c31\u548c\u524d\u9762\u8bb2\u7684\u4e00\u6837\u4e86)\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u786e\u5b9a\u6570\u7ec4\u7c7b\u578b<br>\u4f7f\u7528Class.isArray()\u65b9\u6cd5\u5224\u65ad\u4e00\u4e2a\u7c7b\u662f\u5426\u662f\u6570\u7ec4\u7c7b\u578b\u3002<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Field;\nimport java.lang.reflect.Type;\nimport static java.lang.System.out;\n\npublic class ArrayFind {\n    public static void main(String... args) {\n\tboolean found = false;\n \ttry {\n\t    Class&lt;?&gt; cls = Class.forName(args[0]);\n\t    Field[] flds = cls.getDeclaredFields();\n\t    for (Field f : flds) {\n \t\tClass&lt;?&gt; c = f.getType();\n\t\tif (c.isArray()) {\n\t\t    found = true;\n\t\t    out.format(\"%s%n\"\n                               + \"           Field: %s%n\"\n\t\t\t       + \"            Type: %s%n\"\n\t\t\t       + \"  Component Type: %s%n\",\n\t\t\t       f, f.getName(), c, c.getComponentType());\n\t\t}\n\t    }\n\t    if (!found) {\n\t\tout.format(\"No array fields%n\");\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n \t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u521b\u5efa\u65b0\u7684\u6570\u7ec4<br>\u4f7f\u7528java.lang.reflect.Array.newInstance()\u521b\u5efa\u6570\u7ec4\u3002<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Array;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.regex.Pattern;\nimport java.util.regex.Matcher;\nimport java.util.Arrays;\nimport static java.lang.System.out;\n\npublic class ArrayCreator {\n    private static String s = \"java.math.BigInteger bi[] = { 123, 234, 345 }\";\n    private static Pattern p = Pattern.compile(\"^\\\\s*(\\\\S+)\\\\s*\\\\w+\\\\[\\\\].*\\\\{\\\\s*([^}]+)\\\\s*\\\\}\");\n\n    public static void main(String... args) {\n        Matcher m = p.matcher(s);\n\n        if (m.find()) {\n            String cName = m.group(1);\n            String[] cVals = m.group(2).split(\"[\\\\s,]+\");\n            int n = cVals.length;\n\n            try {\n                Class&lt;?&gt; c = Class.forName(cName);\n                Object o = Array.newInstance(c, n);\n                for (int i = 0; i &lt; n; i++) {\n                    String v = cVals[i];\n                    Constructor ctor = c.getConstructor(String.class);\n                    Object val = ctor.newInstance(v);\n                    Array.set(o, i, val);\n                }\n\n                Object[] oo = (Object[])o;\n                out.format(\"%s[] = %s%n\", cName, Arrays.toString(oo));\n\n            <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n            } catch (ClassNotFoundException x) {\n                x.printStackTrace();\n            } catch (NoSuchMethodException x) {\n                x.printStackTrace();\n            } catch (IllegalAccessException x) {\n                x.printStackTrace();\n            } catch (InstantiationException x) {\n                x.printStackTrace();\n            } catch (InvocationTargetException x) {\n                x.printStackTrace();\n            }\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8bfb\u5199\u6570\u7ec4\u53ca\u5176\u5143\u7d20<br>\u8bfb\u5199(int)\u6570\u7ec4\u5143\u7d20\u4f7f\u7528Array.setInt(Object array, int index, int value)\u548cArray.getInt(Object array, int index)\uff1b<br>\u5bf9\u4e8e\u4e00\u822c\u7684\u5f15\u7528\u7c7b\u578b\u7684\u6570\u7ec4\u7684\u8bfb\u5199\uff1aArray.set(Object array, int index, int value)\u548cArray.get(Object array, int index)\uff1b\u4e24\u4e2a\u4f8b\u5b50\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.io.BufferedReader;\nimport java.io.CharArrayReader;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.lang.reflect.Field;\nimport java.util.Arrays;\nimport static java.lang.System.out;\n\npublic class GrowBufferedReader {\n    private static final int srcBufSize = 10 * 1024;\n    private static char[] src = new char[srcBufSize];\n    static {\n\tsrc[srcBufSize - 1] = 'x';\n    }\n    private static CharArrayReader car = new CharArrayReader(src);\n\n    public static void main(String... args) {\n\ttry {\n\t    BufferedReader br = new BufferedReader(car);\n\n\t    Class&lt;?&gt; c = br.getClass();\n\t    Field f = c.getDeclaredField(\"cb\");\n\n\t    <em>\/\/ cb is a private field<\/em>\n\t    f.setAccessible(true);\n\t    char[] cbVal = char[].class.cast(f.get(br));\n\n\t    char[] newVal = Arrays.copyOf(cbVal, cbVal.length * 2);\n\t    if (args.length &gt; 0 &amp;&amp; args[0].equals(\"grow\"))\n\t\tf.set(br, newVal);\n\n\t    for (int i = 0; i &lt; srcBufSize; i++)\n\t\tbr.read();\n\n\t    <em>\/\/ see if the new backing array is being used<\/em>\n\t    if (newVal[srcBufSize - 1] == src[srcBufSize - 1])\n\t\tout.format(\"Using new backing array, size=%d%n\", newVal.length);\n\t    else\n\t\tout.format(\"Using original backing array, size=%d%n\", cbVal.length);\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (FileNotFoundException x) {\n\t    x.printStackTrace();\n\t} catch (NoSuchFieldException x) {\n\t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t} catch (IOException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Array;\nimport static java.lang.System.out;\n\npublic class CreateMatrix {\n    public static void main(String... args) {\n        Object matrix = Array.newInstance(int.class, 2, 2);\n        Object row0 = Array.get(matrix, 0);\n        Object row1 = Array.get(matrix, 1);\n\n        Array.setInt(row0, 0, 1);\n        Array.setInt(row0, 1, 2);\n        Array.setInt(row1, 0, 3);\n        Array.setInt(row1, 1, 4);\n\n        for (int i = 0; i &lt; 2; i++)\n            for (int j = 0; j &lt; 2; j++)\n                out.format(\"matrix[%d][%d] = %d%n\", i, j, ((int[][])matrix)[i][j]);\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5e38\u89c1\u9519\u8bef<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e6938de4bd9ce69e9ae4b8bee7b1bbe59e8b-1\"><span class=\"ez-toc-section\" id=\"%E6%93%8D%E4%BD%9C%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B\"><\/span>\u64cd\u4f5c\u679a\u4e3e\u7c7b\u578b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u4e3a\u679a\u4e3e\u7c7b\u578b\u63d0\u4f9b\u7684\u7279\u6b8aapi\uff1aClass.isEnum()\uff0cClass.getEnumConstants()\u548cjava.lang.reflect.Field.isEnumConstant()\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u83b7\u53d6\u6240\u6709\u7684Enum\u503c<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.util.Arrays;\nimport static java.lang.System.out;\n\nenum Eon { HADEAN, ARCHAEAN, PROTEROZOIC, PHANEROZOIC }\n\npublic class EnumConstants {\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = (args.length == 0 ? Eon.class : Class.forName(args[0]));\n\t    out.format(\"Enum name:  %s%nEnum constants:  %s%n\",\n\t\t       c.getName(), Arrays.asList(c.getEnumConstants()));\n\t    if (c == Eon.class)\n\t\tout.format(\"  Eon.values():  %s%n\",\n\t\t\t   Arrays.asList(Eon.values()));\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">enum\u7c7b\u578b\u91cc\u7684\u57df\u4e0d\u5168\u90e8\u90fd\u662fenum constant\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Member;\nimport java.util.List;\nimport java.util.ArrayList;\nimport static java.lang.System.out;\n\npublic class EnumSpy {\n    private static final String fmt = \"  %11s:  %s %s%n\";\n\n    public static void main(String... args) {\n\ttry {\n\t    Class&lt;?&gt; c = Class.forName(args[0]);\n\t    if (!c.isEnum()) {\n\t\tout.format(\"%s is not an enum type%n\", c);\n\t\treturn;\n\t    }\n\t    out.format(\"Class:  %s%n\", c);\n\n\t    Field[] flds = c.getDeclaredFields();\n\t    List&lt;Field&gt; cst = new ArrayList&lt;Field&gt;();  <em>\/\/ enum constants<\/em>\n\t    List&lt;Field&gt; mbr = new ArrayList&lt;Field&gt;();  <em>\/\/ member fields<\/em>\n\t    for (Field f : flds) {\n\t\tif (f.isEnumConstant())\n\t\t    cst.add(f);\n\t\telse\n\t\t    mbr.add(f);\n\t    }\n\t    if (!cst.isEmpty())\n\t\tprint(cst, \"Constant\");\n\t    if (!mbr.isEmpty())\n\t\tprint(mbr, \"Field\");\n\n\t    Constructor[] ctors = c.getDeclaredConstructors();\n\t    for (Constructor ctor : ctors) {\n\t\tout.format(fmt, \"Constructor\", ctor.toGenericString(),\n\t\t\t   synthetic(ctor));\n\t    }\n\n\t    Method[] mths = c.getDeclaredMethods();\n\t    for (Method m : mths) {\n\t\tout.format(fmt, \"Method\", m.toGenericString(),\n\t\t\t   synthetic(m));\n\t    }\n\n        <em>\/\/ production code should handle this exception more gracefully<\/em>\n\t} catch (ClassNotFoundException x) {\n\t    x.printStackTrace();\n\t}\n    }\n\n    private static void print(List&lt;Field&gt; lst, String s) {\n\tfor (Field f : lst) {\n \t    out.format(fmt, s, f.toGenericString(), synthetic(f));\n\t}\n    }\n\n    private static String synthetic(Member m) {\n\treturn (m.isSynthetic() ? \"[ synthetic ]\" : \"\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>$ java EnumSpy java.lang.annotation.RetentionPolicy<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">Class:  class java.lang.annotation.RetentionPolicy\n   Constant:  public static final java.lang.annotation.RetentionPolicy\n                java.lang.annotation.RetentionPolicy.SOURCE \n   Constant:  public static final java.lang.annotation.RetentionPolicy\n                java.lang.annotation.RetentionPolicy.CLASS \n   Constant:  public static final java.lang.annotation.RetentionPolicy \n                java.lang.annotation.RetentionPolicy.RUNTIME \n      Field:  private static final java.lang.annotation.RetentionPolicy[] \n                java.lang.annotation.RetentionPolicy. [ synthetic ]\nConstructor:  private java.lang.annotation.RetentionPolicy() \n     Method:  public static java.lang.annotation.RetentionPolicy[]\n                java.lang.annotation.RetentionPolicy.values() \n     Method:  public static java.lang.annotation.RetentionPolicy\n                java.lang.annotation.RetentionPolicy.valueOf(java.lang.String) \n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8bfb\u5199\u679a\u4e3e\u7c7b\u578b\u7684\u57df<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">import java.lang.reflect.Field;\nimport static java.lang.System.out;\n\nenum TraceLevel { OFF, LOW, MEDIUM, HIGH, DEBUG }\n\nclass MyServer {\n    private TraceLevel level = TraceLevel.OFF;\n}\n\npublic class SetTrace {\n    public static void main(String... args) {\n\tTraceLevel newLevel = TraceLevel.valueOf(args[0]);\n\n\ttry {\n\t    MyServer svr = new MyServer();\n\t    Class&lt;?&gt; c = svr.getClass();\n\t    Field f = c.getDeclaredField(\"level\");\n\t    f.setAccessible(true);\n\t    TraceLevel oldLevel = (TraceLevel)f.get(svr);\n\t    out.format(\"Original trace level:  %s%n\", oldLevel);\n\n\t    if (oldLevel != newLevel) {\n \t\tf.set(svr, newLevel);\n\t\tout.format(\"    New  trace level:  %s%n\", f.get(svr));\n\t    }\n\n        <em>\/\/ production code should handle these exceptions more gracefully<\/em>\n\t} catch (IllegalArgumentException x) {\n\t    x.printStackTrace();\n\t} catch (IllegalAccessException x) {\n\t    x.printStackTrace();\n\t} catch (NoSuchFieldException x) {\n\t    x.printStackTrace();\n\t}\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5e38\u89c1\u9519\u8bef<br>enum\u91cc\u7684\u5e38\u91cf\u90fd\u662f\u5355\u4f8b\uff0c\u4e0d\u80fd\u5b9e\u4f8b\u5316\u4e00\u4e2aenum\u7c7b\u578b(\u8c03\u7528enum\u7684\u6784\u9020\u51fd\u6570\u751f\u6210\u4e00\u4e2aenum\u5bf9\u8c61)\u3002<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Java\u53cd\u5c04 \u53cd\u5c04\u7684\u4f5c\u7528\uff1a\u6709\u4e9b\u4e8b\u60c5\u4e0d\u7528\u53cd\u5c04\u505a\u4e0d\u4e86\uff0c Extensibility Features\u6bd4\u5982\u901a\u8fc7\u7ed9\u5b9a\u4e00\u4e2a\u5916\u90e8\u7684\/\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u7c7b\u7684\u5b8c\u5168\u9650\u5b9a\u7c7b\u540d\u521b\u5efa\u65b0\u7684\u5bf9\u8c61\uff1b Class Browsers and&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[87],"class_list":["post-988","post","type-post","status-publish","format-standard","hentry","category-10","tag-java"],"_links":{"self":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=988"}],"version-history":[{"count":1,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/988\/revisions"}],"predecessor-version":[{"id":989,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/988\/revisions\/989"}],"wp:attachment":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}