0

私の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 つだけのAbstractWidgetimpl がパッケージ化されていることがわかっています (それ以上でも以下でもありません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()、それが正しい方法であるかどうかはわかりません。何か案は?前もって感謝します!

4

2 に答える 2