2013-02-18 13 views
5

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.

+0

Jeśli wywołanie wyrzuca NPE, to metoda nie jest statyczna. Możesz sprawdzić, czy Modifier.isStatic (method.getModifiers()) – Javier

+0

@Javier: Już sprawdziłem modyfikator metody. Kontrola dała mi niestety prawdę. – Dario

+0

moje główne wątpliwości są w części protobuf. Nie mam tak wielkiego doświadczenia w tych generetowanych klasach ... – Dario

Odpowiedz

0

Javadoc dla metody mówi, że metoda jest podpis Method.invoke:
"powołać (Object obj, Object ... args)"
mówi również:
„Jeśli metoda bazowy jest statyczny, a następnie podany argument obj jest ignorowany. Może mieć wartość zerową. "

Oznacza to, że podstawowa metoda NIE jest statyczna. Jednak sprawdzasz, czy jest statyczny, czy nie jest poprawny.

Powiązane problemy