Я не хочу отвечать на мой вопрос, но не могу поверить, что я единственный, кто столкнулся с этой проблемой.Документирование решения здесь на случай, если другие люди также начинают работать с protobuf и java.Использование рефлексии позволяет сэкономить на записи десятки методов получения и установки.
Хорошо, мне удалось заставить его работать, используя пример тестового кода, поставляемого с 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 ;
}