我是 Java 注释的忠实粉丝,但发现必须包含 Google 的 Reflections 是件很头疼的事。或Scannotations每次我都想自己做。
我还没有找到任何关于 Java 能够在没有容器或类似工具的帮助下自动扫描注释并正确使用它们的文档。
问题:我是否错过了有关 Java 的一些基本知识,或者注释的设计总是需要手动扫描和检查?是否有一些内置的方法来处理注释?
进一步澄清
我希望能够以更加编程的方式处理 Java 中的注释。例如,假设您想构建一个 List
的Car
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:
- Retention annotation
- RetentionPolicy enum
- Target annotation
- Field class
- isAnnotationPresent() method
- getDeclaredFields() method
我正在尝试理解您的汽车示例,但我不确定我是否遵循您的要求。
如果您有一个扩展 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/