用于数据流中反射的类加载器
Classloader for reflection in Dataflow
我需要通过反射(用于序列化目的)将一些 类 加载到 Google 数据流管道中。代码 运行 在本地没问题;但是当我 运行 它远程在 Google 云上时它找不到 类。
我几乎可以肯定他与暂存文件一起使用的类加载器有关。有没有人成功地在 Dataflow 管道中使用反射?
这是我目前尝试过的方法:
Reflections reflections = new Reflections(
ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader()),
ClasspathHelper.forClass(Object.class),
PipelineOptionsFactory.class.getClassLoader(),
ClassLoader.getSystemClassLoader()
);
Set<Class<? extends Event>> events = reflections.getSubTypesOf(Event.class);
我认为这是 Reflections 或您使用它的方式的问题。
所有暂存的 JAR 都应该在 class 路径上可用,而且 Dataflow 不会对 class 加载器做任何棘手的事情。为了验证,我创建了一个简单的测试,它直接使用使用过的 Class.findClass
来加载 class。它不适用于 Object.class.getClassLoader()
,但使用以下任何一项都有效:
ClassLoader.getSystemClassLoader()
Thread.currentThread().getContextClassLoader()
PipelineOptionsFactory.class.getClassLoader()
.
我尝试了一些尝试让 Reflections 发挥作用。我能够通过明确地将其设置为 (1) 加载我的主要 class (SomeClass
) 和 (2) 加载它的所有子类型(使用 SubTypesScanner
)来做到这一点。我使用了以下内容:
Reflections r = new Reflections(new ConfigurationBuilder()
.addClassLoaders(ClassLoader.getSystemClassLoader())
.addUrls(ClasspathHelper.forClass(SomeClass.class))
.addScanners(new SubTypesScanner()));
Set<Class<? extends SomeClass>> set = r.getSubTypesOf(SomeClass.class);
我不确定你想用 Reflections
做什么,我也不完全了解 Reflections 应该如何工作,但它似乎无法找到 classes 在进行扫描时,所以当您请求子类型时它找不到它们。
我需要通过反射(用于序列化目的)将一些 类 加载到 Google 数据流管道中。代码 运行 在本地没问题;但是当我 运行 它远程在 Google 云上时它找不到 类。
我几乎可以肯定他与暂存文件一起使用的类加载器有关。有没有人成功地在 Dataflow 管道中使用反射?
这是我目前尝试过的方法:
Reflections reflections = new Reflections(
ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader()),
ClasspathHelper.forClass(Object.class),
PipelineOptionsFactory.class.getClassLoader(),
ClassLoader.getSystemClassLoader()
);
Set<Class<? extends Event>> events = reflections.getSubTypesOf(Event.class);
我认为这是 Reflections 或您使用它的方式的问题。
所有暂存的 JAR 都应该在 class 路径上可用,而且 Dataflow 不会对 class 加载器做任何棘手的事情。为了验证,我创建了一个简单的测试,它直接使用使用过的 Class.findClass
来加载 class。它不适用于 Object.class.getClassLoader()
,但使用以下任何一项都有效:
ClassLoader.getSystemClassLoader()
Thread.currentThread().getContextClassLoader()
PipelineOptionsFactory.class.getClassLoader()
.
我尝试了一些尝试让 Reflections 发挥作用。我能够通过明确地将其设置为 (1) 加载我的主要 class (SomeClass
) 和 (2) 加载它的所有子类型(使用 SubTypesScanner
)来做到这一点。我使用了以下内容:
Reflections r = new Reflections(new ConfigurationBuilder()
.addClassLoaders(ClassLoader.getSystemClassLoader())
.addUrls(ClasspathHelper.forClass(SomeClass.class))
.addScanners(new SubTypesScanner()));
Set<Class<? extends SomeClass>> set = r.getSubTypesOf(SomeClass.class);
我不确定你想用 Reflections
做什么,我也不完全了解 Reflections 应该如何工作,但它似乎无法找到 classes 在进行扫描时,所以当您请求子类型时它找不到它们。