Java 查找带有特定注释的已加载类

Java 查找带有特定注释的已加载类,java,annotations,classpath,Java,Annotations,Classpath,我正在编写一个自定义的、跨平台的序列化方法,该方法通过如下注释类来支持自定义类型(标准类型为字符串、数字、映射、列表等): @CompactTypeName("myapp.BetweenFilter") public static class BetweenFilter implements NumericFilter { static { CompactSerializer.registerClass(BetweenFilter.class); }

我正在编写一个自定义的、跨平台的序列化方法,该方法通过如下注释类来支持自定义类型(标准类型为字符串、数字、映射、列表等):

@CompactTypeName("myapp.BetweenFilter")
public static class BetweenFilter implements NumericFilter {

    static {
        CompactSerializer.registerClass(BetweenFilter.class);
    }

    ...

    @SuppressWarnings("unused")
    @Deserialize
    private static BetweenFilter compactRead(DataInputStream ins) throws IOException {
        return new BetweenFilter(ins.readInt(), ins.readInt());
    }

    @SuppressWarnings("unused")
    @Serialize
    private void compactWrite(DataOutputStream ous) throws IOException {
        ous.writeInt(from);
        ous.writeInt(to);
    }

}
问题在于,静态初始值设定项在序列化组件上创建了运行时依赖项,而其他部分则没有(忽略运行时不存在的注释)

为了解决这个问题,序列化程序应该有某种方法来查找类并将其与给定的类型名(“myapp.BetweenFilter”)关联,而不是将类本身注册到
CompactSerializer


我该怎么做?我知道这是可能的,因为Spring MVC可以自动找到带有
@Controller

的类,您需要扫描类路径。基本上:你必须

  • 查找每个类路径元素(文件夹或Jar)
  • 遍历每个元素以查找名为*.class的所有项(通过遍历文件系统或jar条目)
  • 加载类
  • 检查它们是否有注释(如果您查找方法注释,请扫描类路径上所有类的所有方法)

Spring有高度专业化的课程来完成所有这些。您可以从头开始编写此功能,但这是一个巨大的痛苦。

查找有关Java 6中注释处理器的更多信息。

这个问题可能与此相关:我正在使用Phill Sacre发布的链接中的Google Reflections