使用IDE上下文行为创建Java Annotation

Blu*_*ell 8 java eclipse android annotations suppress-warnings

我创建了一个Annotation

/**
 * Highlights this method is declared in XML
 */
public @interface FromXML {
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这个看起来像这样的方法:

@FromXML
public void onSomethingClick(View v){

}
Run Code Online (Sandbox Code Playgroud)

vAndroid反射系统需要该变量来调用此方法.但是输入var v是未使用的,所以我的IDE警告我这一点.我喜欢这个警告,并希望将其用于我的其余代码.

在此输入图像描述

隐藏我可以做的警告

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

}
Run Code Online (Sandbox Code Playgroud)

或者我可以添加一个param标签

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

我知道你不能扩展注释,但这基本上就是我想做的事情.

有没有办法可以添加我的注释,以识别为" 抑制警告 "注释.

要么

有没有办法将我的注释编码为"像'压制警告一样?

Nar*_*hai 11

您始终可以为Eclipse创建一个插件,该插件将扫描源并在您的案例中查找这些注释,@FromXML并在您的案例中添加额外的注释@SuppressWarnings.

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

创建Eclipse插件

希望这可以帮助.

更新 - 这是一个不能使用这个(测试它)的流感:

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

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

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

一些很棒的链接:

Eclipse Annotation处理器开发教程

Java开发工具 - 注释处理工具

  • 使用eclipse通过捆绑的注释处理器,似乎改变一些类将成功!你需要使用上面的链接查看eclipse的APT来源.然后更改我认为需要工作所需的一些类,再次构建APT并替换旧版本.我也是这样,但需要时间来适应.看起来绝对可能! (2认同)

nce*_*rar 7

我想你可以创建一个定义这个方法的接口.这样,您的类将覆盖该方法,不应该有任何警告.

FromXML.java:

public @interface FromXML {
}
Run Code Online (Sandbox Code Playgroud)

MyInterface.java:

public interface MyInterface {
    @FromXML
    public void onSomethingClick(View v);
}
Run Code Online (Sandbox Code Playgroud)

MyClass.java

public MyClass implements MyInterface {

    @Override
    @FromXML
    public void onSomethingClick(View v){
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:另一种解决方案可能是将您的方法定义为抽象.实际上,正如我理解您的代码,您的方法只是声明(实现在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);

}
Run Code Online (Sandbox Code Playgroud)

我知道你会说这个解决方案使得无法轻松创建对象,但是你将有两个解决方案:

1 - 内联创建对象:

MyClassUsingOnSomethingClick a = new MyClassUsingOnSomethingClick() {
    @Override
    @FromXML
    public void onSomethingClick(View v) {}
};
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

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

  1. 它尊重面向对象编程理念.
  2. 它不是特定于IDE.
  3. 它避免了注释处理工具(在我看来应该非常明智地使用)


Blu*_*ell 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的类型,因此我不再需要注释,也许这种设计更改就是答案。