您可以创建自己的注释并将它们应用到您自己的类中。
如果您指定在运行时可检测到注释,则可以使用反射轻松处理它。
例如,您可以使用类似这样的方法来打印已用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;
}
这里有更多关于 Annotations 的阅读。
以下是上面使用的类的 javadocs:
我正在尝试了解您的汽车示例,但我不确定我是否遵循您的要求。
如果您有一个对象列表(Jaguar、Porche、Ferrari、Kia),这些对象扩展 Car 并标有各种与汽车相关的注释,您可以创建一个基于注释过滤列表的对象。
代码可能如下所示:
@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;
}
}
如果这不是你所追求的,一个具体的例子会很有帮助。