- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我确实是第一次卷起袖子尝试理解 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. }}
唉,我的问题!
我假设我需要在某处定义一个注解处理器;一个 Java 类,它将指定在遇到 @Widgetize(int) 注释时要做什么,是吗?或者这是否发生在被输入 apt 的 XML 配置文件中(就像 ant 读取 build.xml 文件的方式)?
编辑:如果我对上面问题 #1 中的这些注释处理器的看法是正确的,那么我如何“映射”/“注册”/让这些处理器为 apt 所知?
在 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/
我一直在尝试让 yum 在代理设置后面工作 导出 https_proxy、http_proxy 和 ftp_proxy。 这对 apt-get 或 yum 不起作用,但当我在 /etc/apt/apt
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
为什么基于 Debian 的 Linux 发行版具有apt以及apt-get?apt是替换还是他们apt-get 有不同的目的?我们解释这两个命令之间的关系。 Debian 软件包管理系统 创建Lin
例如,当安装 lirc 包时,它会提供配置对话框屏幕。如何自动化以选择默认值(或可能提供特定值)并继续? 现在我有一个简单的脚本: #!/usr/bin/env python import a
我有一个 APT 处理器,在某些情况下会显示警告。我的项目正在使用 maven1 构建调用 ant:apt 如何让maven在满足警告条件时失败? (处理器可以修改) 谢谢。 最佳答案 注释处理器需要
我在 Windows 上使用 WSL。我无法使用 apt 或 apt-get 这是我在尝试使用 apt 或 apt-get 时收到的错误消息。 ~$ apt apt: error while load
我正在寻找一些命令行说明。我应该有带有 Python 2.7 的 Ubuntu Linux Server(为什么不能简单解释如何在你的 ULS 上获取 Python 2.7!)。 (编辑——显然 Py
当我尝试构建一个简单的docker映像时:。在Dockerfile中:。输出为:。我试过:。我之前构建了多个docker映像,一切都运行得很好。而现在,我总是会突然发现这个错误。
在 bash 脚本中,我想安装一个包。在理智地这样做之前,我需要检查是否没有其他 apt-get 实例。或 dpkg已经在工作。如果是这种情况,apt-get会失败,因为它已经锁定。 是否足以检查/v
这个问题有很多相关的问题,但没有一个回答我想知道的: 我通常是这样工作的: 安装 python 3.5+ sudo apt install virtualenv virtualenv -p/usr/b
我有一个很久以前安装的 Ubuntu 20.04。出于某种原因,即使我很确定我从未使用过它,我也安装了 OCaml。我试图通过卸载 OCaml sudo apt-get remove ocaml
我编写了一个 Ansible 剧本,其中包括运行 apt-get dist-upgrade。我确保在剧本的顶部有 become: true 和 become_user: root 以获得运行升级的 s
现在我的 Vagrantfile 中有以下内容: config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "cookboo
我使用 gitlab ci 来构建 docker 镜像,我想安装 python。当我构建时,以下是我的 gitlab-ci.yml: image: docker:stable stages: -
我正在尝试在 Ubuntu 16.04 中启动此容器,步骤之一是:RUN apt update && apt install -y sudo 此步骤因暂时无法解析某些存储库而失败。这是此错误的输出:
我卡在了一个点上,我无法进步,很抱歉这个愚蠢的问题。我为此进行了很多搜索,但我不知道我错过了什么。请帮助我。 我研究了 python 中的模块和类。现在我想使用 python 和 apt 进行一些操作
在linux based os的某些软件安装中,我们有时使用apt update,有时使用apt-get update。 linux终端究竟如何理解apt only和apt-get的含义? 最佳答案
我正在编写 Puppet list ,以便在我的机器上安装大量软件。 许多软件包仅具有 PPA 中最新版本的二进制文件,例如名为 AutoKey 的非常方便的服务。 . 要安装此最新版本的软件包,必须
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我正在编写我的 k8s 升级 ansible 剧本,其中我需要做 apt-mark unhold kubeadm .现在,我试图避免使用 ansible command或 shell调用模块apt如果
我是一名优秀的程序员,十分优秀!