gpt4 book ai didi

Java 注解和 apt(基础)

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:55 27 4
gpt4 key购买 nike

我确实是第一次卷起袖子尝试理解 Java 注释,并且已经阅读了有关该主题的 Sun、Oracle 和维基百科文章。它们在概念上很容易理解,但我发现很难将拼图的所有部分放在一起。

下面的示例可能是糟糕的工程,但只是幽默一下(这是一个示例!)。

假设我有以下类(class):

public Widget{    // ...    public void foo(int cmd)    {        switch(cmd)        {        case 1:            function1();            break;        case 2:            function2();            break;        case 3:        default:            function3();            break;        }    }}

现在,在我项目的其他地方,我有另一个类 SpaceShuttle,它有一个名为 blastOff() 的方法:

public class SpaceShuttle{    // ...    public void blastOff()    {        // ...    }}

现在,我想配置一个名为 Widgetize 的注解,这样任何用 @Widgetize 注解的方法都将在调用它们之前调用 Widget::foo(int)打电话。

@interface Widgetize{    int cmd() default 2;}

现在让我们重新审视航天飞机:

public class SpaceShuttle{    // ...    @Widgetize(3)    public void blastOff()    {        // Since we pass a cmd of "3" to @Widgetize,        // Widget::function3() should be invoked, per        // Widget::foo()'s definition.    }}

唉,我的问题!

  1. 我假设我需要在某处定义一个注解处理器;一个 Java 类,它将指定在遇到 @Widgetize(int) 注释时要做什么,是吗?或者这是否发生在被输入 apt 的 XML 配置文件中(就像 ant 读取 build.xml 文件的方式)?

  2. 编辑:如果我对上面问题 #1 中的这些注释处理器的看法是正确的,那么我如何“映射”/“注册”/让这些处理器为 apt 所知?

  3. 在 buildscripts 中,apt 是否通常在 javac 之前运行,以便在编译之前发生基于注释的更改或代码生成? (这是一个最佳实践类型的问题)。

谢谢,我为我的代码示例道歉,它们比我预期的要大得多(!)

最佳答案

这听起来更像是 AOP (面向方面​​的编程)比注解。由于 AOP 使用注解来实现其目标,因此主题经常混淆。与其从头开始重新发明 AOP,我建议查找现有的 AOP 库,例如 AspectJ .

但是,要回答您的具体问题,有两种可能的方法可以实现您的目标。

运行时方法

这是容器框架(如 Spring)通常采用的方法。它的工作方式是,您不是自己实例化您的类,而是向容器请求您的类的实例。

容器具有检查任何 RuntimeAnnotations(如@Widgetize)的类的逻辑。然后容器将动态创建您的类的代理,它首先调用正确的 Widgetize 方法,然后调用目标方法。

容器然后将该代理返回给原始请求者。请求者仍然认为他得到了他所请求的类(或接口(interface)),并且完全不知道容器添加的代理行为。

这也是 AspectJ 使用的行为。

增强方法

这是 AspectJ 采用的方法。老实说,我不知道它是如何工作的很多细节。 AspectJ 会以某种方式扫描您的类文件(字节码),找出注释的位置,然后修改字节码本身以调用代理类而不是实际类。

这种方法的好处是您不需要使用容器。缺点是您现在必须在编译代码后执行此增强步骤。

关于Java 注解和 apt(基础),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com