Mam do czynienia z wiadomościami Google Protobuf.Wywołanie metody statycznej za pomocą Method.invoke() dało mi NPE
Ponieważ moje potrzeby polegają na ustawieniu pól instancji obiektu (niektóre z nich są komunikatami typu Protobuff), napisałem funkcję, która pobiera za pomocą odbicia konstruktora i poprzez protobuf-java-format odtwarza wiadomość.
Oto kod
for (String aFieldName : objectContentMap.keySet()) {
Object aFieldNameValue = objectContentMap.get(aFieldName);
if (aFieldNameValue != null) {
Field theClassField = this.instance.getField(aFieldName);
ReflectionUtils.makeAccessible(theClassField);
Class<?> classType = theClassField.getType();
if (!classType.isPrimitive() &&
GeneratedMessage.class.isAssignableFrom(classType.getSuperclass())) {
Method method = classType.getMethod("newBuilder");
// Since the method is static, the instance object that undergoes the call is not important, but with "null" I have a NPE...
Object builder = method.invoke(new Object());
if (builder instanceof Builder) {
Builder newBuilder = (Builder)builder;
InputStream asd = new ByteArrayInputStream(((String)aFieldNameValue).getBytes());
protoMapper.merge(asd, newBuilder);
aFieldNameValue = newBuilder.build();
}
}
theClassField.set(recreatedObject, aFieldNameValue);
}
}
Ten fragment działa zgodnie z przeznaczeniem, ale moje wątpliwości, jest w linii Object builder = method.invoke(new Object());
ponieważ gdy zgłoszę metody statyczne Zawsze umieścić null
jako rzeczywistego parametru.
W tym scenariuszu mam wyjątek NullPointerException.
Czy ktoś ma pomysł, dlaczego istnieje potrzeba wystąpienia w invoke() faktycznego parametru?
Dzięki Dario.
Jeśli wywołanie wyrzuca NPE, to metoda nie jest statyczna. Możesz sprawdzić, czy Modifier.isStatic (method.getModifiers()) – Javier
@Javier: Już sprawdziłem modyfikator metody. Kontrola dała mi niestety prawdę. – Dario
moje główne wątpliwości są w części protobuf. Nie mam tak wielkiego doświadczenia w tych generetowanych klasach ... – Dario