私のJava Webアプリが常に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 つだけのAbstractWidget
impl がパッケージ化されていることがわかっています (それ以上でも以下でもありませんComplexWidget.class
) SimpleWidget.class
。
実行時のServletContextListener
クラスパスをスキャンし、( public no-arg constructor を使用して) 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()
、それが正しい方法であるかどうかはわかりません。何か案は?前もって感謝します!