如何在“org.reflections”中使用byte-buddy生成的类?
示例:
Class<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.name("de.testing.SomeClass")
.method(ElementMatchers.named("toString"))
.intercept(FixedValue.value("Hello World!"))
.make()
.load(getClass().getClassLoader(),ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
现在我想使用org.reflections来查找特定包中Object的所有子类型:
Reflections reflections = new Reflections("de.testing");
Set<Class<? extends Object>> objs = reflections.getSubTypesOf(Object.class);
for (Class clazz : objs ) {
log.info("{}",clazz.getName());
}
有什么想法吗?
答案 0 :(得分:1)
正如评论中所建议的,反射通过查询类加载器的资源来扫描类路径。这通常只适用于标准类加载器,而Byte Buddy在内存中创建使用资源扫描找不到它们的类。
您可以通过将Byte Buddy的类存储在jar文件中并使用URLClassLoader
手动加载此jar文件来解决此问题。 Byte Buddy允许您通过.make().toJar( ... )
创建一个jar。然后,您可以将此类加载器提供给反射,默认情况下只反映扫描系统类加载器。
然而,所有这些对于一个问题来说似乎是一个非常复杂的解决方案,可以通过明确地在某处注册您的类型来轻松解决。