思考和ByteBuddy

时间:2017-05-03 06:54:16

标签: java byte-buddy

如何在“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());
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

然而,所有这些对于一个问题来说似乎是一个非常复杂的解决方案,可以通过明确地在某处注册您的类型来轻松解决。