反射和 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 加载程序的反射。
然而,对于一个可以通过在某处显式注册您的类型轻松解决的问题,所有这些看起来确实是一个相当复杂的解决方案。
如何将字节好友生成的 类 与 "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 加载程序的反射。
然而,对于一个可以通过在某处显式注册您的类型轻松解决的问题,所有这些看起来确实是一个相当复杂的解决方案。