Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分析表达式的Java注释处理器?_Java_Annotations_Javac_Builder - Fatal编程技术网

分析表达式的Java注释处理器?

分析表达式的Java注释处理器?,java,annotations,javac,builder,Java,Annotations,Javac,Builder,我一直在玩Java注释处理器,结果非常好。 现在我想做以下几点,就我所知这是不可能的 我有几个实现构建器模式的类。比如说 new FooBuilder().doSomething("A").doSomethingElse("B").execute(); 使用execute()方法终止方法调用的“链”是至关重要的。否则,建设者基本上什么也不做 因此,我想使用JAP在编译时验证某些表达式类型上是否存在execute()方法。不幸的是,我能检索到的最细粒度信息似乎是在方法声明级别,而不是表达式 我想

我一直在玩Java注释处理器,结果非常好。 现在我想做以下几点,就我所知这是不可能的

我有几个实现构建器模式的类。比如说

new FooBuilder().doSomething("A").doSomethingElse("B").execute();
使用
execute()
方法终止方法调用的“链”是至关重要的。否则,建设者基本上什么也不做

因此,我想使用JAP在编译时验证某些表达式类型上是否存在
execute()
方法。不幸的是,我能检索到的最细粒度信息似乎是在方法声明级别,而不是表达式


我想要的是可能的吗?

Java的标准注释处理器仅在声明(如方法和字段声明)时提供回调

可以使用注释处理器来分析表达式,但这需要更多的工作。您必须编写一个注释处理器,在每个方法上获取该方法的AST(抽象语法树或解析树),然后访问该方法中的每个表达式。AST是特定于编译器的


实现这一点的两个最著名的项目是和。也许您可以从它们的实现中获得灵感,甚至可以在其中一个之上编写注释处理器。

Java的标准注释处理器仅在声明(如方法和字段声明)时提供回调

可以使用注释处理器来分析表达式,但这需要更多的工作。您必须编写一个注释处理器,在每个方法上获取该方法的AST(抽象语法树或解析树),然后访问该方法中的每个表达式。AST是特定于编译器的


实现这一点的两个最著名的项目是和。也许你可以从他们的实现中获得灵感,或者甚至在其中一个上面编写注释处理器。

回答如果用户这样做会发生什么:
FooBuilder fb=new FooBuilder().doSomething(“A”).doSomethingElse(“B”);/*做些别的事情*/fb.execute()?在这种情况下,赋值可以证明不存在
execute()
。但你是对的,这不是万无一失的。然而,它可以捕捉到很多基本情况。如果用户这样做会发生什么:
foobuilderfb=newfoobuilder().doSomething(“a”).doSomethingElse(“B”);/*做些别的事情*/fb.execute()?在这种情况下,赋值可以证明不存在
execute()
。但你是对的,这不是万无一失的。然而,它可以抓住许多基本情况。