Java协议缓冲区 - 反射

5

我对协议缓冲区和反射方法不熟悉。我在C++中看到了一个名为GetReflection()的方法,用于获取反射接口,但是在Java中找不到类似的方法。有人知道如何在Java中获取反射接口吗?

3个回答

9
Java中对应Protobuf-C ++“反射”接口的是com.google.protobuf.Message接口。所有消息对象都实现了该接口,它有像getField()这样的方法,可以通过描述符读取任意字段。同样,所有构建器都实现了Message.Builder,其中包含setField()等方法。与C++不同的是,此功能没有委派给单独的对象。

1

你能描述一下为什么要做这件事吗?我知道后,会根据您的需求提供答案。

  • 如其他人所述,您可以在Java中使用反射(reflection)来查看任何类。
  • Java版本提供了DynamicMessage Class。根据您的需求,您可能会发现DynamicMessage Class是您需要的内容。该类允许您使用Proto-Descriptor读取任意协议缓冲区,并通过getField方法等访问字段。您将需要Proto-Descriptor的协议缓冲区(您可以使用protoc命令的--descriptor_set_out=参数获取它)。
  • 如果您不针对速度进行优化,则protoc命令将生成使用反射的类。

谢谢,布鲁斯。我查看了一些协议缓冲区的C++代码,并找到了一些方法,例如GetReflection()。然而,在Java中我找不到类似的东西。也许有另一种方式或一组方法可以在Java中完成这个反射操作?更具体地说,我正在尝试获取Java中非常相似的方法 :) 这样能说明我正在努力弄清楚什么吗? :) - pree
另外,我知道标准的Java提供了反射机制,但是我正在尝试使用协议缓冲区中的反射机制。例如,在C++中我们有protobuf.Message.Reflection。但是我在Java中找不到它。 - pree

-5

反射接口可以在反射包中找到。通常情况下,我们可以通过使用Class实例来访问该接口。

public static void main(String[] $)
{
    Class clazz = String.class;
    System.out.println(clazz.getName()); // "java.lang.String"
}

这个问题不是关于Java反射,而是关于协议缓冲区反射。 - Jaromir Hamala
这个答案不在问题范围内。 - Jiacai Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接