/ / Statické vyvolanie metódy cez Method.invoke () mi dalo NPE - java, odraz, protokolové buffery

Statické vyvolanie metódy pomocou Method.invoke () mi dalo NPE - java, odraz, protokolové vyrovnávače

Zaoberám sa správami služby Protobuf Google.

Pretože je mojou potrebou nastaviť pole inštancie objektu (niektoré z nich sú správy Protobuff), napísal som funkciu, ktorá sa načíta prostredníctvom odrazu staviteľa a prostredníctvom Protobuf-java-formát obnoví správu.

Tu je kód

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);
}
}

Tento úryvok funguje podľa plánu, ale pochybujem o ňom Object builder = method.invoke(new Object()); linka, pretože keď volám statické metódy, vždy som dal null ako skutočný parameter.

V tomto scenári som NullPointerException.

Máte niekoho predstavu, prečo je v skutočnom parametri invoke () potrebná inštancia?

Vďaka Dario.

odpovede:

0 pre odpoveď č. 1

Javadoc pre metódu hovorí, že podpis metódy Method.invoke je:
"invoke (Object obj, Object ... args)"
Tiež hovorí:
"Ak je základná metóda statická, zadaný argument obj sa ignoruje. Môže to byť null."

To znamená, že vaša základná metóda NIE je statická. Kontrolujete však, či je statický, či nie je správny.