【问题标题】:Upgrade namespace of protobuf jar without .proto升级没有 .proto 的 protobuf jar 的命名空间
【发布时间】:2016-08-27 21:17:20
【问题描述】:
我有一个 jar myGenerated.jar,它是由某个版本的 Google 协议缓冲区生成的(不确定是哪个版本)。该 jar 包含对命名空间 com.foo.bar 中的类的引用。我想更改它,使类位于命名空间com.baz 中。不幸的是,我没有用于生成 jar 的 .proto 文件——它似乎已经被遗忘了。
有没有办法在没有.proto的情况下更改生成类的命名空间?
或者(因为这很容易导致前面的答案),我可以对现有 jar 中的 .proto 进行逆向工程吗?
【问题讨论】:
标签:
java
jar
namespaces
protocol-buffers
packages
【解决方案1】:
您应该能够使用协议缓冲区反射 API 对原始 .proto 文件内容进行逆向工程。对于您关心的每个消息类型MyMessage,您可以调用MyMessage.getDescriptor(),然后使用here 描述的API 检查描述符以确定存在哪些字段等等。我认为您无法逐字恢复 .proto 文件内容(例如,可能不是 cmets),但您至少可以恢复所有类型及其字段名称和标签号。 MyMessage.getDescriptor().getFile().toProto() 之类的内容应该会为您提供 .proto 文件中仍然可用的所有信息。
【解决方案2】:
使用 dirtyJOE 编辑您的字节码并更改所有包名称(和文件夹,如果在 jar 中分层结构化)。
【解决方案3】:
在google上输入或duckduck go for java反编译器。
这里有一些不错的http://jd.benow.ca/
选择standalone或eclipse插件来获取原始java文件。