我有一个相当独特的情况,我知道我的 Java Web 应用程序将始终与 1-and-only-1 具体子类一起打包AbstractWidget
:
public abstract class AbstractWidget {
// ...
}
public class SimpleWidget extends AbstractWidget {
// ...
}
public class ComplexWidget extends AbstractWidget {
// ...
}
public class CrazyComplexWidget extends AbstractWidget {
// ...
}
// ...etc.
再一次,我知道在运行时我的WAR/WEB-INF/classes
目录将始终包含 1-and-only-1 AbstractWidget
impl 打包在其中(不多也不少),无论是ComplexWidget.class
,SimpleWidget.class
等等。
我正在尝试构建ServletContextListener
能够扫描运行时类路径并获取.AbstractWidget
因此,如果我的 WAR 有:
myWar/
WEB-INF/
lib/
classes/
com/
myorg/
App (implements ServletContextListener)
... lots of other classes and packages
some/
arbitrary/
package/
SimpleWidget
然后,从内部App#contextInitialized(ServletContextEvent)
我需要可以SimpleWidget.class
在类路径中找到并给我一个实例的代码:
public class App implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
// Scan classpath for the lone AbstractWidget impl somehow.
???
// Use public, no-arg ctor to instantiate the impl.
AbstractWidget widget = ???
// Now do stuff with widget...
}
}
我知道您可以使用反射方法Class.isAssignableFrom()
,但不确定这是否是正确的方法,即使是正确的方法,如何在我给定的用例中使用它。有任何想法吗?提前致谢!