是否在Java类路径中扫描子类?

问题描述 投票:0回答:2

我有一个非常独特的情况,我知道我的Java Web应用程序将始终与AbstractWidget的1和仅1具体子类打包在一起:

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个且只有1个AbstractWidget impl(不多也不少),无论是ComplexWidget.classSimpleWidget.class等。

我正在尝试构造代码(当WAR从其ServletContextListener impl内部启动时实际上会运行),将能够扫描运行时类路径并获得实例(使用public no-arg构造函数] >)[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()之类的反射方法,但不确定这是否是正确的方法,即使是,也不确定如何在给定的用例中使用它。有任何想法吗?预先感谢!

我有一个非常独特的情况,我知道我的Java Web应用程序将始终与AbstractWidget的1-and-only-1具体子类打包在一起:public abstract class AbstractWidget {// ...} ...

java reflection classpath classloader war
2个回答
0
投票

您可能要签出the reflections api.,它具有用于查找给定类的子类的实用程序。您可以使用它来执行以下操作:

Reflections reflections = new Reflections();
Set<Class<? extends AbstractWidget>> subclasses;
subclasses = reflections.getSubTypesOf(AbstractWidget.class);

0
投票

我知道这是一个非常老的问题,但是ClassGraph库可以帮助您轻松地在类路径中获取扩展给定类的所有类,基本上是给定类的所有子类。

© www.soinside.com 2019 - 2024. All rights reserved.