反射和 ByteBuddy

Reflections and ByteBuddy

如何将字节好友生成的 类 与 "org.reflections" 一起使用?

示例:

    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 查找特定包内对象的所有子类型:

Reflections reflections = new Reflections("de.testing");
    Set<Class<? extends Object>> objs = reflections.getSubTypesOf(Object.class);
    for (Class clazz : objs ) {
        log.info("{}",clazz.getName());
    }

有什么想法吗?

正如评论中所建议的,反射通过查询 class 加载程序的资源来扫描 class 路径。这通常只适用于标准 class 加载程序,而 Byte Buddy 在使用资源扫描找不到它们的内存中创建 classes。

您可以通过将 Byte Buddy 的 classes 存储在 jar 文件中并使用 URLClassLoader 手动加载此 jar 文件来解决此问题。 Byte Buddy 允许您通过 .make().toJar( ... ) 创建一个 jar。然后,您可以将此 class 加载程序提供给默认情况下仅扫描系统 class 加载程序的反射。

然而,对于一个可以通过在某处显式注册您的类型轻松解决的问题,所有这些看起来确实是一个相当复杂的解决方案。