8

我创建了一个注释

/**
 * Highlights this method is declared in XML
 */
public @interface FromXML {
}

我在看起来像这样的方法上使用它:

@FromXML
public void onSomethingClick(View v){

}

Android 反射系统需要该v变量来调用此方法。但是输入 varv未使用,所以我的 IDE 警告我这一点。我喜欢这个警告,并希望在我的其余代码中使用它

在此处输入图像描述

为了隐藏我可以做的警告

@SuppressWarnings("unused")
@FromXML
public void onSomethingClick(View v){

}

或者我可以添加一个参数标签

但我宁愿 IDE (eclipse) 读取我的@FromXML注释并且不给我警告。

我知道你不能扩展 Annotation,但这基本上就是我想做的。

有没有办法可以添加我的注释以被识别为“抑制警告”注释。

或者

有没有办法将我的注释编码为“表现得像”抑制警告?

4

3 回答 3

11

您始终可以为 Eclipse 创建一个插件,该插件将扫描源代码并在您的情况下找到这些注释,并在您的情况下@FromXML添加额外的注释@SuppressWarnings

您可以为它创建一个命令,当该命令被触发时,您将运行这个插件。

创建 Eclipse 插件

希望这可以帮助。

更新- 这是一个侥幸不能使用这个(试过):

或使用 AspectJ 删除 警告 在 Eclipse 中使用 AspectJ 添加警告

如果开发人员在代码中使用,本教程使用AspectJ向 eclipse 添加警告。因此,当存在注释时,System.out.println()可以执行相反的操作以删除警告。

更新 2: Eclipse 中有一种方法可以创建自定义注释处理器或编辑捆绑的注释处理器(生成未使用的变量警告)。因此必须以自定义方式调整该处理器。

一些很棒的链接:

Eclipse Annotation 处理器开发教程

Java开发工具——注解处理工具

于 2012-11-30T12:40:01.103 回答
7

我认为您可以创建一个定义此方法的接口。这样,您的类将覆盖该方法,并且不应该有任何警告。

来自XML.java:

public @interface FromXML {
}

我的接口.java:

public interface MyInterface {
    @FromXML
    public void onSomethingClick(View v);
}

MyClass.java

public MyClass implements MyInterface {

    @Override
    @FromXML
    public void onSomethingClick(View v){
    }
}

编辑:另一个解决方案可能是将您的方法定义为抽象的。事实上,据我了解您的代码,您的方法只是声明(实现在 XML 文件中)。因此,您的问题与其说是 IDE 问题,不如说是设计问题(您的 IDE 对警告来说是正确的)。现实情况是您的方法是抽象的并且在其他地方定义。

因此,将您的方法定义为抽象将解决问题,但您必须使类抽象:

public abstract class MyClassUsingOnSomethingClick {

/*
 * All the class implementation can be here as the normal class.
 */

    @FromXML
    public abstract void onSomethingClick(View v);

}

我知道您会说此解决方案无法轻松创建对象,但您将有两个解决方案:

1 - 内联创建您的对象:

MyClassUsingOnSomethingClick a = new MyClassUsingOnSomethingClick() {
    @Override
    @FromXML
    public void onSomethingClick(View v) {}
};

2 - 在您的摘要中创建一个工厂方法MyClassUsingOnSomethingClick

public static final MyClassUsingOnSomethingClick createEmptyMyClassUsingOnSomethingClick() {
    return new MyClassUsingOnSomethingClick() {
        @Override
        @FromXML
        public void onSomethingClick(View v) {}
    };
}

// and then, create with: :
MyClassUsingOnSomethingClick a = MyClassUsingOnSomethingClick.createEmptyMyClassUsingOnSomethingClick();

即使我知道您更喜欢更快的解决方案,我相信这个解决方案是最干净的,因为:

  1. 它尊重面向对象的编程哲学。
  2. 它不是特定于 IDE。
  3. 它避免了注释处理工具(我认为应该非常明智地使用它)
于 2012-11-30T10:36:46.577 回答
4

好的,我不能以任何简单的方式或形式做到这一点。

查看注释包http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/package-summary.html

我不能扩展注释: 为什么不能在 Java 中扩展注释?

我无法实现另一个注释java.lang.Override

我不能模仿/模仿/假装是@Override

如果我添加@Override到我的@FromXML,它不会沿链继承。

唯一的方法是创建一个 Eclipse 插件来识别我的注释并停止警告。感到羞耻,因为我找不到一个简单的方法来做到这一点。

我还为我的@FromXML入口点创建了一个界面,这非常好并且传达了我Activity的类型,因此我不再需要注释,也许这个设计更改就是答案。

于 2012-12-05T09:56:54.283 回答