【问题标题】:How to create protobuf instances using java reflection?如何使用 java 反射创建 protobuf 实例?
【发布时间】:2016-08-12 20:05:02
【问题描述】:

通常你会像这样创建一个 protobuf 类实例:

Bar.Builder bld = Bar.newBuilder();
bld.setXYZ(...

我有一个使用 Java 反射来实例化 protobuf 类的用例:

Class clsBar = Class.forName("com.xyz.Foo$Bar");
Object instance = clsBar.newInstance(); // error here!
Method mth = clsBar.getMethod(...);

上面的代码适用于普通的 Java 类。但是对于生成的 protobuf 类 "com.xyz.Foo$Bar",它给了我一个 NoSuchMethodException,因为那里没有默认的公共构造函数。

关于如何使用 Java 反射创建 protobuf 实例有什么建议吗?问题是针对那些真正擅长 protobuf 内部的人。谢谢!

【问题讨论】:

  • 如果调用 clsBar.getConstructors() 并在返回的 Constructor 对象之一上调用 .newInstance() 方法会怎样?
  • 您手头有什么信息?只有所需的类或更多?如果你想从一个字节数组或类似的数组中创建一个 Protobuf 实例,你可以使用parseFrom 方法。
  • @Duston 所有的构造函数都是私有的,就像 protobuf 实现一样。对于 dpr,我只有生成的 protobuf 类的全限定类名。
  • 啊,我读到它没有不带参数的公共构造函数。对不起。

标签: java reflection inner-classes protocol-buffers


【解决方案1】:

我认为你应该全力以赴:通过 Builder 类:

//get Bar class
Class barClass = Class.forName("com.xyz.Foo$Bar");

//instantiate Builder through newBuilder method
Method newBuilderMethod = barClass.getMethod("newBuilder");
Bar.Builder builder = (Bar.Builder) newBuilderMethod.invoke(null);

// ... set properties  -- can be through reflection if necessary

//build:
Bar bar = builder.build();

虽然我不完全了解反射在这种情况下有什么用处,但这可能需要更深入地了解您要解决的确切问题。

【讨论】:

  • 你的答案是正确的,但有一个小错误:“newBuilder”方法属于'Bar'类,而不是'Bar$Builder'。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多