java - 如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象?

标签 java reflection protocol-buffers

通常我可以在两个具有相同属性名称的 java bean 之间复制值,使用 BeanUtils 和 java 反射,例如PropertyUtils.setProperty(....)

在 protobuf Message 中,我们使用消息生成器类来设置值。这可行,但我宁愿使用反射自动将属性从 bean 复制到消息,因为两者具有相同的属性名称和类型。

当我在构建器对象(从 message.newBuilder() 获取)上调用 PropertyUtils.setProperty 时,我收到此消息。

java.lang.NoSuchMethodException: 属性 'testProp' 在类 'class teststuff.TestBeanProtos$TestBeanMessage$Builder' 中没有 setter 方法

如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象(反之亦然)?

最佳答案

我不想回答我的问题,但我不敢相信我是唯一遇到这个问题的人。在此处记录解决方案,以防其他人也开始使用 protobuf 和 java。使用反射可以节省大量的 getter 和 setter。

好的,我设法使用 protobuf 附带的一些示例测试代码让它工作。这是一个非常简单的用例;通常,消息会复杂得多。此代码不处理嵌套消息或重复消息。

public static void setMessageBuilder(com.google.protobuf.GeneratedMessage.Builder message,Descriptors.Descriptor descriptor,Object srcObject) throws Exception {
    String cname = srcObject.getClass().getName();
    /*BeanMapper.getSimpleProperties -- this is a warpper method that gets the list of property names*/ 
    List<String> simpleProps = BeanMapper.getSimpleProperties(srcObject.getClass());

    Map map = new HashMap();
    for (String pName : simpleProps) {
        System.out.println(" processing property "+ pName);
        Object value= PropertyUtils.getProperty(srcObject, pName);
        if(value==null) continue;

        Descriptors.FieldDescriptor fd=descriptor.findFieldByName(pName) ;

        System.out.println(" property "+  pName+" , found fd :"+ (fd==null ? "nul":"ok"));
         message.setField(fd, value);
         System.out.println(" property "+  pName+"  set ok,");

    }
    return ;
}

关于java - 如何使用 java 反射自动将值从 java bean 复制到 protobuf 消息对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053691/

相关文章:

java - Constructor.newInstance 与 Class.newInstance 与 SecurityManager

go - 如何使用 protobuf 二进制文件在 PUB/SUB ( ZeroMQ ) 中进行过滤?

protocol-buffers - Apache Thrift 和 Google Protocol Buffer 有什么用途?

java - 替换带有反斜杠的变量

java - 给定一个 ParameterizedType,我如何创建这种类型的实例?

java - 如何以编程方式强制 JVM 重新读取操作系统键映射?

java - 如何通过反射确定方法是否返回 'void'

c# - 制作 list 的最简单方法

java - Android/Blackberry10 通话信息不显示

java - 如何实现请求回复模式