V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqtc
V2EX  ›  Java

有没有人研究过 Java 源文件 里面 怎么获取注释信息?

  •  
  •   hqtc · 2016-07-27 15:29:14 +08:00 · 6862 次点击
    这是一个创建于 3075 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 这样一段 代码

    /**
     * $function=user.alipayplus.user.json
     * $paramCheck args(required="M",length="32",sample="['ui','ui']")
     * $paramCheck number(required="C",length="(10,2)",sample="36",remarks="y:code==123")
     */
    public JSONObject test(String[] args, int number, String code) {
        JSONObject object = new JSONObject();
        object.put("request", "http-request");
        return object;
    }
    

    有什么现成的库能把方法和上面的注释配套解析出来么?

    22 条回复    2016-07-31 15:22:32 +08:00
    lovedebug
        1
    lovedebug  
       2016-07-27 15:40:18 +08:00
    不是自带 JavaDoc 么- - 命令行工具
    jones
        2
    jones  
       2016-07-27 15:52:48 +08:00
    编译后的 class 是不包含注释信息的
    hqtc
        3
    hqtc  
    OP
       2016-07-27 15:57:23 +08:00
    @lovedebug 试过了 用 javadoc api 自定义 doclet 来搞,但是只能在命令行搞,而且 包依赖也不知道怎么搞,这个例子总是“找不到符号 JSONObject ”, 我要解析的 Java 代码我都不知道依赖了哪些包的。。
    hqtc
        4
    hqtc  
    OP
       2016-07-27 15:58:04 +08:00
    @jones 对啊,所有问问大家有没有什么解析 java 源文件的工具
    incompatible
        5
    incompatible  
       2016-07-27 16:47:25 +08:00 via iPhone
    这种场景应该用 Annotation 才对啊
    fwrq41251
        6
    fwrq41251  
       2016-07-27 17:11:01 +08:00
    lovedebug
        7
    lovedebug  
       2016-07-27 17:24:25 +08:00
    @hqtc 你肯定依赖了第三方库关键是你的第三方库没带源码,你找到第三方库源码版本后再试试
    lovedebug
        8
    lovedebug  
       2016-07-27 17:28:17 +08:00
    如果要反编译 class 文件 推荐你用 intellij idea 自己装 ideajad 插件
    Guaidaodl
        9
    Guaidaodl  
       2016-07-27 17:41:24 +08:00
    我觉得楼主想要实现的功能, 不应该用注释, 用 Annotation 才是正解.
    murmur
        10
    murmur  
       2016-07-27 19:36:59 +08:00
    这很明显表单验证么 表单验证应该用 annotation 或者把规则做到 bean 里
    Lonely
        11
    Lonely  
       2016-07-27 19:44:34 +08:00 via iPhone
    牛逼,头一次见到这么玩的
    zts1993
        12
    zts1993  
       2016-07-27 19:58:59 +08:00
    楼上都在胡说啥,,这个我搞过用的是 javaparser


    <dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core</artifactId>
    <version>2.3.0</version>
    </dependency>


    可以解析,可以拼装代码。之前用这个写的代码自动生成。。。。
    zts1993
        13
    zts1993  
       2016-07-27 19:59:49 +08:00
    当然了,。验证规则解析不了,看不懂这是个啥。。
    hrong
        14
    hrong  
       2016-07-27 20:05:05 +08:00 via Android
    @Guaidaodl
    @incompatible
    @murmur
    楼主应该只要解析 Source ,不是解析编译过后的 class 文件
    incompatible
        15
    incompatible  
       2016-07-27 20:30:54 +08:00
    @hrong 楼主表面的需求的确是解析源码。但是你仔细看帖子,注释中出现的 paramCheck 这种东西显然是运行时才有意义的东西。所以我觉得楼主跑偏了。
    hrong
        16
    hrong  
       2016-07-27 20:40:44 +08:00 via Android
    @incompatible 你是个好的倾听者,为楼主所想了,应该是你说的意思了,必须用注解啊


    我只顾看楼主表面意思。还请楼主出来释明真意
    pynix
        17
    pynix  
       2016-07-27 21:14:14 +08:00 via Android
    annotation
    hqtc
        18
    hqtc  
    OP
       2016-07-29 10:22:26 +08:00
    @hrong 你是对的,就是分析源码 source~。。感谢各位,由于我只是个小实习生,是为线上业务的接口代码做分析工具,不能让人家的业务代码里使用我自定义 的 annotation 。。。 然后讨论半天,最后决定:把需要的信息写在额外的文件里面 (⊙﹏⊙)b ……
    hqtc
        19
    hqtc  
    OP
       2016-07-29 10:27:54 +08:00
    @zts1993 太感谢了, 我也研究了 javaparser ,还有个库叫 Roaster ( https://github.com/forge/roaster ),然后给开发们提出了方案。 不过最后我们决定,不搞代码里面注释了,改成分析额外的配置文件 ~
    haniklz
        20
    haniklz  
       2016-07-30 18:24:11 +08:00 via Android
    把注释部分 换成自定义注解不就解决问题了吗 唉。
    hqtc
        21
    hqtc  
    OP
       2016-07-31 12:25:02 +08:00
    @haniklz 看 18L
    haniklz
        22
    haniklz  
       2016-07-31 15:22:32 +08:00 via Android
    @hqtc 好吧我只看了主贴没看下面
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.