2013-02-18 9 views
5

ho a che fare con i messaggi di Google protobuf.Metodo statico invocazione via Method.invoke() mi ha dato NPE

Dato che i miei bisogni sono per impostare i campi di un oggetto (alcuni di loro sono messaggi Protobuff) esempio, ho scritto una funzione che recupera attraverso la riflessione e il costruttore attraverso il protobuf-java-format ricrea il messaggio.

Ecco il codice

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

Questo frammento di codice funziona come previsto, ma il mio dubbio è nella linea Object builder = method.invoke(new Object()); da quando io chiamo i metodi statici che ho sempre messo null come parametro attuale.

In questo scenario ho un NullPointerException.

avere qualcuno qualche idea del perché non v'è la necessità di un esempio nel invoke() parametro effettivo?

Grazie Dario.

+0

Se invoke getta NPE, allora il metodo non è statico. Si consiglia di verificare se Modifier.isStatic (method.getModifiers()) – Javier

+0

@Javier: Ho già verificare il metodo di modifica. Il controllo mi ha dato purtroppo vero. – Dario

+0

i miei dubbi principali sono nella parte protobuf. Non ho tanta esperienza in queste classi genereted ... – Dario

risposta

0

Javadoc per il metodo dice il metodo di firma Method.invoke è:
"Invoke (Object obj, oggetto ... args)"
Si dice anche:
"Se il metodo sottostante è statico, allora l'argomento obj specificato viene ignorato e può essere nullo. "

Questo significa che il metodo di base non è statico. Comunque stai controllando per vedere se è statico, non è corretto.