Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protocol buffers 如何将自己的代码添加到proto文件中JAVA生成的类中?_Protocol Buffers_Protoc_Protobuf Java - Fatal编程技术网

Protocol buffers 如何将自己的代码添加到proto文件中JAVA生成的类中?

Protocol buffers 如何将自己的代码添加到proto文件中JAVA生成的类中?,protocol-buffers,protoc,protobuf-java,Protocol Buffers,Protoc,Protobuf Java,我使用protobuf,并从下面的proto文件生成JAVA类 syntax = "proto3"; enum Greeting { NONE = 0; MR = 1; MRS = 2; MISS = 3; } message Hello { Greeting greeting = 1; string name = 2; } message Bye { string name = 1; } option java_multiple_f

我使用protobuf,并从下面的proto文件生成JAVA类

syntax = "proto3";
enum Greeting {
    NONE = 0;
    MR = 1;
    MRS = 2;
    MISS = 3;
}

message Hello {
    Greeting greeting = 1;
    string name = 2;
}

message Bye {
    string name = 1;
}

option java_multiple_files = true;
现在我需要向生成的文件中添加一些代码,我发现使用自定义插件()是可能的。我正在尝试用Java生成插件,类似这样的东西

public class Test {
   PluginProtos.CodeGeneratorResponse.getDefaultInstance();
   /* Code to get generated files from java_out and use the insertion points */
   codeGeneratorResponse.writeTo(System.out);
}
然后我就跑

protoc --java_out=./classes --plugin=protoc-gen-demo=my-plugin --demo_out=. example.proto
问题是,在我的
Test.java
main方法中,我不知道如何访问由选项
--java\u out
创建的文件,以便使用它们的插入点。当前默认实例的
CodeGeneratorResponse
为空(无文件)

有人知道如何从--java_中获取
codeneratorresponse
,以便向生成的类添加更多代码吗


提前谢谢。

我最近也在努力解决这个问题,没有找到一个好的答案。我盯着留言里的评论看了一会儿,终于明白了

一开始让我感到不舒服的是,我把插件看作是一条管道,从一个插件输出到下一个插件。但是,每个插件获得完全相同的输入(解析的.proto文件通过
codeneratorrequest
消息表示),并且从插件(包括内置插件)生成的所有代码都被合并到输出文件中。然而,插件可能会修改以前插件的输出,这就是插入点的设计目的

特别是针对您的问题,您将在响应中添加一个
文件
,其中
名称
字段设置为生成的Java文件的名称,
插入点
字段设置为要添加代码的插入点的名称,而
content
字段设置为您希望在该点插入的代码

我发现创建一个简单的插件(在本例中是python)很有帮助。作为一个简单的测试,我修改了那篇文章中的
generate\u code
函数,如下所示:

def generate_code(request, response):
    for proto_file in request.proto_file:
        f = response.file.add()
        f.name = "Test.java"
        f.insertion_point = "outer_class_scope"
        f.content = "// Inserting a comment as a test"
然后我用插件运行protoc:

$ cat test.proto
syntax = "proto3";
message MyMsg {
    int32 num = 1;
}
$ protoc --plugin=protoc-gen-sample=sample_proto_gen.py --java_out=. --sample_out=. test.proto
$ tail -n3 Test.java
  // Inserting a comment as a test
  // @@protoc_insertion_point(outer_class_scope)
}
您的插件只需要是一些可执行文件,它从stdin读取
codeneratorrequest
消息,并将
codeneratorresponse
消息写入stdout,因此当然可以用Java编写。我只是选择了python,因为我对它比较熟悉,并找到了这个简单的示例


作为参考,我编写了基于自定义protobuf选项生成代码的代码。

我制作了一个自定义python插件。 要运行我的插件,我使用以下命令:

protoc--plugin=protoc gen custom=my\u plugin\u executable\u file--custom\u out=./build test.proto


因此,我认为,您必须从.java文件生成一个可执行文件,并在命令中使用它。

您有没有想过这个问题?或者你有没有一个例子来说明你在做什么?哇。这是很难找到的信息。我认为插件链也可以作为管道工作。谢谢!