gpt4 book ai didi

java - Wildfly 8.0.2 内的反射库

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:03 24 4
gpt4 key购买 nike

我正在尝试使用 Reflections 库扫描类,如果我将动态 Web 项目添加到另一个项目(纯 Java 项目),我会得到我想要的类,但如果在 @Startup bean 内运行,它是空的。这是代码:

Reflections reflections = new Reflections(
new ConfigurationBuilder().filterInputsBy(
new FilterBuilder.Include(
FilterBuilder.prefix("my.package")
)
).setUrls(
ClasspathHelper.forJavaClassPath()
).setScanners(
new SubTypesScanner(false)
)
);

Set<Class<? extends Object>> testClasses = reflections.getSubTypesOf(Object.class);

tv,goopi 应更改为使用的任何包前缀。testClasses Set 为空。

如果相同的代码在引用此代码的不同项目中运行,没有其他更改,则 Set 将填充包内的所有类。

反射的 Maven 依赖项是:

<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9-RC1</version>
</dependency>

野蝇8.2.0。现在,我可以保存在外部项目中提取的文件并使用加载功能,但这不会是应有的动态。

最佳答案

我在这个问题上挣扎了很长一段时间,看起来由于它的工作方式,如果没有获得完整的 java 类路径(使其非常重),您应该稍后加载反射。这主要是由于 EJB 初始化阶段的动态类创建(包括启动 bean)造成的。

加载完整的类路径(从启动 bean)
urls.addAll(ClasspathHelper.forJavaClassPath());

为了使其跨JEE友好,例如疯狂地,您需要从 Servlet Context 监听器进行反射。对我来说,正确的位置是在构造函数中,但静态字段可能有效。

public class GuiceContext implements ServletContextListener
{

@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
ClasspathHelper.forWebInfLib(servletContextEvent.getServletContext());
ClasspathHelper.forWebInfClasses(servletContextEvent.getServletContext());
}

尝试让您的 Bean 在没有依赖关系的情况下独立初始化。您还可以使用像 Guice 这样的自定义注入(inject)器来推送您的 bean。在本例中,您将使用 GuiceServletContextListener 类。

您排除了 Object.class 的直接排除,因此此实例中的启动 bean 可能无法加载。
新的 SubTypesScanner(假);

直接实现 org.reflections 和 guice 的完整库可以在 https://github.com/GedMarc/GuiceInjection 找到。

关于java - Wildfly 8.0.2 内的反射库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29045788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com