{"id":4902,"date":"2020-06-06T09:18:49","date_gmt":"2020-06-06T01:18:49","guid":{"rendered":"https:\/\/ixyzero.com\/blog\/?p=4902"},"modified":"2020-06-06T09:18:49","modified_gmt":"2020-06-06T01:18:49","slug":"%e4%bd%bf%e7%94%a8-javaparser-%e8%a7%a3%e6%9e%90%e6%8f%90%e5%8f%96java%e6%96%87%e4%bb%b6%e4%b8%ad%e7%9a%84class-method-interface%e5%90%8d%e7%a7%b0","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/4902.html","title":{"rendered":"\u4f7f\u7528 JavaParser \u89e3\u6790\u63d0\u53d6Java\u6587\u4ef6\u4e2d\u7684class\/method\/interface\u540d\u79f0"},"content":{"rendered":"\n<p>=Start=<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u7f18\u7531\uff1a<\/h4>\n\n\n\n<p>\u524d\u6bb5\u65f6\u95f4\u4e8b\u60c5\u592a\u591a\uff0c\u6ca1\u65f6\u95f4\u53bb\u7ef4\u62a4\u535a\u5ba2\uff0c\u95f4\u65ad\u4e86\u5feb\u4e00\u4e2a\u6708\uff0c\u6700\u8fd1\u7a0d\u5fae\u597d\u4e86\u4e00\u4e9b\uff0c\u91cd\u65b0\u5f00\u59cb\u6574\u7406\u8bb0\u5f55\uff0c\u8bb0\u5f55\u5206\u4eab\u7684\u597d\u4e60\u60ef\u8fd8\u662f\u8981\u4fdd\u6301\uff0c\u5426\u5219\u65f6\u95f4\u4e5f\u5f88\u53ef\u80fd\u88ab\u6d6a\u8d39\u53bb\u5237\u624b\u673a\u4e86\u2026\u2026<\/p>\n\n\n\n<p>\u8fd9\u91cc\u7b80\u5355\u6574\u7406\u8bb0\u5f55\u4e00\u4e0b\u5982\u4f55\u63d0\u53d6Java\u6587\u4ef6\u4e2d\u7684\u7c7b\u540d\u3001\u65b9\u6cd5\u540d\u3001\u63a5\u53e3\u540d\u7b49\u4fe1\u606f\u7684\u65b9\u6cd5\u3002\u6700\u5bb9\u6613\u60f3\u5230\u7684\u6709\u4e00\u79cd\u65b9\u6cd5\u662f\u501f\u52a9\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u63d0\u53d6\uff0c\u4e0d\u8fc7\u8fd9\u5bf9Java\u6587\u4ef6\u7684\u5185\u5bb9\u683c\u5f0f\u6709\u4e00\u5b9a\u8981\u6c42\uff0c\u4e14\u51c6\u786e\u7387\u4f1a\u6709\u5929\u7136\u7684\u5929\u82b1\u677f\u5728\u90a3\uff08\u975e\u8bed\u4e49\u7a0b\u5ea6\uff0c\u4ec5\u5f53\u6210\u5b57\u7b26\u4e32\u5904\u7406\uff0c\u8bef\u62a5\u4e0d\u53ef\u907f\u514d\uff09\uff1b\u53e6\u4e00\u79cd\u65b9\u5f0f\u5c31\u662f\u5229\u7528\u4e00\u4e9bAST\u7684\u89e3\u6790\u5668\u6765\u5b9e\u73b0\uff0c\u8fd9\u91cc\u8981\u4ecb\u7ecd\u7684\u4e5f\u662f\u8fd9\u79cd\uff0c\u65b9\u4fbf\u4ee5\u540e\u9700\u8981\u7684\u65f6\u5019\u4f7f\u7528\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6b63\u6587\uff1a<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">\u53c2\u8003\u89e3\u7b54\uff1a<\/h5>\n\n\n\n<p>\u5927\u81f4\u601d\u8def\u6216\u65b9\u6cd5\u5176\u5b9e\u5c31\u662f\u7ee7\u627f\u67d0\u4e2aVisitor\uff08\u6bd4\u5982\u8fd9\u91cc\u7684\uff1aVoidVisitorAdapter\uff09\u8986\u5199\u5176\u4e2d\u7684visit\u65b9\u6cd5\uff0c\u6dfb\u52a0\u6253\u5370\u6216\u662f\u5176\u5b83\u7684\u4e00\u4e9b\u81ea\u5b9a\u4e49\u529f\u80fd\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.github.javaparser.ast.CompilationUnit;\nimport com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;\nimport com.github.javaparser.ast.body.MethodDeclaration;\nimport com.github.javaparser.ast.body.TypeDeclaration;\nimport com.github.javaparser.ast.visitor.VoidVisitor;\nimport com.github.javaparser.ast.visitor.VoidVisitorAdapter;\nimport com.google.common.base.Strings;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\n\nimport static com.github.javaparser.StaticJavaParser.parse;\n\n\npublic class JavaParserListFileClassNames {\n    public void listClasses(File projectDir) {\n        new DirExplorer((level, path, file) -> path.endsWith(\".java\"), (level, path, file) -> {\n            System.out.println(path);\n            System.out.println(Strings.repeat(\"=\", path.length()));\n            try {\n                new VoidVisitorAdapter&lt;Object>() {\n                    @Override\n                    public void visit(ClassOrInterfaceDeclaration n, Object arg) {\n                        super.visit(n, arg);\n                        System.out.println(\" * \" + n.getName());\n                    }\n\n                    @Override\n                    public void visit(MethodDeclaration n, Object arg) {\n                        super.visit(n, arg);\n                        System.out.println(\"   -> \" + n.getName());\n                    }\n                }.visit(parse(file), null);\n                System.out.println(); \/\/ empty line\n            } catch (IOException e) {\n                new RuntimeException(e);\n            }\n        }).explore(projectDir);\n    }\n\n    private static String parseClassname(File filename) throws Exception {\n        try (FileInputStream fin = new FileInputStream(filename)) {\n            CompilationUnit cu = parse(fin);\n\n            VoidVisitor&lt;?> methodNameVisitor = new MethodNamePrinter();\n            methodNameVisitor.visit(cu, null);\n\n            for (TypeDeclaration type : cu.getTypes()) {\n                \/\/ System.out.println(type.getFullyQualifiedName().toString());\n                if (type instanceof ClassOrInterfaceDeclaration)\n                    return type.getNameAsString();\n            }\n            \/\/ for (Node node: cu.getChildNodes()) {\n            \/\/     System.out.println(node);\n            \/\/     System.out.println(node.getAllContainedComments());\n            \/\/ }\n        }\n        return null;\n    }\n\n    public static void main(String&#91;] args) {\n        File projectDir = new File(\"\/path\/to\/FileName.java\");\n        JavaParserListFileClassNames javaParserListFileClassNames = new JavaParserListFileClassNames();\n        try {\n            System.out.println(javaParserListFileClassNames.parseClassname(projectDir));\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        System.out.println();\n\n        projectDir = new File(\"\/path\/to\/dir\");\n        javaParserListFileClassNames.listClasses(projectDir);\n    }\n\n    private static class MethodNamePrinter extends VoidVisitorAdapter&lt;Void> {\n        @Override\n        public void visit(MethodDeclaration md, Void arg) {\n            super.visit(md, arg);\n            System.out.println(\"Method Name Printed: \" + md.getName());\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u53c2\u8003\u94fe\u63a5\uff1a<\/h5>\n\n\n\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/23017557\/how-to-get-class-name-of-any-java-file\/40488118#40488118\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/stackoverflow.com\/questions\/23017557\/how-to-get-class-name-of-any-java-file\/40488118#40488118<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/javaparser\/javaparser\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/javaparser\/javaparser<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/javaparser.org\/getting-started.html\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/javaparser.org\/getting-started.html<\/a><\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/leanpub.com\/javaparservisited\" target=\"_blank\">https:\/\/leanpub.com\/javaparservisited<\/a><\/p>\n\n\n\n<p>Getting started with JavaParser: analyzing Java Code programmatically\uff08\u65f6\u95f4\u592a\u4e45\uff0c\u7248\u672c\u592a\u8001\uff0c\u63a5\u53e3\u5df2\u66f4\u65b0\uff0c\u539f\u6709\u4ee3\u7801\u4e0d\u53ef\u76f4\u63a5\u7528\uff0c\u4e0d\u8fc7\u601d\u8def\u53ef\u4ee5\u53c2\u8003(\u7b80\u5355\u6539\u6539\u5185\u5bb9\u4e5f\u57fa\u672c\u53ef\u7528)\uff09<br><a rel=\"noreferrer noopener\" href=\"https:\/\/tomassetti.me\/getting-started-with-javaparser-analyzing-java-code-programmatically\/\" target=\"_blank\">https:\/\/tomassetti.me\/getting-started-with-javaparser-analyzing-java-code-programmatically\/<\/a><\/p>\n\n\n\n<p>Some examples of code extracting information from Java source files using JavaParser<br><a href=\"https:\/\/github.com\/ftomassetti\/analyze-java-code-examples\">https:\/\/github.com\/ftomassetti\/analyze-java-code-examples<\/a><br><a href=\"https:\/\/github.com\/javaparser\/javaparser\/issues\/2181\">https:\/\/github.com\/javaparser\/javaparser\/issues\/2181<\/a><\/p>\n\n\n\n<p>=END=<\/p>\n","protected":false},"excerpt":{"rendered":"<p>=Start= \u7f18\u7531\uff1a \u524d\u6bb5\u65f6\u95f4\u4e8b\u60c5\u592a\u591a\uff0c\u6ca1\u65f6\u95f4\u53bb\u7ef4\u62a4\u535a\u5ba2\uff0c\u95f4\u65ad\u4e86\u5feb\u4e00\u4e2a\u6708\uff0c\u6700\u8fd1\u7a0d\u5fae\u597d\u4e86\u4e00\u4e9b\uff0c\u91cd\u65b0\u5f00\u59cb\u6574\u7406\u8bb0\u5f55 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,7,12],"tags":[1616,61,1615,1617],"class_list":["post-4902","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-programing","category-tools","tag-ast","tag-java","tag-javaparser","tag-visitor"],"views":5887,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/comments?post=4902"}],"version-history":[{"count":1,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4902\/revisions"}],"predecessor-version":[{"id":4903,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4902\/revisions\/4903"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=4902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=4902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=4902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}