java - 从通过 servlet 动态上传的 jar 中加载类

标签 java reflection reflections

我正在通过 servlet 动态上传 jar 并将其保存在我的 WEB-INF/lib 目录中。 我想让所有类都用我的@annotation 进行注释,

使用了下面的反射代码,但没有任何运气。jar 的 list 是可读的,但类不可读。类列表为 0

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
ConfigurationBuilder builder = new ConfigurationBuilder().setScanners(new SubTypesScanner(false), new ResourcesScanner(),
new TypeAnnotationsScanner());
Set<URL> set = ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]));
        FilterBuilder filterBuilder = new FilterBuilder().include(FilterBuilder.prefix(exportPackage));
        Reflections reflections = new Reflections(builder.setUrls(set).filterInputsBy(filterBuilder));

        Set<Class<? extends Object>> classSet = reflections.getTypesAnnotatedWith(MyAnnotation.class);

对配置的哪些更改将有助于从动态上传的 jar 中获取类..

最佳答案

由于您正在更新自己的 WEB-INF/lib 目录,因此您的上下文类加载器不一定会捕获它。顺便说一句,我认为这是一个不好的做法:行为取决于应用程序服务器,并且如果您从 war 中运行,该目录可能不可写,甚至可能不存在......

因此,我会将 jar 放入其他目录并使用我的自定义类加载器。这并不难。您可以使用常规的UrlClassLoader。只需将其配置为从正确的路径读取类即可。完成此操作后,在创建 Reflections 实例时传递该类加载器。看看它的javadcoc。构造函数可以排除包括类加载器在内的各种类型的参数。

关于java - 从通过 servlet 动态上传的 jar 中加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821451/

相关文章:

java - 使用 Reflections 库查询 Java 类路径中具有任意属性的类

java - 使用 java 转换器类生成新图像

java - 如何手动设置java环境的堆大小?

c# - Generics Fun : Where typeof(List<T>) ! = typeof(List<T>),并使用反射获取泛型方法,带有泛型参数

java - gwtent 反射 java

Python:按名称访问嵌套函数

java - 当并非层次结构中的所有类型都在过滤后的类路径 url 中时,使用反射查找类的(传递)子类型

java - 如何使用反射来检查使用不同类加载器加载的类的非静态字段?

java - jdeps 在 spring boot 项目上失败

java - 如何制作Java游戏开始画面?