GWT生成器-确定类是否在任何位置被引用

GWT生成器-确定类是否在任何位置被引用,gwt,reflection,Gwt,Reflection,我有一个GWT项目,它使用生成器创建灯光动态反射对象 我想知道是否有人知道一种方法来确定某个特定的类是否从所有入口点开始在依赖关系树中被引用。如果我能做到这一点,我就可以避免为永远不会使用的类生成反射数据 我的理解是,当GWT进行编译时,它会执行类似的检查,以便减少编译代码的总大小,但我在TypeOracle或类似的东西中找不到任何相关的方法。这是一种间接的方法,可以实现您的目的。我相信每个GWT模块都完全打包到一个常规java包中。你可以用 TypeOracle.findPackage(Str

我有一个GWT项目,它使用生成器创建灯光动态反射对象

我想知道是否有人知道一种方法来确定某个特定的类是否从所有入口点开始在依赖关系树中被引用。如果我能做到这一点,我就可以避免为永远不会使用的类生成反射数据


我的理解是,当GWT进行编译时,它会执行类似的检查,以便减少编译代码的总大小,但我在TypeOracle或类似的东西中找不到任何相关的方法。

这是一种间接的方法,可以实现您的目的。我相信每个GWT模块都完全打包到一个常规java包中。你可以用

TypeOracle.findPackage(String pkgName)
获取JPackage实例,并在该实例上使用findType(String typeName)查看该包中是否存在类型。如果存在,它很可能在某个文件中被引用,GWT将编译它

还有一个方法getPackages(),它返回该类型oracle已知的所有包的数组,因此GWT编译器可以访问该数组

JPackage[] getPackages()
您可以在每个包上迭代
findType()
,以确定是否要编译该类型

最好的方法是定义一个自定义注释,并将您想要生成反射代码的所有类列为白名单。您可以使用它注释所需的类,并在为其生成代码之前检查注释是否存在


我最喜欢的是遵循命名约定而不是注释(我两者都做过),从而维护一个白名单,并使约定(通常是正则表达式)成为一个“设置”,可以根据团队的需要进行更改。

JMethod.isAnnotationPresent(YourAttribute.class)会有所帮助。问题是类型Oracle会找到包含的任何类,但不一定参考。我在一个包中以某种方式注释了许多类,这些类在多个模块之间共享。我不希望手动包含/排除实际使用的类。