用于数据流中反射的类加载器

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 在进行扫描时,所以当您请求子类型时它找不到它们。