java - 高效的 Java 注解

标签 java annotations

我是 Java 注释的忠实粉丝,但发现必须包含 Google 的 Reflections 是件很头疼的事。或Scannotations每次我都想自己做。

我还没有找到任何关于 Java 能够在没有容器或类似工具的帮助下自动扫描注释并正确使用它们的文档。

问题:我是否错过了有关 Java 的一些基本知识,或者注释的设计总是需要手动扫描和检查?是否有一些内置的方法来处理注释?

进一步澄清

我希望能够以更加编程的方式处理 Java 中的注释。例如,假设您想构建一个 ListCar s。为此,您可以使用可以为您填充列表的类来注释该列表。例如:

@CarMaker
List<Car> cars = new List<Car>();

在此示例中,CarMaker Java 与注释联系,达成交易并询问他们想要提供多少辆汽车。由 CarMaker 决定注释/类,然后为他们提供要包含的汽车的列表。这可能是所有带有 @CarType 的类注释和 Car界面。

另一种看待它的方式是,如果您知道自己想要构建这样的东西:List<Car> cars ,你可以用 @ListMaker<Car> 来注释它。 ListMaker是 Java 中内置的东西。它查找所有带有 @CarType 注释的类,并相应地填充列表。

最佳答案

您可以创建自己的注释并将其应用到您自己的类。

如果您指定注释在运行时可检测,则可以通过反射轻松处理它。

例如,您可以使用类似的方法来打印类中已用 Funky 注释标记的每个字段的名称:

for (Field someField : AnnotatedClass.getClass().getDeclaredFields()) {
    if (someField.isAnnotationPresent(Funky.class)) {
        System.out.println("This field is funky: " + someField.getName());
    }
}

声明 Funky 注释的代码如下所示:

package org.foo.annotations;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Funky { }

这是一个使用注释的类:

package org.foo.examples;

import org.foo.annotations.Funky;

public class AnnotatedClass {
    @Funky
    private  String   funkyString;
    private  String   nonFunkyString;
    @Funky
    private  Integer  funkyInteger;
    private  Integer  nonFunkyInteger;
}

这里有一些 more reading on Annotations .

以下是上面使用的类的 javadoc:


我正在尝试理解您的汽车示例,但我不确定我是否遵循您的要求。

如果您有一个扩展 Car 的对象列表(Jaguar、Porche、Ferrari、Kia)并标有各种与汽车相关的注释,您可以创建一个根据注释过滤列表的对象。

代码可能如下所示:

@WorldsFinestMotorCar
class Jaguar extends Car {
    // blah blah
}

@BoringCar
class Porche extends Car {
    // blah blah
} 

@BoringCar
class Ferrari extends Car {
    // blah blah
}

@IncredibleCar
class Kia extends Car {
    // blah blah
}

您可以实现一个 AnnotationFilter 类,该类从列表中删除没有特定注释的汽车。

它可能看起来像这样:

List<Car> carList = getListOfRandomCars();
AnnotationFilter<Car> annoFilter = new AnnotationFilter<Car>(BoringCar.class);
List<Car> boringCars = annoFilter.filter(carList);

这是你想做的吗?

如果是的话,肯定可以做到。

AnnotationFilter 的实现可能如下所示:

public class AnnotationFilter<T> {
    private Class filterAnno;

    public AnnotationFilter(Class a) {
        filterAnno = a;
    }

    public List<T> filter(List<T> inputList) {
        if (inputList == null || inputList.isEmpty()) {
            return inputList;
        }
        List<T> filteredList = new ArrayList<T>();
        for (T someT : inputList) {
            if (someT.getClass().isAnnotationPresent(filterAnno)) {
                filteredList.add(someT);
            }
        }
        return filteredList;
    }
}

如果这不是您想要的,一个具体的例子会很有帮助。

关于java - 高效的 Java 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11945460/

相关文章:

java - Java(7)中,如何获取注解字段的值

java - CLOB 不保存在 ORACLE 上(使用 JPA、eclipselink)

无限循环内的 Java 对象创建

java - 从 ArrayList 填充微调器时出现问题

java - 数据未从在线 mysql 服务器检索

带父级的 Spring @Component

python - Optional[Type[Foo]] 在 Python 3.5.2 中引发 TypeError

java - 为什么@NotNull 注释不删除警告?

java - 带注解的代码风格

java - 如何在 java 中禁用 LibSVM weka 库的日志?